package dk.thoerup.traininfoservice.banedk; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Logger; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; import dk.thoerup.circuitbreaker.CircuitBreaker; import dk.thoerup.circuitbreaker.CircuitBreakerManager; import dk.thoerup.traininfoservice.StationDAO; import dk.thoerup.traininfoservice.Statistics; import dk.thoerup.traininfoservice.StationBean.StationEntry; public class MetroFetcher { @Root(name="entry") public static class MetroEntry { @org.simpleframework.xml.Element String metro; @org.simpleframework.xml.Element String destination; @org.simpleframework.xml.Element String minutes; } @Root(name="metrodepatures") public static class MetroBean { @org.simpleframework.xml.Element String head; @org.simpleframework.xml.Element(name="operations") String operationInfo; //driftsinfo @ElementList List entries = new ArrayList(); @org.simpleframework.xml.Element String plan; // koereplan } Logger logger = Logger.getLogger(MetroFetcher.class.getName()); StationDAO stationDAO = new StationDAO(); Map cache = new TimeoutMap(60000); //TODO: make metro cache timeout configurable public MetroBean cachedLookupMetroDepartures(int stationID) throws Exception { final String key = "metro:" + stationID; MetroBean metroBean = cache.get(key); if (metroBean == null) { metroBean = lookupMetroDepartures(stationID); cache.put(key, metroBean); } else { Statistics.getInstance().incrementDepartureCacheHits(); logger.info("Metro: Cache hit " + key); //remove before production } return metroBean; } public MetroBean lookupMetroDepartures(int stationID) throws Exception { StationEntry station = stationDAO.getById(stationID) ; URL url = new URL("http://www.m.dk/layouts/Metro/Widgets/MetroWidget.ashx?StationId=" + station.getMetro() + "&Congestion=true&Application=MyMetro&Expiration=true"); logger.fine("URL:" + url); JsoupInvocation wrapper = new JsoupInvocation( url, 3000); CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("metro"); Document doc = (Document) breaker.invoke(wrapper); MetroBean bean = new MetroBean(); bean.head = doc.getElementsByClass("metro-widget-headline").get(0).text(); Element content = doc.getElementsByClass("metro-widget-content").get(0); Elements contentElems = content.children(); Element departureTable = content.getElementsByTag("table").get(0); Elements rows = departureTable.getElementsByTag("tr"); for (int i=1; i