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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20