package dk.thoerup.traininfoservice.banedk; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import java.net.URLDecoder; 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 = ""; String uri = request.getParameter("uri"); if (uri != null) { boolean require = Boolean.parseBoolean( request.getParameter("requiredata") ); data = hasData(uri, require); } else { data = getData(request); } PrintWriter out = response.getWriter(); out.print(data); } 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 idToStation = new TreeMap(); Map stationToId = new TreeMap(); Map banedkStations = new TreeMap(); Set dbStations = new TreeSet(); StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append("\n"); sb.append("\n"); 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) { String name = link.text(); String href = link.attr("href"); String hrefParts[] = href.split("/"); String hrefCode = URLDecoder.decode(hrefParts[4], "UTF-8"); idToStation.put(hrefCode, name); stationToId.put(name, hrefCode); banedkStations.put( name, href ); } } } StationBean bean = dao.dumpAll(); //////////////////////////////// sb.append("

Duplicate ID's in DB

\n"); sb.append("
    "); Map stationIDS = new TreeMap(); for (StationEntry station : bean.entries) { if (station.isRegional()) { String id = station.getRegional(); String oldstation = stationIDS.get(id); if (oldstation == null) { stationIDS.put(id, station.getName()); } else { sb.append("
  • Duplicate found on key=" + id + " old station=" + oldstation + " current=" + station.getName()); } } if (station.isStrain()) { String id = station.getStrain(); String oldstation= stationIDS.get(id); if (oldstation == null) { stationIDS.put(id, station.getName()); } else { sb.append("
  • Duplicate found on key=" + id + " old station=" + oldstation + " current=" + station.getName()); } } } sb.append("
"); //////////////////////////////// sb.append("

Active stations in DB

\n"); sb.append("
    "); for (StationEntry station : bean.entries) { if (station.isRegional() || station.isStrain()) { String hrefCode = stationToId.get(station.getName()); if (hrefCode == null) hrefCode = "null"; String id = ""; String uri = ""; if (station.isRegional() ) { id = station.getRegional(); uri = "/Trafikinformation/AfgangAnkomst/Afgang/" + id + "/Fjerntog"; } if (station.isStrain() ) { id = station.getStrain(); uri = "/Trafikinformation/AfgangAnkomst/Afgang/" + id + "/S-Tog"; } String idMismatch = ""; if (!hrefCode.equals(id) ) { idMismatch = " ID Mismatch (DB="+id+ ", BaneDK=" + hrefCode + ")"; } sb.append( "
  • " + station.getName() + " " + idMismatch + "
  • \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 + " " + 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(""); 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 = ""; String parts[] = uri.split("\\/"); String id = URLEncoder.encode(parts[4], "ISO-8859-1"); String uri2 = "/TrafikInformation/AfgangAnkomst/Afgang/" + id + "/" + parts[5]; CircuitBreaker cb = CircuitBreakerManager.getManager().getCircuitBreaker("banedk"); JsoupInvocation jsoup = new JsoupInvocation(new URL("http://trafikinfo.bane.dk" + uri2), 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; } }