/[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 697 - (hide annotations) (download)
Mon May 3 07:42:02 2010 UTC (14 years ago) by torben
File size: 8917 byte(s)
Better handling of train-types (regional vs s-train)
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 307
20 torben 305 public class DepartureFetcher {
21 torben 348
22     Logger logger = Logger.getLogger(DepartureFetcher.class.getName());
23 torben 387
24 torben 584 Map<Integer, List<DepartureBean>> cache;
25 torben 387
26 torben 588 StationDAO stationDao = new StationDAO();
27    
28 torben 580 private boolean useTempSite;
29    
30 torben 584 public DepartureFetcher(boolean tempSite, int cacheTimeout) {
31 torben 580 useTempSite = tempSite;
32 torben 584 cache = new TimeoutMap<Integer,List<DepartureBean>>(cacheTimeout);
33 torben 580 }
34    
35    
36 torben 307
37 torben 387
38 torben 451 public List<DepartureBean> cachedLookupDepartures(int stationID) throws Exception {
39 torben 308
40 torben 387 List<DepartureBean> list = cache.get(stationID);
41    
42     if (list == null) {
43     list = lookupDepartures(stationID);
44     cache.put(stationID, list);
45     } else {
46 torben 389 logger.info("Departure: Cache hit " + stationID); //remove before production
47 torben 387 }
48     return list;
49     }
50    
51    
52 torben 451 public List<DepartureBean> lookupDepartures(int stationID) throws Exception {
53 torben 307 List<DepartureBean> departureList = new ArrayList<DepartureBean>();
54    
55 torben 588 StationBean station = stationDao.getById(stationID);
56 torben 307
57 torben 588 if (station.getRegional() != null) {
58     List<DepartureBean> list = lookupDepartures(station.getRegional(), "FJRN");
59     departureList.addAll(list);
60 torben 307 }
61    
62 torben 588 if (station.getStrain() != null) {
63     List<DepartureBean> list = lookupDepartures(station.getStrain(), "S2");
64     departureList.addAll(list);
65     }
66    
67     Collections.sort( departureList );
68    
69    
70 torben 307 return departureList;
71 torben 305 }
72    
73 torben 451 public List<DepartureBean> lookupDepartures(String stationcode, String type) throws Exception {
74 torben 580 if (useTempSite == false) {
75     return lookupDeparturesNormalSite(stationcode, type);
76     } else {
77     return lookupDeparturesFromTemporarySite(stationcode, type);
78     }
79     }
80    
81     public List<DepartureBean> lookupDeparturesNormalSite(String stationcode, String type) throws Exception {
82 torben 305
83     List<DepartureBean> departureList = new ArrayList<DepartureBean>();
84    
85 torben 591 final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3 );
86 torben 386 webClient.setTimeout(2500);
87 torben 313 webClient.setJavaScriptEnabled(false);
88    
89 torben 421 String uri = "http://www.bane.dk/visStation.asp?ArtikelID=4275&W=" + type + "&S=" + stationcode;
90     BanedkInvocation wrapper = new BanedkInvocation(webClient, uri);
91     CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
92 torben 305
93 torben 421 HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
94 torben 305
95     HtmlElement table = page.getElementById("afgangtabel");
96    
97 torben 342 if (table != null) {
98     DomNodeList<HtmlElement> tableRows = table.getElementsByTagName("tr");
99    
100     for (HtmlElement currentRow : tableRows) {
101     String rowClass = currentRow.getAttribute("class");
102     if (rowClass != null && rowClass.toLowerCase().contains("station") ) {
103     DomNodeList<HtmlElement> fields = currentRow.getElementsByTagName("td");
104    
105     DepartureBean departure = new DepartureBean();
106    
107     String time = fields.get(0).asText();
108 torben 375 if (time.equals(""))
109     time = "0:00"; //Bane.dk bug work-around
110 torben 342 departure.setTime(time);
111    
112     int updated = extractUpdated( fields.get(1) );
113     departure.setUpdated(updated);
114    
115     String trainNumber = fields.get(2).asText();
116 torben 410 if (type.equalsIgnoreCase("S2")) //If it is S-train we need to extract the trainNumber
117 torben 349 trainNumber = trainNumber + " " + extractTrainNumber(fields.get(2));
118 torben 342 departure.setTrainNumber(trainNumber);
119    
120     String destination = fields.get(3).asText();
121     departure.setDestination(destination);
122    
123     String origin = fields.get(4).asText();
124     departure.setOrigin(origin);
125    
126     String location = fields.get(5).asText();
127     departure.setLocation(location);
128    
129     String status = fields.get(6).asText();
130     departure.setStatus(status);
131    
132     String note = extractNote( fields.get(7) );
133     departure.setNote(note);
134    
135 torben 697 departure.setType(type);
136    
137 torben 342 departureList.add(departure);
138     }
139     }
140 torben 348 } else {
141     logger.warning("No departures found for station=" + stationcode + ", type=" + type);
142 torben 305 }
143 torben 591 webClient.closeAllWindows();
144 torben 348
145 torben 305 return departureList;
146     }
147    
148 torben 580 public List<DepartureBean> lookupDeparturesFromTemporarySite(String stationcode, String type) throws Exception {
149    
150     List<DepartureBean> departureList = new ArrayList<DepartureBean>();
151    
152 torben 591 final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
153 torben 580 webClient.setTimeout(2500);
154     webClient.setJavaScriptEnabled(false);
155    
156    
157     String uri = "http://bane.dk/lite/station.asp?w=" + type + "&s=" + stationcode;
158    
159     BanedkInvocation wrapper = new BanedkInvocation(webClient, uri);
160     CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
161    
162     HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
163    
164     HtmlElement table = page.getElementById("traf_afgang");
165    
166     if (table != null) {
167     DomNodeList<HtmlElement> tableRows = table.getElementsByTagName("tr");
168    
169     boolean isFirst = true;
170    
171     for (HtmlElement currentRow : tableRows) {
172     if (isFirst == true) { //skip table headers
173     isFirst = false;
174     continue;
175     }
176    
177     DomNodeList<HtmlElement> fields = currentRow.getElementsByTagName("td");
178    
179     DepartureBean departure = new DepartureBean();
180    
181     String time = fields.get(0).asText().trim();
182 torben 583
183 torben 580 if (time.equals(""))
184     time = "0:00"; //Bane.dk bug work-around
185     departure.setTime(time);
186    
187    
188     String trainNumber = fields.get(1).asText();
189     departure.setTrainNumber(trainNumber);
190    
191     String destination = fields.get(2).asText();
192     departure.setDestination(destination);
193    
194     String origin = fields.get(3).asText();
195     departure.setOrigin(origin);
196    
197     String status = fields.get(4).asText();
198     departure.setStatus(status);
199    
200 torben 582 String note = fields.get(5).asText();
201 torben 580 departure.setNote(note);
202    
203     departureList.add(departure);
204     }
205     } else {
206     logger.warning("No departures found for station=" + stationcode + ", type=" + type);
207     }
208 torben 591 webClient.closeAllWindows();
209 torben 580
210 torben 591
211 torben 580 return departureList;
212     }
213    
214    
215 torben 305 private int extractUpdated(HtmlElement updatedTd) { //extract the digit (in this case: 4) from "media/trafikinfo/opdater4.gif"
216     int updated = -1;
217    
218     DomNodeList<HtmlElement> updatedImgs = updatedTd.getElementsByTagName("img");
219     String updatedStr = updatedImgs.get(0).getAttribute("src");
220    
221     if (updatedStr != null) {
222     for (int i=0; i<updatedStr.length(); i++) {
223     char c = updatedStr.charAt(i);
224     if ( Character.isDigit(c)) {
225     updated = Character.digit(c, 10);
226     break;
227     }
228     }
229     }
230     return updated;
231     }
232    
233 torben 313 private String extractNote(HtmlElement noteTd) {
234     String note = noteTd.asText().trim();
235    
236     List<HtmlElement> elems = noteTd.getElementsByAttribute("span", "class", "bemtype");
237     if (elems.size() > 0 && note.charAt(note.length()-1) == 'i')
238     note = note.substring(0,note.length() -1 );
239    
240     return note;
241     }
242    
243 torben 349 private String extractTrainNumber(HtmlElement trainTd) {
244     String number = "";
245     HtmlElement anchorElement = trainTd.getElementsByTagName("a").get(0);
246     String href = anchorElement.getAttribute("href");
247     String argstring = href.substring( href.indexOf('?') + 1);
248    
249     String args[] = argstring.split("&");
250     for (String arg : args) {
251     String pair[] = arg.split("="); // Key=pair[0], Value=pair[1]
252    
253     if (pair[0].equalsIgnoreCase("TogNr"))
254     number = pair[1];
255     }
256    
257    
258     return number;
259     }
260    
261 torben 305 //test
262 torben 580 /*
263 torben 451 public static void main(String args[]) throws Exception {
264 torben 305 DepartureFetcher f = new DepartureFetcher();
265 torben 307 List<DepartureBean> deps = f.lookupDepartures("AR", "FJRN");
266 torben 305 for(DepartureBean d : deps) {
267     System.out.println( d.getTime() + ";" + d.getUpdated() + ";" + d.getTrainNumber() + ";" +
268     d.getDestination() + ";" + d.getOrigin() + ";" + d.getLocation() + ";" + d.getStatus() + ";" + d.getNote() );
269     }
270    
271     System.out.println("--------------------------");
272 torben 580 }*/
273 torben 305 }

  ViewVC Help
Powered by ViewVC 1.1.20