/[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 1061 - (show annotations) (download)
Thu Sep 16 14:04:28 2010 UTC (13 years, 8 months ago) by torben
File size: 3210 byte(s)
Experimental commit #2, move databeans to common
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.traininfoservice.StationDAO;
18 import dk.thoerup.traininfoservice.Statistics;
19
20
21
22 public class MetroFetcher {
23
24 Logger logger = Logger.getLogger(MetroFetcher.class.getName());
25 StationDAO stationDAO = new StationDAO();
26
27 Map<String, MetroBean> cache = new TimeoutMap<String,MetroBean>(60000); //TODO: make metro cache timeout configurable
28
29 public MetroBean cachedLookupMetroDepartures(int stationID) throws Exception {
30 final String key = "metro:" + stationID;
31
32 MetroBean metroBean = cache.get(key);
33
34 if (metroBean == null) {
35 metroBean = lookupMetroDepartures(stationID);
36 cache.put(key, metroBean);
37 } else {
38 Statistics.getInstance().incrementDepartureCacheHits();
39 logger.info("Metro: Cache hit " + key); //remove before production
40 }
41 return metroBean;
42 }
43
44 public MetroBean lookupMetroDepartures(int stationID) throws Exception {
45
46 StationEntry station = stationDAO.getById(stationID) ;
47
48
49 URL url = new URL("http://www.m.dk/layouts/Metro/Widgets/MetroWidget.ashx?StationId=" + station.getMetro() + "&Congestion=true&Application=MyMetro&Expiration=true");
50 logger.fine("URL:" + url);
51
52 JsoupInvocation wrapper = new JsoupInvocation( url, 3000);
53 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("metro");
54
55 Document doc = (Document) breaker.invoke(wrapper);
56
57 MetroBean bean = new MetroBean();
58
59 bean.head = doc.getElementsByClass("metro-widget-headline").get(0).text();
60
61 Element content = doc.getElementsByClass("metro-widget-content").get(0);
62 Elements contentElems = content.children();
63
64 Element departureTable = content.getElementsByTag("table").get(0);
65
66 Elements rows = departureTable.getElementsByTag("tr");
67
68 for (int i=1; i<rows.size(); i++) {
69 Element row = rows.get(i);
70 Elements fields = row.children();
71
72
73
74 Elements metroFields = fields.get(0).children();
75 String metro ="";
76 for (Element elm : metroFields) {
77 metro = metro + elm.text() + " ";
78 }
79
80
81
82 String destination = fields.get(1).text();
83
84 Elements minuteFields = fields.get(2).children();
85 String minutes ="";
86 for (Element elm : minuteFields) {
87 minutes = minutes + elm.text() + " ";
88 }
89
90 MetroEntry entry = new MetroEntry();
91 entry.metro = metro.trim();
92 entry.destination = destination.trim();
93 entry.minutes = minutes.trim();
94
95 bean.entries.add(entry);
96 }
97
98 bean.operationInfo = contentElems.get(3).text();
99
100 for (int i=4; i<contentElems.size(); i++) {
101 if (contentElems.get(i).text().trim().equalsIgnoreCase("køreplan")) {
102 bean.plan = contentElems.get(i+1).text();
103 }
104 }
105
106 return bean;
107 }
108
109 }

  ViewVC Help
Powered by ViewVC 1.1.20