/[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 320 by torben, Sat Sep 12 12:33:24 2009 UTC revision 1066 by torben, Thu Sep 16 15:32:42 2010 UTC
# Line 1  Line 1 
1  package dk.thoerup.traininfo.provider;  package dk.thoerup.traininfo.provider;
2    
3  import java.io.StringReader;  
4  import java.util.ArrayList;  
5  import java.util.Collections;  import org.simpleframework.xml.Serializer;
6  import java.util.HashMap;  import org.simpleframework.xml.core.Persister;
7  import java.util.List;  
   
 import javax.xml.parsers.SAXParser;  
 import javax.xml.parsers.SAXParserFactory;  
   
 import org.xml.sax.Attributes;  
 import org.xml.sax.InputSource;  
 import org.xml.sax.SAXException;  
 import org.xml.sax.XMLReader;  
 import org.xml.sax.helpers.DefaultHandler;  
8    
9  import android.util.Log;  import android.util.Log;
10  import dk.thoerup.traininfo.DepartureBean;  import dk.thoerup.android.traininfo.common.DepartureBean;
11    import dk.thoerup.android.traininfo.common.DepartureEntry;
12    import dk.thoerup.traininfo.util.AndroidTimeoutCache;
13  import dk.thoerup.traininfo.util.DownloadUtil;  import dk.thoerup.traininfo.util.DownloadUtil;
14    import dk.thoerup.traininfo.util.XmlUtil;
15    
16  public class XmlDepartureProvider extends DefaultHandler implements DepartureProvider {  public class XmlDepartureProvider implements DepartureProvider {
17    
18          final static long CACHE_TIMEOUT = 60*1000;          final static int CACHE_TIMEOUT = 60*1000;
19                    
20                    
21          class CacheEntry {          AndroidTimeoutCache<String,DepartureBean> departureCache = new AndroidTimeoutCache<String,DepartureBean>(CACHE_TIMEOUT);
                 public long timestamp;  
                 public List<DepartureBean> departures;  
         }  
22                    
         HashMap<Integer, CacheEntry> departureCache = new HashMap<Integer,CacheEntry>();          
         ArrayList<DepartureBean> departures;  
23                                    
24                    
25          DepartureBean tempDeparture;          DepartureEntry tempDeparture;
26          StringBuilder builder = new StringBuilder(512);          StringBuilder builder = new StringBuilder(512);
27                    
28    
29            
30          @Override          @Override
31          public boolean lookupDepartures(int stationID) {          public DepartureBean lookupDepartures(int stationID, boolean arrival) {        
32                  CacheEntry entry = departureCache.get(stationID);                  
33                  boolean success;                  String key = "" + stationID + ":" + arrival;
34                    
35                    DepartureBean departures = departureCache.get(key);
36                    
37                  long now = android.os.SystemClock.elapsedRealtime();                  if (departures == null) {                      
38                  if (entry == null || (entry.timestamp+CACHE_TIMEOUT) < now) {                          departures = lookupDeparturesWorker(stationID, arrival);
                           
                         success = lookupDeparturesWorker(stationID);  
39                                                    
40                          if (success) {                          if (departures != null) {                      
41                                  entry = new CacheEntry();                                  departureCache.put(key, departures);
                                 entry.timestamp = android.os.SystemClock.elapsedRealtime();  
                                 entry.departures = departures;  
                           
                                 departureCache.put(stationID, entry);  
42                          }                          }
43                            
44                  } else {                  } else {
45                          Log.i("XmlDepartureProvider", "cache hit !!!");                          Log.i("XmlDepartureProvider", "cache hit !!!");
                         success = true;  
46                  }                                }              
47                                    
48                  return success;                  return departures;
49          }          }
50                    
51          private boolean lookupDeparturesWorker(int stationID) {          private DepartureBean lookupDeparturesWorker(int stationID, boolean arrival) {
52                  boolean success = false;  
                 departures = new ArrayList<DepartureBean>();  
53                  try                  try
54                  {                        {      
55                          //String url = "http://t-hoerup.dk/tog/xml_display.php?stationcode="+stationCode;                          int iArrival = arrival ? 1 : 0;
56                          String url = "http://app.t-hoerup.dk/TrainInfoService/DepartureServlet?format=xml&station=" + stationID;                          String url = XmlUtil.SERVICE_BASE + "/DepartureServlet?format=xml&station=" + stationID + "&arrival=" + iArrival;
57                          Log.i("xmlurl",url);                          Log.i("xmlurl",url);
58                          String doc =  DownloadUtil.getContentString(url, 45000, "ISO-8859-1");                          String doc =  DownloadUtil.getContentString(url, 30000, "ISO-8859-1");
59    
60                            Serializer serializer = new Persister();
61    
62                            DepartureBean departures = serializer.read(DepartureBean.class, doc);
63                            
64                                                    
65                          InputSource source = new InputSource( new StringReader(doc));                          return departures;
66                                                    
                         SAXParserFactory spf = SAXParserFactory.newInstance();  
             SAXParser sp = spf.newSAXParser();  
             XMLReader xr = sp.getXMLReader();  
   
                         xr.setContentHandler(this);  
                         xr.setErrorHandler(this);  
                         xr.parse(source);  
                         success = true;  
67                                                    
68                  } catch (Exception e) {                  } catch (Exception e) {
69                          Log.e("XmlDepartureProvider", "looupFunction", e);                          Log.e("XmlDepartureProvider", "looupFunction", e);
70                  }                          return null;
71                  return success;                  }              
         }  
           
         @Override  
         public List<DepartureBean> getDepartures(int station) {  
                 CacheEntry entry = departureCache.get(station);  
                   
                 if (entry != null) {                      
                         return entry.departures;  
                 } else {  
                         return new ArrayList<DepartureBean>();  
                 }  
                   
         }  
           
         // this can be called several times fore the same text-node if there are many chardata / lines  
         @Override  
         public void characters (char ch[], int start, int length)  
         {                
                 for (int i= start; i<start+length; i++)  
                         builder.append(ch[i]);    
         }  
           
         @Override  
         public void startElement (String uri, String name, String qName, Attributes atts)throws SAXException  
         {  
                 if (name.equalsIgnoreCase("train"))  
                         tempDeparture = new DepartureBean();  
                   
                 builder.setLength(0); //reset StringBuilder  
72          }          }
73                    
         @Override  
         public void endElement (String uri, String name, String qName) throws SAXException  
         {  
                 if (name.equals("train")) {  
                         departures.add( tempDeparture );  
                 } else if (name.equals("time")) {  
                         tempDeparture.setTime(builder.toString().trim());  
                 } else if (name.equals("updated")) {  
                         tempDeparture.setLastUpdate(builder.toString().trim());  
                 } else if (name.equals("trainnumber")) {  
                         tempDeparture.setTrainNumber(builder.toString().trim());  
                 } else if (name.equals("destination")) {  
                         tempDeparture.setDestination(builder.toString().trim());  
                 } else if (name.equals("origin")) {  
                         tempDeparture.setOrigin(builder.toString().trim());  
                 } else if (name.equals("location")) {  
                         tempDeparture.setLocation(builder.toString().trim());  
                 } else if (name.equals("status")) {  
                         tempDeparture.setStatus(builder.toString().trim());  
                 } else if (name.equals("note")) {  
                         tempDeparture.setNote(builder.toString().trim());  
                 }  
         }  
74  }  }

Legend:
Removed from v.320  
changed lines
  Added in v.1066

  ViewVC Help
Powered by ViewVC 1.1.20