/[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 238 by torben, Sat Aug 8 20:09:47 2009 UTC revision 1024 by torben, Tue Aug 31 05:44:45 2010 UTC
# Line 1  Line 1 
1  package dk.thoerup.traininfo.provider;  package dk.thoerup.traininfo.provider;
2    
3  import java.io.StringReader;  import java.io.StringReader;
 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 15  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;  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 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                    
29                    
30          DepartureBean tempDeparture;          DepartureEntry tempDeparture;
31          StringBuilder builder = new StringBuilder(512);          StringBuilder builder = new StringBuilder(512);
32                    
33    
34            
35          @Override          @Override
36          public void lookupDepartures(String station) {          public DepartureBean lookupDepartures(int stationID, boolean arrival) {        
37                  departures.clear();                  
38                    String key = "" + stationID + ":" + arrival;
39                    
40                    DepartureBean departures = departureCache.get(key);
41            
42                    if (departures == null) {                      
43                            departures = lookupDeparturesWorker(stationID, arrival);
44                            
45                            if (departures != null) {                      
46                                    departureCache.put(key, departures);
47                            }
48                            
49                    } else {
50                            Log.i("XmlDepartureProvider", "cache hit !!!");
51                    }              
52                    
53                    return departures;
54            }
55            
56            private DepartureBean lookupDeparturesWorker(int stationID, boolean arrival) {
57    
58                  try                  try
59                  {       String url = "http://t-hoerup.dk/tog/xml_display.php?stationname="+station;                  {      
60                          String doc =  DownloadUtil.getContent(url, 30000, "ISO-8859-1");                          int iArrival = arrival ? 1 : 0;
61                            String url = XmlUtil.SERVICE_BASE + "/DepartureServlet?format=xml&station=" + stationID + "&arrival=" + iArrival;
62                            Log.i("xmlurl",url);
63                            String doc =  DownloadUtil.getContentString(url, 45000, "ISO-8859-1");
64                                                    
65                          InputSource source = new InputSource( new StringReader(doc));                          InputSource source = new InputSource( new StringReader(doc));
66                                                    
# Line 38  public class XmlDepartureProvider extend Line 68  public class XmlDepartureProvider extend
68              SAXParser sp = spf.newSAXParser();              SAXParser sp = spf.newSAXParser();
69              XMLReader xr = sp.getXMLReader();              XMLReader xr = sp.getXMLReader();
70    
71                          xr.setContentHandler(this);              DepartureParser departureParser = new DepartureParser();
72                          xr.setErrorHandler(this);                          xr.setContentHandler(departureParser);
73                          xr.setDTDHandler(this);                          xr.setErrorHandler(departureParser);
74                          xr.parse(source);                          xr.parse(source);
75                            
76                            return departureParser.getDepartures();
77                            
78                  } catch (Exception e) {                  } catch (Exception e) {
79                          Log.e("XmlDepartureProvider", "looupFunction", e);                          Log.e("XmlDepartureProvider", "looupFunction", e);
80                  }                          return null;
81                    }              
82          }          }
83                    
84          @Override  
85          public List<DepartureBean> getDepartures() {          class DepartureParser extends DefaultHandler {
                 return departures;  
         }  
           
         // 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();  
86                                    
87                  builder.setLength(0); //reset StringBuilder                  private DepartureBean departures = new DepartureBean();
88          }  
89                    public DepartureBean getDepartures() {
90                            return departures;
91                    }
92                    
93          @Override                  // this can be called several times fore the same text-node if there are many chardata / lines
94          public void endElement (String uri, String name, String qName) throws SAXException                  @Override
95          {                  public void characters (char ch[], int start, int length)
96                  if (name.equals("train")) {                  {              
97                          departures.add( tempDeparture );                          builder.append(ch, start, length);
98                  } else if (name.equals("time")) {                  }
99                          tempDeparture.setTime(builder.toString());                  
100                  } else if (name.equals("updated")) {                  @Override
101                          tempDeparture.setLastUpdate(builder.toString());                  public void startElement (String uri, String name, String qName, Attributes atts)throws SAXException
102                  } else if (name.equals("trainnumber")) {                  {
103                          tempDeparture.setTrainNumber(builder.toString());                          if (name.equalsIgnoreCase("train"))
104                  } else if (name.equals("destination")) {                                  tempDeparture = new DepartureEntry();
105                          tempDeparture.setDestination(builder.toString());                          
106                  } else if (name.equals("origin")) {                          builder.setLength(0); //reset StringBuilder
107                          tempDeparture.setOrigin(builder.toString());                  }
108                  } else if (name.equals("location")) {                  
109                          tempDeparture.setLocation(builder.toString());                  @Override
110                  } else if (name.equals("status")) {                  public void endElement (String uri, String name, String qName) throws SAXException
111                          tempDeparture.setStatus(builder.toString());                  {
112                  } else if (name.equals("note")) {                          if (name.equals("train")) {                    
113                          tempDeparture.setNote(builder.toString());                                  departures.entries.add( tempDeparture );
114                  }                          } else if (name.equals("time")) {
115                                    tempDeparture.setTime(builder.toString().trim());
116                            } else if (name.equals("updated")) {
117                                    tempDeparture.setLastUpdate(builder.toString().trim());
118                            } else if (name.equals("trainnumber")) {
119                                    tempDeparture.setTrainNumber(builder.toString().trim());
120                            } else if (name.equals("destination")) {
121                                    tempDeparture.setDestination(builder.toString().trim());
122                            } else if (name.equals("origin")) {
123                                    tempDeparture.setOrigin(builder.toString().trim());
124                            } else if (name.equals("location")) {
125                                    tempDeparture.setLocation(builder.toString().trim());
126                            } else if (name.equals("status")) {
127                                    tempDeparture.setStatus(builder.toString().trim());
128                            } else if (name.equals("note")) {
129                                    tempDeparture.setNote(builder.toString().trim());
130                            } else if (name.equals("type")) {
131                                    tempDeparture.setType(builder.toString().trim());
132                            } else if (name.equals("notification")) {
133                                    departures.notifications.add( builder.toString().trim() );
134                            }
135                    }
136          }          }
137  }  }

Legend:
Removed from v.238  
changed lines
  Added in v.1024

  ViewVC Help
Powered by ViewVC 1.1.20