package dk.thoerup.traininfoservice.banedk; import java.net.URL; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Level; 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.StationDAO; import dk.thoerup.traininfoservice.Statistics; public class TimetableFetcher { Map> cache; Map stationCache; StationDAO stationDao = new StationDAO(); Logger logger = Logger.getLogger(TimetableFetcher.class.getName()); private boolean useTempSite; public TimetableFetcher(boolean tmpSite, int cacheTimeout) { useTempSite = tmpSite; cache = new TimeoutMap>(cacheTimeout); stationCache = new TimeoutMap( 3*60*60*1000 ); } 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 { Statistics.getInstance().incrementTimetableCacheHits(); logger.info("Timetable: Cache hit " + trainID); } return list; } List lookupTimetable(String trainID, String type) throws Exception { if (useTempSite == false ){ return lookupTimetableRealSite(trainID, type); } else { return new ArrayList(); // no timetable data on temp site } } int getStationId(String name) { Integer id = stationCache.get(name); if (id == null) { try { id = stationDao.getIdByName(name); stationCache.put(name, id); } catch (SQLException e) { logger.log(Level.SEVERE, "getStationId failed", e); id = -1; } } return id; } List lookupTimetableRealSite(String trainID, String type) throws Exception { List timetableList = new ArrayList(); //String url = "http://www.bane.dk/visRute.asp?W=" + type + "&TogNr=" + trainID + "&artikelId=4276"; String url = "http://trafikinfo.bane.dk/TrafikInformation/Ruteplan/" + trainID; JsoupInvocation wrapper = new JsoupInvocation( new URL(url) , 2500); CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); Document doc = (Document) breaker.invoke(wrapper); boolean currentStation = false; boolean currentStationSaved = false; Elements tables = doc.getElementsByClass("Rute"); if (tables.size() == 1) { Element timetable = tables.get(0); Elements rows = timetable.getElementsByTag("tr"); for (int i=0; i0 && i