package dk.thoerup.traininfoservice.banedk; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Logger; import com.gargoylesoftware.htmlunit.Page; import com.gargoylesoftware.htmlunit.RefreshHandler; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.DomNodeList; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlPage; import dk.thoerup.curcuitbreaker.CircuitBreaker; import dk.thoerup.curcuitbreaker.CircuitBreakerManager; public class TimetableFetcher { class NullRefreshHandler implements RefreshHandler { public void handleRefresh(Page arg0, URL arg1, int arg2) throws IOException { } } Map> cache = new TimeoutMap>(120 * 1000); Logger logger = Logger.getLogger(TimetableFetcher.class.getName()); List cachedLookupTimetable(String trainID, String type) throws Exception { String key = trainID+type; List list = cache.get(key); if (list == null) { list = lookupTimetable(trainID,type); cache.put(key, list); } else { logger.info("Timetable: Cache hit " + trainID); } return list; } List lookupTimetable(String trainID, String type) throws Exception { List timetableList = new ArrayList(); String url = "http://www.bane.dk/visRute.asp?W=" + type + "&TogNr=" + trainID + "&artikelId=4276"; final WebClient webClient = new WebClient(); webClient.setTimeout(2500); webClient.setJavaScriptEnabled(false); webClient.setRefreshHandler( new NullRefreshHandler() ); webClient.setCssEnabled(false); BanedkInvocation wrapper = new BanedkInvocation(webClient, url); CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); HtmlPage page = (HtmlPage) breaker.invoke(wrapper); boolean currentStation = false; boolean currentStationSaved = false; List tables = page.getDocumentElement().getElementsByAttribute("table", "class", "Rute"); if (tables.size() == 1) { HtmlElement timetable = tables.get(0); DomNodeList rows = timetable.getElementsByTagName("tr"); for (int i=0; i fields = row.getElementsByTagName("td"); if (currentStationSaved == false && fields.get(0).getAttribute("class").equalsIgnoreCase("Tidsstreg")) { currentStation = true; continue; } TimetableBean bean = new TimetableBean(); bean.setStation( fields.get(0).asText() ); bean.setArrival( fields.get(1).asText() ); bean.setDeparture( fields.get(2).asText() ); if (currentStation == true && currentStationSaved == false ) { bean.setCurrent(currentStation); currentStationSaved = true; } timetableList.add(bean); } } else { logger.warning("No time table found, trainID=" + trainID + " type=" + type); } return timetableList; } }