/[projects]/android/TrainInfo/src/dk/thoerup/traininfo/provider/XmlDepartureProvider.java
ViewVC logotype

Annotation of /android/TrainInfo/src/dk/thoerup/traininfo/provider/XmlDepartureProvider.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 981 - (hide annotations) (download)
Sat Jul 10 16:03:10 2010 UTC (13 years, 10 months ago) by torben
File size: 4301 byte(s)
add support for parsing notification messages from departure xml docs
1 torben 237 package dk.thoerup.traininfo.provider;
2    
3     import java.io.StringReader;
4    
5     import javax.xml.parsers.SAXParser;
6     import javax.xml.parsers.SAXParserFactory;
7    
8     import org.xml.sax.Attributes;
9     import org.xml.sax.InputSource;
10     import org.xml.sax.SAXException;
11     import org.xml.sax.XMLReader;
12     import org.xml.sax.helpers.DefaultHandler;
13    
14     import android.util.Log;
15     import dk.thoerup.traininfo.DepartureBean;
16 torben 981 import dk.thoerup.traininfo.DepartureEntry;
17 torben 390 import dk.thoerup.traininfo.util.AndroidTimeoutCache;
18 torben 238 import dk.thoerup.traininfo.util.DownloadUtil;
19 torben 357 import dk.thoerup.traininfo.util.XmlUtil;
20 torben 237
21     public class XmlDepartureProvider extends DefaultHandler implements DepartureProvider {
22    
23 torben 390 final static int CACHE_TIMEOUT = 60*1000;
24 torben 391
25 torben 237
26 torben 981 AndroidTimeoutCache<String,DepartureBean> departureCache = new AndroidTimeoutCache<String,DepartureBean>(CACHE_TIMEOUT);
27 torben 390
28 torben 981 DepartureBean departures;
29 torben 319
30    
31 torben 981 DepartureEntry tempDeparture;
32 torben 237 StringBuilder builder = new StringBuilder(512);
33    
34     @Override
35 torben 835 public boolean lookupDepartures(int stationID, boolean arrival) {
36 torben 319 boolean success;
37 torben 390
38 torben 835 String key = "" + stationID + ":" + arrival;
39    
40     departures = departureCache.get(key);
41 torben 319
42 torben 390 if (departures == null) {
43 torben 835 success = lookupDeparturesWorker(stationID, arrival);
44 torben 319
45 torben 390 if (success) {
46 torben 835 departureCache.put(key, departures);
47 torben 390 }
48 torben 319
49     } else {
50     Log.i("XmlDepartureProvider", "cache hit !!!");
51     success = true;
52     }
53    
54     return success;
55     }
56    
57 torben 835 private boolean lookupDeparturesWorker(int stationID, boolean arrival) {
58 torben 319 boolean success = false;
59 torben 981 departures = new DepartureBean();
60 torben 237 try
61 torben 294 {
62 torben 835 int iArrival = arrival ? 1 : 0;
63     String url = XmlUtil.SERVICE_BASE + "/DepartureServlet?format=xml&station=" + stationID + "&arrival=" + iArrival;
64 torben 294 Log.i("xmlurl",url);
65 torben 283 String doc = DownloadUtil.getContentString(url, 45000, "ISO-8859-1");
66 torben 237
67     InputSource source = new InputSource( new StringReader(doc));
68    
69     SAXParserFactory spf = SAXParserFactory.newInstance();
70     SAXParser sp = spf.newSAXParser();
71     XMLReader xr = sp.getXMLReader();
72    
73     xr.setContentHandler(this);
74     xr.setErrorHandler(this);
75     xr.parse(source);
76 torben 319 success = true;
77    
78 torben 237 } catch (Exception e) {
79     Log.e("XmlDepartureProvider", "looupFunction", e);
80     }
81 torben 319 return success;
82 torben 237 }
83    
84     @Override
85 torben 981 public DepartureBean getDepartures(int station,boolean arrival) {
86 torben 319
87 torben 835 String key = "" + station + ":" + arrival;
88    
89 torben 981 DepartureBean bean = departureCache.get(key);
90 torben 835
91 torben 981 if (bean == null) {
92     bean = new DepartureBean();
93 torben 390 }
94 torben 319
95 torben 981 return bean;
96 torben 237 }
97    
98     // this can be called several times fore the same text-node if there are many chardata / lines
99     @Override
100     public void characters (char ch[], int start, int length)
101     {
102     for (int i= start; i<start+length; i++)
103     builder.append(ch[i]);
104     }
105    
106     @Override
107     public void startElement (String uri, String name, String qName, Attributes atts)throws SAXException
108     {
109     if (name.equalsIgnoreCase("train"))
110 torben 981 tempDeparture = new DepartureEntry();
111 torben 237
112     builder.setLength(0); //reset StringBuilder
113     }
114    
115     @Override
116     public void endElement (String uri, String name, String qName) throws SAXException
117     {
118 torben 981 if (name.equals("train")) {
119     departures.entries.add( tempDeparture );
120 torben 237 } else if (name.equals("time")) {
121 torben 244 tempDeparture.setTime(builder.toString().trim());
122 torben 237 } else if (name.equals("updated")) {
123 torben 244 tempDeparture.setLastUpdate(builder.toString().trim());
124 torben 237 } else if (name.equals("trainnumber")) {
125 torben 244 tempDeparture.setTrainNumber(builder.toString().trim());
126 torben 237 } else if (name.equals("destination")) {
127 torben 244 tempDeparture.setDestination(builder.toString().trim());
128 torben 237 } else if (name.equals("origin")) {
129 torben 244 tempDeparture.setOrigin(builder.toString().trim());
130 torben 237 } else if (name.equals("location")) {
131 torben 244 tempDeparture.setLocation(builder.toString().trim());
132 torben 237 } else if (name.equals("status")) {
133 torben 244 tempDeparture.setStatus(builder.toString().trim());
134 torben 237 } else if (name.equals("note")) {
135 torben 244 tempDeparture.setNote(builder.toString().trim());
136 torben 699 } else if (name.equals("type")) {
137     tempDeparture.setType(builder.toString().trim());
138 torben 981 } else if (name.equals("notification")) {
139     departures.notifications.add( builder.toString().trim() );
140 torben 699 }
141 torben 237 }
142     }

  ViewVC Help
Powered by ViewVC 1.1.20