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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 237 by torben, Sat Aug 8 19:02:20 2009 UTC revision 981 by torben, Sat Jul 10 16:03:10 2010 UTC
# Line 1  Line 1 
1  package dk.thoerup.traininfo.provider;  package dk.thoerup.traininfo.provider;
2    
 import java.io.BufferedReader;  
 import java.io.IOException;  
 import java.io.InputStream;  
 import java.io.InputStreamReader;  
3  import java.io.StringReader;  import java.io.StringReader;
 import java.net.URL;  
 import java.net.URLConnection;  
 import java.util.ArrayList;  
 import java.util.List;  
4    
5  import javax.xml.parsers.SAXParser;  import javax.xml.parsers.SAXParser;
6  import javax.xml.parsers.SAXParserFactory;  import javax.xml.parsers.SAXParserFactory;
# Line 21  import org.xml.sax.helpers.DefaultHandle Line 13  import org.xml.sax.helpers.DefaultHandle
13    
14  import android.util.Log;  import android.util.Log;
15  import dk.thoerup.traininfo.DepartureBean;  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 {  public class XmlDepartureProvider extends DefaultHandler implements DepartureProvider {
22    
23          ArrayList<DepartureBean> departures = new ArrayList<DepartureBean>();          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          DepartureBean tempDeparture;          DepartureEntry tempDeparture;
32          StringBuilder builder = new StringBuilder(512);          StringBuilder builder = new StringBuilder(512);
33                    
34          @Override          @Override
35          public void lookupDepartures(String station) {          public boolean lookupDepartures(int stationID, boolean arrival) {              
36                  departures.clear();                  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                  try
61                  {                        {      
62                          String doc = getUrlContents("http://t-hoerup.dk/tog/xml_display.php?stationname="+station);                          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));                          InputSource source = new InputSource( new StringReader(doc));
68                                                    
# Line 45  public class XmlDepartureProvider extend Line 72  public class XmlDepartureProvider extend
72    
73                          xr.setContentHandler(this);                          xr.setContentHandler(this);
74                          xr.setErrorHandler(this);                          xr.setErrorHandler(this);
                         xr.setDTDHandler(this);  
75                          xr.parse(source);                          xr.parse(source);
76                            success = true;
77                            
78                  } catch (Exception e) {                  } catch (Exception e) {
79                          Log.e("XmlDepartureProvider", "looupFunction", e);                          Log.e("XmlDepartureProvider", "looupFunction", e);
80                  }                  }
81                    return success;
82          }          }
83                    
84          @Override          @Override
85          public List<DepartureBean> getDepartures() {          public DepartureBean getDepartures(int station,boolean arrival) {
86                  return departures;                  
87          }                  String key = "" + station + ":" + arrival;
88                    
89          private String getUrlContents(String uri) throws IOException                  DepartureBean bean = departureCache.get(key);
90          {                  
91                  URL url = new URL(uri);                          if (bean == null) {                    
92                  URLConnection conn = url.openConnection();                          bean = new DepartureBean();
93                  conn.setConnectTimeout(5000);                  }
94                  InputStream stream = conn.getInputStream();                  
95                    return bean;
                 BufferedReader in = new BufferedReader(new InputStreamReader(stream, "ISO-8859-1"),8192);  
   
                 StringBuilder sbuilder = new StringBuilder();  
   
                 String line;  
                 while ( (line = in.readLine()) != null) {  
                         sbuilder.append(line);  
                         sbuilder.append("\r\n");  
                 }  
   
                 return sbuilder.toString();  
96          }          }
97                    
98          // this can be called several times fore the same text-node if there are many chardata / lines          // this can be called several times fore the same text-node if there are many chardata / lines
# Line 89  public class XmlDepartureProvider extend Line 107  public class XmlDepartureProvider extend
107          public void startElement (String uri, String name, String qName, Attributes atts)throws SAXException          public void startElement (String uri, String name, String qName, Attributes atts)throws SAXException
108          {          {
109                  if (name.equalsIgnoreCase("train"))                  if (name.equalsIgnoreCase("train"))
110                          tempDeparture = new DepartureBean();                          tempDeparture = new DepartureEntry();
111                                    
112                  builder.setLength(0); //reset StringBuilder                  builder.setLength(0); //reset StringBuilder
113          }          }
# Line 97  public class XmlDepartureProvider extend Line 115  public class XmlDepartureProvider extend
115          @Override          @Override
116          public void endElement (String uri, String name, String qName) throws SAXException          public void endElement (String uri, String name, String qName) throws SAXException
117          {          {
118                  if (name.equals("train")) {                  if (name.equals("train")) {                    
119                          departures.add( tempDeparture );                          departures.entries.add( tempDeparture );
120                  } else if (name.equals("time")) {                  } else if (name.equals("time")) {
121                          tempDeparture.setTime(builder.toString());                          tempDeparture.setTime(builder.toString().trim());
122                  } else if (name.equals("updated")) {                  } else if (name.equals("updated")) {
123                          tempDeparture.setLastUpdate(builder.toString());                          tempDeparture.setLastUpdate(builder.toString().trim());
124                  } else if (name.equals("trainnumber")) {                  } else if (name.equals("trainnumber")) {
125                          tempDeparture.setTrainNumber(builder.toString());                          tempDeparture.setTrainNumber(builder.toString().trim());
126                  } else if (name.equals("destination")) {                  } else if (name.equals("destination")) {
127                          tempDeparture.setDestination(builder.toString());                          tempDeparture.setDestination(builder.toString().trim());
128                  } else if (name.equals("origin")) {                  } else if (name.equals("origin")) {
129                          tempDeparture.setOrigin(builder.toString());                          tempDeparture.setOrigin(builder.toString().trim());
130                  } else if (name.equals("location")) {                  } else if (name.equals("location")) {
131                          tempDeparture.setLocation(builder.toString());                          tempDeparture.setLocation(builder.toString().trim());
132                  } else if (name.equals("status")) {                  } else if (name.equals("status")) {
133                          tempDeparture.setStatus(builder.toString());                          tempDeparture.setStatus(builder.toString().trim());
134                  } else if (name.equals("note")) {                  } else if (name.equals("note")) {
135                          tempDeparture.setNote(builder.toString());                          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  }  }

Legend:
Removed from v.237  
changed lines
  Added in v.981

  ViewVC Help
Powered by ViewVC 1.1.20