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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20