--- android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/DepartureFetcher.java 2009/09/28 19:14:18 349 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/DepartureFetcher.java 2009/10/22 06:04:45 468 @@ -6,19 +6,38 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.logging.Logger; -import com.gargoylesoftware.htmlunit.ProxyConfig; 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.circuitbreaker.CircuitBreaker; +import dk.thoerup.circuitbreaker.CircuitBreakerManager; import dk.thoerup.traininfoservice.DBConnection; public class DepartureFetcher { Logger logger = Logger.getLogger(DepartureFetcher.class.getName()); + + Map> cache = new TimeoutMap>(120 * 1000); + + + + public List cachedLookupDepartures(int stationID) throws Exception { + + List list = cache.get(stationID); + + if (list == null) { + list = lookupDepartures(stationID); + cache.put(stationID, list); + } else { + logger.info("Departure: Cache hit " + stationID); //remove before production + } + return list; + } public List lookupDepartures(int stationID) throws Exception { @@ -63,11 +82,14 @@ List departureList = new ArrayList(); final WebClient webClient = new WebClient(); - webClient.setTimeout(1000); + webClient.setTimeout(2500); webClient.setJavaScriptEnabled(false); + String uri = "http://www.bane.dk/visStation.asp?ArtikelID=4275&W=" + type + "&S=" + stationcode; + BanedkInvocation wrapper = new BanedkInvocation(webClient, uri); + CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); - final HtmlPage page = webClient.getPage("http://www.bane.dk/visStation.asp?ArtikelID=4275&W=" + type + "&S=" + stationcode); + HtmlPage page = (HtmlPage) breaker.invoke(wrapper); HtmlElement table = page.getElementById("afgangtabel"); @@ -82,13 +104,15 @@ DepartureBean departure = new DepartureBean(); String time = fields.get(0).asText(); + if (time.equals("")) + time = "0:00"; //Bane.dk bug work-around departure.setTime(time); int updated = extractUpdated( fields.get(1) ); departure.setUpdated(updated); String trainNumber = fields.get(2).asText(); - if (trainNumber.trim().length() == 1) + if (type.equalsIgnoreCase("S2")) //If it is S-train we need to extract the trainNumber trainNumber = trainNumber + " " + extractTrainNumber(fields.get(2)); departure.setTrainNumber(trainNumber); @@ -165,7 +189,7 @@ } //test - public static void main(String args[]) throws Exception{ + public static void main(String args[]) throws Exception { DepartureFetcher f = new DepartureFetcher(); List deps = f.lookupDepartures("AR", "FJRN"); for(DepartureBean d : deps) {