package dk.thoerup.traininfoservice.banedk; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import java.net.URLEncoder; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import dk.thoerup.android.traininfo.common.StationBean; import dk.thoerup.android.traininfo.common.StationEntry; import dk.thoerup.circuitbreaker.CircuitBreaker; import dk.thoerup.circuitbreaker.CircuitBreakerManager; import dk.thoerup.traininfoservice.db.StationDAO; import dk.thoerup.genericjavautils.TimeoutMap; @WebServlet(urlPatterns={"/CompareStations"}) public class CompareStations extends HttpServlet { private static final long serialVersionUID = 1L; Map cache = new TimeoutMap(600 * 1000); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String data = getData(request); PrintWriter out = response.getWriter(); out.print(data); System.out.println("CompareStations completed"); } catch (Exception e) { throw new ServletException(e); } } String getData(HttpServletRequest request) throws Exception { CircuitBreaker cb = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); JsoupInvocation jsoup = new JsoupInvocation(new URL("http://trafikinfo.bane.dk/Trafikinformation/Stationsliste"), 5000); Map banedkStations = new TreeMap(); Set dbStations = new TreeSet(); StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append(""); StationDAO dao = new StationDAO(); try { Document doc = (Document) cb.invoke(jsoup); Elements tables = doc.getElementsByClass("Oversigt"); for(Element e : tables) { if (e.tagName().equals("table") ){ Elements links = e.getElementsByTag("a"); for (Element link : links) { banedkStations.put( link.text(), link.attr("href") ); } } } sb.append("

Active stations in DB

\n"); sb.append("
    "); StationBean bean = dao.dumpAll(); for (StationEntry station : bean.entries) { if (station.isRegional() || station.isStrain()) { if (station.isRegional() ) { String id = URLEncoder.encode(station.getRegional(), "ISO-8859-1"); String uri = "/Trafikinformation/AfgangAnkomst/Afgang/" + id + "/Fjerntog"; String data = hasData(uri, true); sb.append( "
  • " + station.getName() + "  " + data + "
  • \n" ); } if (station.isStrain() ) { String id = URLEncoder.encode(station.getStrain(), "ISO-8859-1"); String uri = "/Trafikinformation/AfgangAnkomst/Afgang/" + id + "/S-Tog"; String data = hasData(uri, true); sb.append( "
  • " + station.getName() + "  " + data + "
  • \n" ); } dbStations.add(station.getName()); } } sb.append("
\n"); } catch (Exception e) { throw new ServletException(e); } sb.append("

stations on website not in db

\n"); sb.append("
    "); Set tmpDbStations = new TreeSet( dbStations ); Set tmpBanedkStations = new TreeSet( banedkStations.keySet()) ; tmpBanedkStations.removeAll(tmpDbStations); for(String s : tmpBanedkStations) { String uri = banedkStations.get(s); String disabled = ""; String data = hasData(uri, false); try { boolean tmpdisabled = dao.hasDisabledStation(s); if (tmpdisabled == true) disabled = " - disabled"; } catch (Exception e) { throw new ServletException(e); } sb.append( "
  • " + s + "  " + data + "" + disabled + "
  • \n" ); } sb.append("
"); sb.append("

stations in db not on website

"); sb.append("
    "); tmpDbStations = new TreeSet( dbStations ); tmpBanedkStations = new TreeSet( banedkStations.keySet() ) ; tmpDbStations.removeAll(tmpBanedkStations); for(String s : tmpDbStations) { sb.append( "
  • " + s + "
  • \n" ); } sb.append("
"); sb.append("\n"); return sb.toString(); } String hasData(String uri, boolean requiredata) { String key = uri + requiredata; String data = cache.get(key); if (data == null) { data = "unknown"; try { data = hasDataWorker(uri,requiredata); cache.put(key,data); } catch (Exception e) { System.out.println( e.getMessage() ); } } return data; } String hasDataWorker(String uri, boolean requiredata) throws Exception { String returnVal = ""; CircuitBreaker cb = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); JsoupInvocation jsoup = new JsoupInvocation(new URL("http://trafikinfo.bane.dk" + uri), 2000); Document doc = (Document) cb.invoke(jsoup); Element tabel = doc.getElementById("afgangtabel"); if ( tabel != null) { if (requiredata == true) { returnVal = ""; } else { returnVal = "Data!"; } } else { if (requiredata == true) { returnVal = "No data"; } else { returnVal = ""; } } return returnVal; } }