/[projects]/android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/MetroFetcher.java
ViewVC logotype

Annotation of /android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/MetroFetcher.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1060 - (hide annotations) (download)
Thu Sep 16 13:32:10 2010 UTC (13 years, 8 months ago) by torben
File size: 3806 byte(s)
Experimental: use Simple (simple.sourceforge.net) for XML serialization
1 torben 1042 package dk.thoerup.traininfoservice.banedk;
2    
3    
4     import java.net.URL;
5     import java.util.ArrayList;
6     import java.util.List;
7     import java.util.Map;
8     import java.util.logging.Logger;
9    
10     import org.jsoup.nodes.Document;
11     import org.jsoup.nodes.Element;
12     import org.jsoup.select.Elements;
13 torben 1060 import org.simpleframework.xml.ElementList;
14     import org.simpleframework.xml.Root;
15 torben 1042
16     import dk.thoerup.circuitbreaker.CircuitBreaker;
17     import dk.thoerup.circuitbreaker.CircuitBreakerManager;
18     import dk.thoerup.traininfoservice.StationDAO;
19     import dk.thoerup.traininfoservice.Statistics;
20 torben 1060 import dk.thoerup.traininfoservice.StationBean.StationEntry;
21 torben 1042
22    
23    
24     public class MetroFetcher {
25 torben 1060 @Root(name="entry")
26 torben 1042 public static class MetroEntry {
27 torben 1060
28     @org.simpleframework.xml.Element
29 torben 1042 String metro;
30 torben 1060
31     @org.simpleframework.xml.Element
32 torben 1042 String destination;
33 torben 1060
34     @org.simpleframework.xml.Element
35 torben 1042 String minutes;
36     }
37    
38 torben 1060 @Root(name="metrodepatures")
39 torben 1042 public static class MetroBean {
40 torben 1060
41     @org.simpleframework.xml.Element
42 torben 1042 String head;
43    
44 torben 1060
45     @org.simpleframework.xml.Element(name="operations")
46     String operationInfo; //driftsinfo
47    
48     @ElementList
49 torben 1042 List<MetroEntry> entries = new ArrayList<MetroEntry>();
50 torben 1060
51     @org.simpleframework.xml.Element
52     String plan; // koereplan
53 torben 1042 }
54    
55     Logger logger = Logger.getLogger(MetroFetcher.class.getName());
56     StationDAO stationDAO = new StationDAO();
57    
58 torben 1043 Map<String, MetroBean> cache = new TimeoutMap<String,MetroBean>(60000); //TODO: make metro cache timeout configurable
59 torben 1042
60     public MetroBean cachedLookupMetroDepartures(int stationID) throws Exception {
61     final String key = "metro:" + stationID;
62    
63     MetroBean metroBean = cache.get(key);
64    
65     if (metroBean == null) {
66     metroBean = lookupMetroDepartures(stationID);
67     cache.put(key, metroBean);
68     } else {
69     Statistics.getInstance().incrementDepartureCacheHits();
70     logger.info("Metro: Cache hit " + key); //remove before production
71     }
72     return metroBean;
73     }
74    
75     public MetroBean lookupMetroDepartures(int stationID) throws Exception {
76    
77 torben 1060 StationEntry station = stationDAO.getById(stationID) ;
78 torben 1042
79    
80     URL url = new URL("http://www.m.dk/layouts/Metro/Widgets/MetroWidget.ashx?StationId=" + station.getMetro() + "&Congestion=true&Application=MyMetro&Expiration=true");
81 torben 1048 logger.fine("URL:" + url);
82 torben 1042
83     JsoupInvocation wrapper = new JsoupInvocation( url, 3000);
84     CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("metro");
85    
86     Document doc = (Document) breaker.invoke(wrapper);
87    
88     MetroBean bean = new MetroBean();
89    
90     bean.head = doc.getElementsByClass("metro-widget-headline").get(0).text();
91    
92     Element content = doc.getElementsByClass("metro-widget-content").get(0);
93     Elements contentElems = content.children();
94    
95     Element departureTable = content.getElementsByTag("table").get(0);
96    
97     Elements rows = departureTable.getElementsByTag("tr");
98    
99     for (int i=1; i<rows.size(); i++) {
100     Element row = rows.get(i);
101     Elements fields = row.children();
102 torben 1056
103 torben 1042
104 torben 1056
105     Elements metroFields = fields.get(0).children();
106     String metro ="";
107     for (Element elm : metroFields) {
108     metro = metro + elm.text() + " ";
109     }
110    
111    
112    
113 torben 1042 String destination = fields.get(1).text();
114    
115 torben 1056 Elements minuteFields = fields.get(2).children();
116     String minutes ="";
117 torben 1042 for (Element elm : minuteFields) {
118     minutes = minutes + elm.text() + " ";
119     }
120    
121     MetroEntry entry = new MetroEntry();
122 torben 1056 entry.metro = metro.trim();
123     entry.destination = destination.trim();
124     entry.minutes = minutes.trim();
125 torben 1042
126     bean.entries.add(entry);
127     }
128    
129 torben 1043 bean.operationInfo = contentElems.get(3).text();
130 torben 1042
131 torben 1051 for (int i=4; i<contentElems.size(); i++) {
132     if (contentElems.get(i).text().trim().equalsIgnoreCase("køreplan")) {
133 torben 1050 bean.plan = contentElems.get(i+1).text();
134     }
135 torben 1043 }
136 torben 1050
137 torben 1042 return bean;
138     }
139    
140     }

  ViewVC Help
Powered by ViewVC 1.1.20