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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 980 - (hide annotations) (download)
Sat Jul 10 11:01:07 2010 UTC (13 years, 10 months ago) by torben
Original Path: android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/DepartureFetcher.java
File size: 10429 byte(s)
Re-enable caching of depatures
1 torben 305 package dk.thoerup.traininfoservice.banedk;
2    
3 torben 978
4 torben 307 import java.util.Collections;
5 torben 305 import java.util.List;
6 torben 428 import java.util.Map;
7 torben 348 import java.util.logging.Logger;
8 torben 305
9 torben 591 import com.gargoylesoftware.htmlunit.BrowserVersion;
10 torben 305 import com.gargoylesoftware.htmlunit.WebClient;
11     import com.gargoylesoftware.htmlunit.html.DomNodeList;
12     import com.gargoylesoftware.htmlunit.html.HtmlElement;
13     import com.gargoylesoftware.htmlunit.html.HtmlPage;
14    
15 torben 468 import dk.thoerup.circuitbreaker.CircuitBreaker;
16     import dk.thoerup.circuitbreaker.CircuitBreakerManager;
17 torben 588 import dk.thoerup.traininfoservice.StationBean;
18     import dk.thoerup.traininfoservice.StationDAO;
19 torben 711 import dk.thoerup.traininfoservice.Statistics;
20 torben 307
21 torben 305 public class DepartureFetcher {
22 torben 348
23 torben 972 enum TrainType{
24     STOG,
25     REGIONAL
26     }
27    
28 torben 348 Logger logger = Logger.getLogger(DepartureFetcher.class.getName());
29 torben 387
30 torben 978 Map<String, DepartureBean> cache;
31 torben 387
32 torben 588 StationDAO stationDao = new StationDAO();
33    
34 torben 580 private boolean useTempSite;
35    
36 torben 584 public DepartureFetcher(boolean tempSite, int cacheTimeout) {
37 torben 580 useTempSite = tempSite;
38 torben 978 cache = new TimeoutMap<String,DepartureBean>(cacheTimeout);
39 torben 580 }
40    
41    
42 torben 307
43 torben 387
44 torben 978 public DepartureBean cachedLookupDepartures(int stationID, boolean arrival) throws Exception {
45 torben 829 final String key = "" + stationID + ":" + arrival;
46 torben 980
47 torben 978 DepartureBean departureBean = cache.get(key);
48 torben 308
49 torben 387
50 torben 978 if (departureBean == null) {
51     departureBean = lookupDepartures(stationID,arrival);
52     cache.put(key, departureBean);
53 torben 387 } else {
54 torben 711 Statistics.getInstance().incrementDepartureCacheHits();
55 torben 829 logger.info("Departure: Cache hit " + key); //remove before production
56 torben 387 }
57 torben 980 return departureBean;
58 torben 387 }
59    
60    
61 torben 978 public DepartureBean lookupDepartures(int stationID, boolean arrival) throws Exception {
62 torben 307
63 torben 978 DepartureBean departureBean = new DepartureBean();
64    
65 torben 588 StationBean station = stationDao.getById(stationID);
66 torben 307
67 torben 588 if (station.getRegional() != null) {
68 torben 978 DepartureBean tempBean = lookupDepartures(station.getRegional(), TrainType.REGIONAL, arrival);
69     departureBean.departureEntries.addAll( tempBean.departureEntries );
70     departureBean.notifications.addAll(tempBean.notifications);
71 torben 307 }
72    
73 torben 588 if (station.getStrain() != null) {
74 torben 978 DepartureBean tempBean = lookupDepartures(station.getStrain(), TrainType.STOG, arrival);
75     departureBean.departureEntries.addAll( tempBean.departureEntries );
76     departureBean.notifications.addAll(tempBean.notifications);
77 torben 588 }
78    
79 torben 978 Collections.sort( departureBean.departureEntries );
80 torben 588
81    
82 torben 978 return departureBean;
83 torben 305 }
84    
85 torben 978 public DepartureBean lookupDepartures(String stationcode, TrainType type, boolean arrival) throws Exception {
86 torben 580 if (useTempSite == false) {
87 torben 829 return lookupDeparturesNormalSite(stationcode, type, arrival);
88 torben 580 } else {
89 torben 972 //return lookupDeparturesFromTemporarySite(stationcode, type);
90     //TODO: find out what to to if they ever put a temp site up on trafikinfo.bane.dk
91     return null;
92 torben 580 }
93     }
94    
95 torben 972 private String getTypeString(TrainType type) {
96     switch (type) {
97     case STOG:
98     return "S-Tog";
99     case REGIONAL:
100     return "Fjerntog";
101     default:
102     return ""; //Can not happen
103     }
104     }
105    
106 torben 978 public DepartureBean lookupDeparturesNormalSite(String stationcode, TrainType type, boolean arrival) throws Exception {
107 torben 305
108 torben 978 DepartureBean departureBean = new DepartureBean();
109 torben 305
110 torben 591 final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3 );
111 torben 386 webClient.setTimeout(2500);
112 torben 313 webClient.setJavaScriptEnabled(false);
113 torben 970
114 torben 972
115     String typeString = getTypeString(type);
116 torben 970 String arrivalDeparture = (arrival==false) ? "Afgang" : "Ankomst";
117 torben 313
118 torben 970 //String uri = "http://www.bane.dk/visStation.asp?ArtikelID=4275&W=" + type + "&S=" + stationcode;
119 torben 972 String uri = "http://trafikinfo.bane.dk/Trafikinformation/AfgangAnkomst/" + arrivalDeparture + "/" + stationcode + "/" + typeString + "/UdvidetVisning";
120 torben 970
121 torben 971 //logger.info("URI: " + uri);
122 torben 939 HtmlunitInvocation wrapper = new HtmlunitInvocation(webClient, uri);
123 torben 421 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
124 torben 305
125 torben 421 HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
126 torben 305
127 torben 829 String tableName = arrival == false ? "afgangtabel" : "ankomsttabel";
128     HtmlElement table = page.getElementById(tableName);
129    
130 torben 342 if (table != null) {
131     DomNodeList<HtmlElement> tableRows = table.getElementsByTagName("tr");
132    
133     for (HtmlElement currentRow : tableRows) {
134     String rowClass = currentRow.getAttribute("class");
135     if (rowClass != null && rowClass.toLowerCase().contains("station") ) {
136     DomNodeList<HtmlElement> fields = currentRow.getElementsByTagName("td");
137    
138 torben 978 DepartureEntry departure = new DepartureEntry();
139 torben 342
140     String time = fields.get(0).asText();
141 torben 375 if (time.equals(""))
142     time = "0:00"; //Bane.dk bug work-around
143 torben 342 departure.setTime(time);
144    
145     int updated = extractUpdated( fields.get(1) );
146     departure.setUpdated(updated);
147    
148     String trainNumber = fields.get(2).asText();
149 torben 972 if (type == TrainType.STOG) //If it is S-train we need to extract the trainNumber
150 torben 349 trainNumber = trainNumber + " " + extractTrainNumber(fields.get(2));
151 torben 342 departure.setTrainNumber(trainNumber);
152    
153     String destination = fields.get(3).asText();
154     departure.setDestination(destination);
155    
156     String origin = fields.get(4).asText();
157     departure.setOrigin(origin);
158    
159     String location = fields.get(5).asText();
160     departure.setLocation(location);
161    
162 torben 860 String status = fields.get(6).asText().trim();
163 torben 342 departure.setStatus(status);
164    
165     String note = extractNote( fields.get(7) );
166     departure.setNote(note);
167    
168 torben 972 departure.setType(typeString);
169 torben 697
170 torben 978 departureBean.departureEntries.add( departure );
171 torben 342 }
172     }
173 torben 348 } else {
174     logger.warning("No departures found for station=" + stationcode + ", type=" + type);
175 torben 305 }
176 torben 978
177     HtmlElement notifDiv = page.getElementById("station_planlagte_text");
178     if (notifDiv != null) {
179    
180     DomNodeList<HtmlElement> tables = notifDiv.getElementsByTagName("table");
181     for (HtmlElement tab : tables) {
182    
183     DomNodeList<HtmlElement> anchors = tab.getElementsByTagName("a");
184     if (anchors.size() == 2) {
185     departureBean.notifications.add( anchors.get(1).getTextContent() );
186     }
187     }
188    
189     }
190    
191    
192 torben 591 webClient.closeAllWindows();
193 torben 348
194 torben 978 return departureBean;
195 torben 305 }
196    
197 torben 974 /*
198     @Deprecated
199 torben 580 public List<DepartureBean> lookupDeparturesFromTemporarySite(String stationcode, String type) throws Exception {
200    
201     List<DepartureBean> departureList = new ArrayList<DepartureBean>();
202    
203 torben 591 final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
204 torben 580 webClient.setTimeout(2500);
205     webClient.setJavaScriptEnabled(false);
206    
207    
208     String uri = "http://bane.dk/lite/station.asp?w=" + type + "&s=" + stationcode;
209    
210 torben 939 HtmlunitInvocation wrapper = new HtmlunitInvocation(webClient, uri);
211 torben 580 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
212    
213     HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
214    
215     HtmlElement table = page.getElementById("traf_afgang");
216    
217     if (table != null) {
218     DomNodeList<HtmlElement> tableRows = table.getElementsByTagName("tr");
219    
220     boolean isFirst = true;
221    
222     for (HtmlElement currentRow : tableRows) {
223     if (isFirst == true) { //skip table headers
224     isFirst = false;
225     continue;
226     }
227    
228     DomNodeList<HtmlElement> fields = currentRow.getElementsByTagName("td");
229    
230     DepartureBean departure = new DepartureBean();
231    
232     String time = fields.get(0).asText().trim();
233 torben 583
234 torben 580 if (time.equals(""))
235     time = "0:00"; //Bane.dk bug work-around
236     departure.setTime(time);
237    
238    
239     String trainNumber = fields.get(1).asText();
240     departure.setTrainNumber(trainNumber);
241    
242     String destination = fields.get(2).asText();
243     departure.setDestination(destination);
244    
245     String origin = fields.get(3).asText();
246     departure.setOrigin(origin);
247    
248     String status = fields.get(4).asText();
249     departure.setStatus(status);
250    
251 torben 582 String note = fields.get(5).asText();
252 torben 580 departure.setNote(note);
253    
254     departureList.add(departure);
255     }
256     } else {
257     logger.warning("No departures found for station=" + stationcode + ", type=" + type);
258     }
259 torben 591 webClient.closeAllWindows();
260 torben 580
261 torben 591
262 torben 580 return departureList;
263 torben 974 }*/
264 torben 580
265    
266 torben 305 private int extractUpdated(HtmlElement updatedTd) { //extract the digit (in this case: 4) from "media/trafikinfo/opdater4.gif"
267     int updated = -1;
268    
269     DomNodeList<HtmlElement> updatedImgs = updatedTd.getElementsByTagName("img");
270     String updatedStr = updatedImgs.get(0).getAttribute("src");
271    
272     if (updatedStr != null) {
273     for (int i=0; i<updatedStr.length(); i++) {
274     char c = updatedStr.charAt(i);
275     if ( Character.isDigit(c)) {
276     updated = Character.digit(c, 10);
277     break;
278     }
279     }
280     }
281     return updated;
282     }
283    
284 torben 313 private String extractNote(HtmlElement noteTd) {
285     String note = noteTd.asText().trim();
286    
287     List<HtmlElement> elems = noteTd.getElementsByAttribute("span", "class", "bemtype");
288     if (elems.size() > 0 && note.charAt(note.length()-1) == 'i')
289     note = note.substring(0,note.length() -1 );
290    
291     return note;
292     }
293    
294 torben 349 private String extractTrainNumber(HtmlElement trainTd) {
295     HtmlElement anchorElement = trainTd.getElementsByTagName("a").get(0);
296     String href = anchorElement.getAttribute("href");
297    
298 torben 973 int pos = href.lastIndexOf('/');
299     String number = href.substring(pos+1);
300 torben 970
301 torben 349 return number;
302     }
303    
304 torben 305 //test
305 torben 580 /*
306 torben 451 public static void main(String args[]) throws Exception {
307 torben 305 DepartureFetcher f = new DepartureFetcher();
308 torben 307 List<DepartureBean> deps = f.lookupDepartures("AR", "FJRN");
309 torben 305 for(DepartureBean d : deps) {
310     System.out.println( d.getTime() + ";" + d.getUpdated() + ";" + d.getTrainNumber() + ";" +
311     d.getDestination() + ";" + d.getOrigin() + ";" + d.getLocation() + ";" + d.getStatus() + ";" + d.getNote() );
312     }
313    
314     System.out.println("--------------------------");
315 torben 580 }*/
316 torben 305 }

  ViewVC Help
Powered by ViewVC 1.1.20