/[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 974 - (show annotations) (download)
Fri Jul 9 22:30:18 2010 UTC (13 years, 10 months ago) by torben
File size: 9765 byte(s)
outcomment the temp site code - until we know whether it ever will be needed again
1 package dk.thoerup.traininfoservice.banedk;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.logging.Logger;
8
9 import com.gargoylesoftware.htmlunit.BrowserVersion;
10 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 import dk.thoerup.circuitbreaker.CircuitBreaker;
16 import dk.thoerup.circuitbreaker.CircuitBreakerManager;
17 import dk.thoerup.traininfoservice.StationBean;
18 import dk.thoerup.traininfoservice.StationDAO;
19 import dk.thoerup.traininfoservice.Statistics;
20
21 public class DepartureFetcher {
22
23 enum TrainType{
24 STOG,
25 REGIONAL
26 }
27
28 Logger logger = Logger.getLogger(DepartureFetcher.class.getName());
29
30 Map<String, List<DepartureBean>> cache;
31
32 StationDAO stationDao = new StationDAO();
33
34 private boolean useTempSite;
35
36 public DepartureFetcher(boolean tempSite, int cacheTimeout) {
37 useTempSite = tempSite;
38 cache = new TimeoutMap<String,List<DepartureBean>>(cacheTimeout);
39 }
40
41
42
43
44 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
49
50 if (list == null) {
51 list = lookupDepartures(stationID,arrival);
52 cache.put(key, list);
53 } else {
54 Statistics.getInstance().incrementDepartureCacheHits();
55 logger.info("Departure: Cache hit " + key); //remove before production
56 }
57 return list;
58 }
59
60
61 public List<DepartureBean> lookupDepartures(int stationID, boolean arrival) throws Exception {
62 List<DepartureBean> departureList = new ArrayList<DepartureBean>();
63
64 StationBean station = stationDao.getById(stationID);
65
66 if (station.getRegional() != null) {
67 List<DepartureBean> list = lookupDepartures(station.getRegional(), TrainType.REGIONAL, arrival);
68 departureList.addAll(list);
69 }
70
71 if (station.getStrain() != null) {
72 List<DepartureBean> list = lookupDepartures(station.getStrain(), TrainType.STOG, arrival);
73 departureList.addAll(list);
74 }
75
76 Collections.sort( departureList );
77
78
79 return departureList;
80 }
81
82 public List<DepartureBean> lookupDepartures(String stationcode, TrainType type, boolean arrival) throws Exception {
83 if (useTempSite == false) {
84 return lookupDeparturesNormalSite(stationcode, type, arrival);
85 } else {
86 //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 }
90 }
91
92 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
105 List<DepartureBean> departureList = new ArrayList<DepartureBean>();
106
107 final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3 );
108 webClient.setTimeout(2500);
109 webClient.setJavaScriptEnabled(false);
110
111
112 String typeString = getTypeString(type);
113 String arrivalDeparture = (arrival==false) ? "Afgang" : "Ankomst";
114
115 //String uri = "http://www.bane.dk/visStation.asp?ArtikelID=4275&W=" + type + "&S=" + stationcode;
116 String uri = "http://trafikinfo.bane.dk/Trafikinformation/AfgangAnkomst/" + arrivalDeparture + "/" + stationcode + "/" + typeString + "/UdvidetVisning";
117
118 //logger.info("URI: " + uri);
119 HtmlunitInvocation wrapper = new HtmlunitInvocation(webClient, uri);
120 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
121
122 HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
123
124 String tableName = arrival == false ? "afgangtabel" : "ankomsttabel";
125 HtmlElement table = page.getElementById(tableName);
126
127 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 if (time.equals(""))
139 time = "0:00"; //Bane.dk bug work-around
140 departure.setTime(time);
141
142 int updated = extractUpdated( fields.get(1) );
143 departure.setUpdated(updated);
144
145 String trainNumber = fields.get(2).asText();
146 if (type == TrainType.STOG) //If it is S-train we need to extract the trainNumber
147 trainNumber = trainNumber + " " + extractTrainNumber(fields.get(2));
148 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 String status = fields.get(6).asText().trim();
160 departure.setStatus(status);
161
162 String note = extractNote( fields.get(7) );
163 departure.setNote(note);
164
165 departure.setType(typeString);
166
167 departureList.add(departure);
168 }
169 }
170 } else {
171 logger.warning("No departures found for station=" + stationcode + ", type=" + type);
172 }
173 webClient.closeAllWindows();
174
175 return departureList;
176 }
177
178 /*
179 @Deprecated
180 public List<DepartureBean> lookupDeparturesFromTemporarySite(String stationcode, String type) throws Exception {
181
182 List<DepartureBean> departureList = new ArrayList<DepartureBean>();
183
184 final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
185 webClient.setTimeout(2500);
186 webClient.setJavaScriptEnabled(false);
187
188
189 String uri = "http://bane.dk/lite/station.asp?w=" + type + "&s=" + stationcode;
190
191 HtmlunitInvocation wrapper = new HtmlunitInvocation(webClient, uri);
192 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
193
194 HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
195
196 HtmlElement table = page.getElementById("traf_afgang");
197
198 if (table != null) {
199 DomNodeList<HtmlElement> tableRows = table.getElementsByTagName("tr");
200
201 boolean isFirst = true;
202
203 for (HtmlElement currentRow : tableRows) {
204 if (isFirst == true) { //skip table headers
205 isFirst = false;
206 continue;
207 }
208
209 DomNodeList<HtmlElement> fields = currentRow.getElementsByTagName("td");
210
211 DepartureBean departure = new DepartureBean();
212
213 String time = fields.get(0).asText().trim();
214
215 if (time.equals(""))
216 time = "0:00"; //Bane.dk bug work-around
217 departure.setTime(time);
218
219
220 String trainNumber = fields.get(1).asText();
221 departure.setTrainNumber(trainNumber);
222
223 String destination = fields.get(2).asText();
224 departure.setDestination(destination);
225
226 String origin = fields.get(3).asText();
227 departure.setOrigin(origin);
228
229 String status = fields.get(4).asText();
230 departure.setStatus(status);
231
232 String note = fields.get(5).asText();
233 departure.setNote(note);
234
235 departureList.add(departure);
236 }
237 } else {
238 logger.warning("No departures found for station=" + stationcode + ", type=" + type);
239 }
240 webClient.closeAllWindows();
241
242
243 return departureList;
244 }*/
245
246
247 private int extractUpdated(HtmlElement updatedTd) { //extract the digit (in this case: 4) from "media/trafikinfo/opdater4.gif"
248 int updated = -1;
249
250 DomNodeList<HtmlElement> updatedImgs = updatedTd.getElementsByTagName("img");
251 String updatedStr = updatedImgs.get(0).getAttribute("src");
252
253 if (updatedStr != null) {
254 for (int i=0; i<updatedStr.length(); i++) {
255 char c = updatedStr.charAt(i);
256 if ( Character.isDigit(c)) {
257 updated = Character.digit(c, 10);
258 break;
259 }
260 }
261 }
262 return updated;
263 }
264
265 private String extractNote(HtmlElement noteTd) {
266 String note = noteTd.asText().trim();
267
268 List<HtmlElement> elems = noteTd.getElementsByAttribute("span", "class", "bemtype");
269 if (elems.size() > 0 && note.charAt(note.length()-1) == 'i')
270 note = note.substring(0,note.length() -1 );
271
272 return note;
273 }
274
275 private String extractTrainNumber(HtmlElement trainTd) {
276 HtmlElement anchorElement = trainTd.getElementsByTagName("a").get(0);
277 String href = anchorElement.getAttribute("href");
278
279 int pos = href.lastIndexOf('/');
280 String number = href.substring(pos+1);
281
282 return number;
283 }
284
285 //test
286 /*
287 public static void main(String args[]) throws Exception {
288 DepartureFetcher f = new DepartureFetcher();
289 List<DepartureBean> deps = f.lookupDepartures("AR", "FJRN");
290 for(DepartureBean d : deps) {
291 System.out.println( d.getTime() + ";" + d.getUpdated() + ";" + d.getTrainNumber() + ";" +
292 d.getDestination() + ";" + d.getOrigin() + ";" + d.getLocation() + ";" + d.getStatus() + ";" + d.getNote() );
293 }
294
295 System.out.println("--------------------------");
296 }*/
297 }

  ViewVC Help
Powered by ViewVC 1.1.20