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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1355 - (show annotations) (download)
Wed Apr 20 19:01:33 2011 UTC (13 years ago) by torben
File size: 3515 byte(s)
Move timeoutmap to GenericJavaUtils
1 package dk.thoerup.traininfoservice.banedk;
2
3
4 import java.net.URL;
5 import java.util.Map;
6 import java.util.logging.Logger;
7
8 import org.jsoup.nodes.Document;
9 import org.jsoup.nodes.Element;
10 import org.jsoup.select.Elements;
11
12 import dk.thoerup.android.traininfo.common.MetroBean;
13 import dk.thoerup.android.traininfo.common.MetroBean.MetroEntry;
14 import dk.thoerup.android.traininfo.common.StationBean.StationEntry;
15 import dk.thoerup.circuitbreaker.CircuitBreaker;
16 import dk.thoerup.circuitbreaker.CircuitBreakerManager;
17 import dk.thoerup.genericjavautils.TimeoutMap;
18 import dk.thoerup.traininfoservice.Statistics;
19 import dk.thoerup.traininfoservice.db.StationDAO;
20
21
22
23 public class MetroFetcher {
24
25 Logger logger = Logger.getLogger(MetroFetcher.class.getName());
26 StationDAO stationDAO = new StationDAO();
27
28 Map<String, MetroBean> cache = new TimeoutMap<String,MetroBean>(60000); //TODO: make metro cache timeout configurable
29
30 public MetroBean cachedLookupMetroDepartures(int stationID) throws Exception {
31 final String key = "metro:" + stationID;
32
33 MetroBean metroBean = cache.get(key);
34
35 if (metroBean == null) {
36 metroBean = lookupMetroDepartures(stationID);
37 cache.put(key, metroBean);
38 } else {
39 Statistics.getInstance().incrementDepartureCacheHits();
40 logger.info("Metro: Cache hit " + key); //remove before production
41 }
42 return metroBean;
43 }
44
45 public MetroBean lookupMetroDepartures(int stationID) throws Exception {
46
47 StationEntry station = stationDAO.getById(stationID) ;
48
49
50 URL url = new URL("http://www.m.dk/layouts/Metro/Widgets/MetroWidget.ashx?StationId=" + station.getMetro() + "&Congestion=true&Application=MyMetro&Expiration=true");
51 logger.fine("URL:" + url);
52
53 JsoupInvocation wrapper = new JsoupInvocation( url, 3000);
54 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("metro");
55
56 Document doc = (Document) breaker.invoke(wrapper);
57
58 MetroBean bean = new MetroBean();
59
60 bean.head = doc.getElementsByClass("metro-widget-headline").get(0).text();
61
62 Element content = doc.getElementsByClass("metro-widget-content").get(0);
63 Elements contentElems = content.children();
64
65 Elements contentTables = content.getElementsByTag("table");
66 if ( contentTables.size() > 0 ) {
67
68 Element departureTable = content.getElementsByTag("table").get(0);
69
70 Elements rows = departureTable.getElementsByTag("tr");
71
72 for (int i=1; i<rows.size(); i++) {
73 Element row = rows.get(i);
74 Elements fields = row.children();
75
76
77
78 Elements metroFields = fields.get(0).children();
79 String metro ="";
80 for (Element elm : metroFields) {
81 metro = metro + elm.text() + " ";
82 }
83
84
85
86 String destination = fields.get(1).text();
87
88 Elements minuteFields = fields.get(2).children();
89 String minutes ="";
90 for (Element elm : minuteFields) {
91 minutes = minutes + elm.text() + " ";
92 }
93
94 MetroEntry entry = new MetroEntry();
95 entry.metro = metro.trim();
96 entry.destination = destination.trim();
97 entry.minutes = minutes.trim();
98
99 bean.entries.add(entry);
100 }
101 }
102
103
104 for (int i=0; i<contentElems.size(); i++) {
105 String currentText = contentElems.get(i).text().trim();
106 if (currentText.equalsIgnoreCase("driftsinformation")) {
107 bean.operationInfo = contentElems.get(i+1).text();
108 }
109
110 if (currentText.equalsIgnoreCase("køreplan")) {
111 bean.plan = contentElems.get(i+1).text();
112 }
113 }
114
115
116
117 return bean;
118 }
119
120 }

  ViewVC Help
Powered by ViewVC 1.1.20