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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 981 - (show 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 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 import dk.thoerup.traininfo.DepartureEntry;
17 import dk.thoerup.traininfo.util.AndroidTimeoutCache;
18 import dk.thoerup.traininfo.util.DownloadUtil;
19 import dk.thoerup.traininfo.util.XmlUtil;
20
21 public class XmlDepartureProvider extends DefaultHandler implements DepartureProvider {
22
23 final static int CACHE_TIMEOUT = 60*1000;
24
25
26 AndroidTimeoutCache<String,DepartureBean> departureCache = new AndroidTimeoutCache<String,DepartureBean>(CACHE_TIMEOUT);
27
28 DepartureBean departures;
29
30
31 DepartureEntry tempDeparture;
32 StringBuilder builder = new StringBuilder(512);
33
34 @Override
35 public boolean lookupDepartures(int stationID, boolean arrival) {
36 boolean success;
37
38 String key = "" + stationID + ":" + arrival;
39
40 departures = departureCache.get(key);
41
42 if (departures == null) {
43 success = lookupDeparturesWorker(stationID, arrival);
44
45 if (success) {
46 departureCache.put(key, departures);
47 }
48
49 } else {
50 Log.i("XmlDepartureProvider", "cache hit !!!");
51 success = true;
52 }
53
54 return success;
55 }
56
57 private boolean lookupDeparturesWorker(int stationID, boolean arrival) {
58 boolean success = false;
59 departures = new DepartureBean();
60 try
61 {
62 int iArrival = arrival ? 1 : 0;
63 String url = XmlUtil.SERVICE_BASE + "/DepartureServlet?format=xml&station=" + stationID + "&arrival=" + iArrival;
64 Log.i("xmlurl",url);
65 String doc = DownloadUtil.getContentString(url, 45000, "ISO-8859-1");
66
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 success = true;
77
78 } catch (Exception e) {
79 Log.e("XmlDepartureProvider", "looupFunction", e);
80 }
81 return success;
82 }
83
84 @Override
85 public DepartureBean getDepartures(int station,boolean arrival) {
86
87 String key = "" + station + ":" + arrival;
88
89 DepartureBean bean = departureCache.get(key);
90
91 if (bean == null) {
92 bean = new DepartureBean();
93 }
94
95 return bean;
96 }
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 tempDeparture = new DepartureEntry();
111
112 builder.setLength(0); //reset StringBuilder
113 }
114
115 @Override
116 public void endElement (String uri, String name, String qName) throws SAXException
117 {
118 if (name.equals("train")) {
119 departures.entries.add( tempDeparture );
120 } else if (name.equals("time")) {
121 tempDeparture.setTime(builder.toString().trim());
122 } else if (name.equals("updated")) {
123 tempDeparture.setLastUpdate(builder.toString().trim());
124 } else if (name.equals("trainnumber")) {
125 tempDeparture.setTrainNumber(builder.toString().trim());
126 } else if (name.equals("destination")) {
127 tempDeparture.setDestination(builder.toString().trim());
128 } else if (name.equals("origin")) {
129 tempDeparture.setOrigin(builder.toString().trim());
130 } else if (name.equals("location")) {
131 tempDeparture.setLocation(builder.toString().trim());
132 } else if (name.equals("status")) {
133 tempDeparture.setStatus(builder.toString().trim());
134 } else if (name.equals("note")) {
135 tempDeparture.setNote(builder.toString().trim());
136 } else if (name.equals("type")) {
137 tempDeparture.setType(builder.toString().trim());
138 } else if (name.equals("notification")) {
139 departures.notifications.add( builder.toString().trim() );
140 }
141 }
142 }

  ViewVC Help
Powered by ViewVC 1.1.20