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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 711 - (hide annotations) (download)
Wed May 5 20:11:03 2010 UTC (14 years ago) by torben
File size: 4025 byte(s)
First take on some statistics
1 torben 350 package dk.thoerup.traininfoservice.banedk;
2    
3    
4     import java.io.IOException;
5     import java.net.URL;
6     import java.util.ArrayList;
7     import java.util.List;
8 torben 428 import java.util.Map;
9 torben 350 import java.util.logging.Logger;
10    
11 torben 591 import com.gargoylesoftware.htmlunit.BrowserVersion;
12 torben 387 import com.gargoylesoftware.htmlunit.Page;
13     import com.gargoylesoftware.htmlunit.RefreshHandler;
14     import com.gargoylesoftware.htmlunit.WebClient;
15     import com.gargoylesoftware.htmlunit.html.DomNodeList;
16     import com.gargoylesoftware.htmlunit.html.HtmlElement;
17     import com.gargoylesoftware.htmlunit.html.HtmlPage;
18 torben 350
19 torben 468 import dk.thoerup.circuitbreaker.CircuitBreaker;
20     import dk.thoerup.circuitbreaker.CircuitBreakerManager;
21 torben 711 import dk.thoerup.traininfoservice.Statistics;
22 torben 421
23 torben 350 public class TimetableFetcher {
24    
25     class NullRefreshHandler implements RefreshHandler {
26     public void handleRefresh(Page arg0, URL arg1, int arg2) throws IOException {
27     }
28    
29     }
30 torben 387
31 torben 584 Map<String, List<TimetableBean>> cache;
32 torben 350
33 torben 387
34 torben 350 Logger logger = Logger.getLogger(TimetableFetcher.class.getName());
35 torben 387
36 torben 581 private boolean useTempSite;
37 torben 387
38 torben 584 public TimetableFetcher(boolean tmpSite, int cacheTimeout) {
39 torben 581 useTempSite = tmpSite;
40 torben 584
41     cache = new TimeoutMap<String,List<TimetableBean>>(cacheTimeout);
42 torben 581 }
43    
44    
45 torben 451 List<TimetableBean> cachedLookupTimetable(String trainID, String type) throws Exception {
46 torben 387 String key = trainID+type;
47     List<TimetableBean> list = cache.get(key);
48    
49     if (list == null) {
50     list = lookupTimetable(trainID,type);
51     cache.put(key, list);
52     } else {
53 torben 711 Statistics.getInstance().incrementTimetableCacheHits();
54 torben 389 logger.info("Timetable: Cache hit " + trainID);
55 torben 387 }
56     return list;
57     }
58 torben 581
59     List<TimetableBean> lookupTimetable(String trainID, String type) throws Exception {
60     if (useTempSite == false ){
61     return lookupTimetableRealSite(trainID, type);
62     } else {
63     return new ArrayList<TimetableBean>(); // no timetable data on temp site
64     }
65     }
66 torben 350
67 torben 581 List<TimetableBean> lookupTimetableRealSite(String trainID, String type) throws Exception {
68 torben 350 List<TimetableBean> timetableList = new ArrayList<TimetableBean>();
69    
70     String url = "http://www.bane.dk/visRute.asp?W=" + type + "&TogNr=" + trainID + "&artikelId=4276";
71    
72    
73 torben 591 final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
74 torben 386 webClient.setTimeout(2500);
75 torben 350 webClient.setJavaScriptEnabled(false);
76     webClient.setRefreshHandler( new NullRefreshHandler() );
77     webClient.setCssEnabled(false);
78    
79    
80 torben 421 BanedkInvocation wrapper = new BanedkInvocation(webClient, url);
81     CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk");
82 torben 350
83 torben 421 HtmlPage page = (HtmlPage) breaker.invoke(wrapper);
84    
85 torben 350
86     boolean currentStation = false;
87     boolean currentStationSaved = false;
88    
89     List<HtmlElement> tables = page.getDocumentElement().getElementsByAttribute("table", "class", "Rute");
90     if (tables.size() == 1) {
91     HtmlElement timetable = tables.get(0);
92     DomNodeList<HtmlElement> rows = timetable.getElementsByTagName("tr");
93    
94     for (int i=0; i<rows.size(); i++) {
95     if (i==0) //First row is column headers
96     continue;
97    
98    
99     HtmlElement row = rows.get(i);
100     DomNodeList<HtmlElement> fields = row.getElementsByTagName("td");
101    
102     if (currentStationSaved == false && fields.get(0).getAttribute("class").equalsIgnoreCase("Tidsstreg")) {
103     currentStation = true;
104     continue;
105     }
106    
107     TimetableBean bean = new TimetableBean();
108     bean.setStation( fields.get(0).asText() );
109     bean.setArrival( fields.get(1).asText() );
110     bean.setDeparture( fields.get(2).asText() );
111    
112     if (currentStation == true && currentStationSaved == false ) {
113     bean.setCurrent(currentStation);
114     currentStationSaved = true;
115     }
116    
117     timetableList.add(bean);
118    
119     }
120    
121     } else {
122     logger.warning("No time table found, trainID=" + trainID + " type=" + type);
123     }
124 torben 591 webClient.closeAllWindows();
125 torben 350
126     return timetableList;
127     }
128    
129     }

  ViewVC Help
Powered by ViewVC 1.1.20