package dk.thoerup.traininfoservice.banedk; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; 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.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; @WebServlet(urlPatterns={"/CompareStationsTritinfo"}) public class CompareStationsTritinfo extends HttpServlet { private static final long serialVersionUID = 1L; Logger logger = Logger.getLogger( CompareStationsTritinfo.class.getName() ); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = "http://tritinfo.pallas.dk/webtavle?page=listcontent"; logger.fine("URI:" + uri); JsoupInvocation wrapper = new JsoupInvocation( new URL(uri), 5000 ); CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("tritinfo"); try { Map tritStations = new HashMap(); PrintWriter writer = resp.getWriter(); Element page = (Element) breaker.invoke(wrapper); Elements stationlistElements = page.getElementsByClass("stationlist"); Element stationlist = stationlistElements.get(0); Elements links = stationlist.getElementsByTag("a"); for(Element link : links ) { String name = link.text(); String href = link.attr("href"); String hrefParts[] = href.split("="); String idStr = hrefParts[2]; int id = Integer.parseInt(idStr); tritStations.put(id, name); //writer.write(name + "=" + id + "\n"); } //writer.write("" + stationlist.html()); //writer.write("\nDump:" + tritStations.toString() ); Map dbStations = getDbTritStations(); /////// // Data is collected now compare writer.write("

Tritinfo Station compare

"); writer.write("tritinfo.pallas.dk/"); writer.write("

Stations on web not in DB

"); writer.write("
    "); for (Integer webId : tritStations.keySet()) { if ( !dbStations.containsKey(webId)) { String webName = tritStations.get(webId); writer.write("
  • " + webName + " : " + webId + "
  • "); } } writer.write("
"); //////////// writer.write("

Stations in db not on web

"); writer.write("
    "); for (Integer dbId : dbStations.keySet()) { if (! tritStations.containsKey(dbId)) { StationEntry dbName = dbStations.get(dbId); writer.write("
  • " + dbName.getName() + " : " + dbId + "
  • "); } } writer.write("
"); } catch (Exception e) { throw new ServletException("JSoup failed", e); } } /* * Fetch a list of all DB station entries with a tritinfo ID */ Map getDbTritStations() throws SQLException { Map result = new HashMap(); StationDAO dao = new StationDAO(); StationBean allStations = dao.dumpAll(); for(StationEntry entry : allStations.entries) { if (entry.getTritStation() != -1) { result.put( entry.getTritStation(), entry); } } return result; } }