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 dk.thoerup.circuitbreaker.CircuitBreaker; import dk.thoerup.circuitbreaker.CircuitBreakerManager; import dk.thoerup.traininfoservice.StationBean; import dk.thoerup.traininfoservice.StationDAO; import dk.thoerup.traininfoservice.Statistics; public class MetroFetcher { public static class MetroEntry { String metro; String destination; String minutes; } public static class MetroBean { String head; String operationInfo; //driftsinfo String plan; // koereplan List entries = new ArrayList(); } Logger logger = Logger.getLogger(MetroFetcher.class.getName()); StationDAO stationDAO = new StationDAO(); Map cache = new TimeoutMap(1000); 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 { StationBean 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"); 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