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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20