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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1105 - (hide annotations) (download)
Wed Sep 22 21:09:39 2010 UTC (13 years, 8 months ago) by torben
File size: 7948 byte(s)
Got DAO working, now i'm just missing the last bit of loading station identifiers from app.t-hoerup.dk
1 torben 350 package dk.thoerup.traininfoservice.banedk;
2    
3    
4 torben 992
5 torben 350 import java.net.URL;
6 torben 836 import java.sql.SQLException;
7 torben 1093 import java.util.HashMap;
8 torben 428 import java.util.Map;
9 torben 836 import java.util.logging.Level;
10 torben 350 import java.util.logging.Logger;
11    
12 torben 1093 import net.sf.jsr107cache.Cache;
13     import net.sf.jsr107cache.CacheException;
14     import net.sf.jsr107cache.CacheManager;
15    
16 torben 992 import org.jsoup.nodes.Document;
17     import org.jsoup.nodes.Element;
18     import org.jsoup.select.Elements;
19 torben 350
20 torben 1093 import com.google.appengine.api.memcache.jsr107cache.GCacheFactory;
21    
22 torben 1061 import dk.thoerup.android.traininfo.common.TimetableBean;
23     import dk.thoerup.android.traininfo.common.TimetableEntry;
24 torben 468 import dk.thoerup.circuitbreaker.CircuitBreaker;
25     import dk.thoerup.circuitbreaker.CircuitBreakerManager;
26 torben 836 import dk.thoerup.traininfoservice.StationDAO;
27 torben 711 import dk.thoerup.traininfoservice.Statistics;
28 torben 421
29 torben 350 public class TimetableFetcher {
30 torben 992
31 torben 350
32 torben 1093 Cache cache;
33     Cache stationCache;
34 torben 836
35     StationDAO stationDao = new StationDAO();
36 torben 350
37 torben 387
38 torben 350 Logger logger = Logger.getLogger(TimetableFetcher.class.getName());
39 torben 387
40 torben 1036 private boolean useAzureSite;
41 torben 1026 private int replyTimeout;
42 torben 387
43 torben 1093 @SuppressWarnings("unchecked")
44 torben 1036 public TimetableFetcher(boolean azureSite, int cacheTimeout, int replyTimeout) {
45     useAzureSite = azureSite;
46 torben 1093 this.replyTimeout = replyTimeout;
47 torben 584
48 torben 1093 Map props = new HashMap();
49     props.put(GCacheFactory.EXPIRATION_DELTA_MILLIS, cacheTimeout);
50    
51     try {
52     cache = CacheManager.getInstance().getCacheFactory().createCache(props);
53     } catch (CacheException e) {
54     logger.log(Level.WARNING, "error creating cache", e);
55     }
56    
57     props = new HashMap();
58     props.put(GCacheFactory.EXPIRATION_DELTA_MILLIS, 3*60*60*1000);
59    
60     try {
61     stationCache = CacheManager.getInstance().getCacheFactory().createCache(props);
62     } catch (CacheException e) {
63     logger.log(Level.WARNING, "error creating cache", e);
64     }
65 torben 581 }
66    
67    
68 torben 1060 TimetableBean cachedLookupTimetable(String trainID, String type) throws Exception {
69 torben 387 String key = trainID+type;
70 torben 1095 TimetableBean list = (TimetableBean) cache.get(key);
71 torben 387
72     if (list == null) {
73     list = lookupTimetable(trainID,type);
74     cache.put(key, list);
75     } else {
76 torben 711 Statistics.getInstance().incrementTimetableCacheHits();
77 torben 389 logger.info("Timetable: Cache hit " + trainID);
78 torben 387 }
79     return list;
80     }
81 torben 581
82 torben 1060 TimetableBean lookupTimetable(String trainID, String type) throws Exception {
83 torben 1036 if (useAzureSite == true ){
84     return lookupTimetableAzureSite(trainID, type);
85    
86 torben 581 } else {
87 torben 1036 return lookupTimetableWwwSite(trainID, type);
88 torben 581 }
89     }
90 torben 836
91     int getStationId(String name) {
92 torben 1095 Integer id = (Integer) stationCache.get(name);
93 torben 836
94     if (id == null) {
95 torben 1105
96     id = stationDao.getIdByName(name);
97     stationCache.put(name, id);
98 torben 836 }
99 torben 350
100 torben 836 return id;
101     }
102    
103 torben 1060 TimetableBean lookupTimetableAzureSite(String trainID, String type) throws Exception {
104     TimetableBean timetableBean = new TimetableBean();
105 torben 350
106 torben 1048
107 torben 970 String url = "http://trafikinfo.bane.dk/TrafikInformation/Ruteplan/" + trainID;
108 torben 1048 logger.fine("URL:" + url);
109 torben 350
110 torben 1026 JsoupInvocation wrapper = new JsoupInvocation( new URL(url) , replyTimeout);
111 torben 421 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
112 torben 350
113 torben 992 Document doc = (Document) breaker.invoke(wrapper);
114 torben 421
115 torben 350
116     boolean currentStation = false;
117     boolean currentStationSaved = false;
118    
119 torben 992 Elements tables = doc.getElementsByClass("Rute");
120    
121 torben 350 if (tables.size() == 1) {
122 torben 992 Element timetable = tables.get(0);
123     Elements rows = timetable.getElementsByTag("tr");
124 torben 350
125     for (int i=0; i<rows.size(); i++) {
126     if (i==0) //First row is column headers
127     continue;
128    
129    
130 torben 992 Element row = rows.get(i);
131     Elements fields = row.getElementsByTag("td");
132    
133 torben 350
134 torben 992 if (currentStationSaved == false && fields.get(0).attr("class").equalsIgnoreCase("Tidsstreg")) {
135 torben 350 currentStation = true;
136     continue;
137     }
138    
139 torben 1060 TimetableEntry entry = new TimetableEntry();
140 torben 836
141 torben 992 String station = fields.get(0).text() ;
142 torben 836 if (station.equals("København"))
143     station = "København H"; //correct inconsistency in naming
144    
145 torben 1060 entry.setStation( station );
146     entry.setArrival( fields.get(1).text() );
147     entry.setDeparture( fields.get(2).text() );
148 torben 350
149 torben 992 boolean cancelled = fields.get(3).text().equalsIgnoreCase("aflyst");
150 torben 1060 entry.setCancelled(cancelled);
151 torben 975
152 torben 350 if (currentStation == true && currentStationSaved == false ) {
153 torben 1060 entry.setCurrent(currentStation);
154 torben 350 currentStationSaved = true;
155     }
156    
157 torben 1060 entry.setStationId( getStationId( station ));
158 torben 836
159 torben 1060 timetableBean.entries.add(entry);
160 torben 350 }
161    
162 torben 977 //TODO: There is an off-by-one error in this cancelled parser thingie
163 torben 975 final String cancelledString = "Aflyst";
164 torben 1060 for (int i=0;i<timetableBean.entries.size(); i++) { //handle cancelled labels
165     final int lastIdx = (timetableBean.entries.size() - 1);
166 torben 975
167 torben 1060 TimetableEntry current = timetableBean.entries.get(i);
168 torben 976 if (current.isCancelled()) {
169     if (i == 0) {
170     current.setDeparture(cancelledString);
171     } else if (i == lastIdx) {
172     current.setArrival(cancelledString);
173     } else if (i>0 && i<lastIdx) {
174 torben 1060 TimetableEntry next = timetableBean.entries.get(i+1);
175     TimetableEntry prev = timetableBean.entries.get(i-1);
176 torben 976
177     if (next.isCancelled())
178     current.setDeparture(cancelledString);
179     if (prev.isCancelled())
180     current.setArrival(cancelledString);
181     }
182 torben 975 }
183     }
184    
185 torben 350 } else {
186     logger.warning("No time table found, trainID=" + trainID + " type=" + type);
187     }
188 torben 992
189 torben 350
190 torben 1060 return timetableBean;
191 torben 350 }
192 torben 1036
193 torben 1060 TimetableBean lookupTimetableWwwSite(String trainID, String type) throws Exception {
194     TimetableBean timetableBean = new TimetableBean();
195 torben 1036
196     String url = "http://www.bane.dk/visRute.asp?W=" + type + "&TogNr=" + trainID + "&artikelId=4276";
197 torben 1048 logger.fine("URL:" + url);
198 torben 1036
199    
200     JsoupInvocation wrapper = new JsoupInvocation( new URL(url) , replyTimeout);
201     CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
202    
203     Document doc = (Document) breaker.invoke(wrapper);
204    
205    
206     boolean currentStation = false;
207     boolean currentStationSaved = false;
208    
209     Elements tables = doc.getElementsByClass("Rute");
210    
211     if (tables.size() == 1) {
212     Element timetable = tables.get(0);
213     Elements rows = timetable.getElementsByTag("tr");
214    
215     for (int i=0; i<rows.size(); i++) {
216     if (i==0) //First row is column headers
217     continue;
218    
219    
220     Element row = rows.get(i);
221     Elements fields = row.getElementsByTag("td");
222    
223    
224     if (currentStationSaved == false && fields.get(0).attr("class").equalsIgnoreCase("Tidsstreg")) {
225     currentStation = true;
226     continue;
227     }
228    
229 torben 1060 TimetableEntry entry = new TimetableEntry();
230 torben 1036
231 torben 1040 String station = DepartureFetcher.cleanText( fields.get(0).text() ) ;
232 torben 1036 if (station.equals("København"))
233     station = "København H"; //correct inconsistency in naming
234    
235 torben 1040 String arrival = DepartureFetcher.cleanText( fields.get(1).text() );
236     String departure = DepartureFetcher.cleanText( fields.get(2).text() );
237    
238 torben 1060 entry.setStation( station );
239     entry.setArrival( arrival );
240     entry.setDeparture( departure );
241 torben 1036
242    
243     if (currentStation == true && currentStationSaved == false ) {
244 torben 1060 entry.setCurrent(currentStation);
245 torben 1036 currentStationSaved = true;
246     }
247    
248 torben 1060 entry.setStationId( getStationId( station ));
249 torben 1036
250 torben 1060 timetableBean.entries.add(entry);
251 torben 1036 }
252    
253     } else {
254     logger.warning("No time table found, trainID=" + trainID + " type=" + type);
255     }
256    
257    
258 torben 1060 return timetableBean;
259 torben 1036 }
260 torben 350
261     }

  ViewVC Help
Powered by ViewVC 1.1.20