package dk.thoerup.traininfoservice.banedk; import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dk.thoerup.circuitbreaker.CircuitBreakerException; import dk.thoerup.traininfoservice.Statistics; /** * Servlet implementation class TimetableServlet */ public class TimetableServlet extends HttpServlet { private static final long serialVersionUID = 1L; Logger logger = Logger.getLogger( TimetableServlet.class.getName() ); TimetableFetcher fetcher; @Override public void init() throws ServletException { super.init(); boolean useTempSite = Boolean.parseBoolean( getServletContext().getInitParameter("usetempsite") ); int cacheTimeout = Integer.parseInt( getServletContext().getInitParameter("cache_timeout") ); logger.info( "TimetableServlet, use temp site=" + useTempSite + ", cache=" + cacheTimeout); fetcher = new TimetableFetcher(useTempSite,cacheTimeout); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getParameter("train") == null) { response.sendError(400, "not enough parameters"); return; } Statistics.getInstance().incrementTimetableLookups(); String train = request.getParameter("train").trim(); String trainID; String type = request.getParameter("type"); if (type != null) { trainID = train; } else { //remove this failover sometime after release of client 0.6.4 String sections[] = train.split(" "); if (sections.length != 2) { response.sendError(400, "Invalid parameter"); return; } type = lookupType(sections[0]); trainID = sections[1]; } try { List timetable = fetcher.cachedLookupTimetable(trainID, type); String responseXML = formatTimetable(timetable); response.setContentType("text/xml"); response.getWriter().print(responseXML); } catch (java.io.IOException ioe) { logger.warning("(timetable) Read failed, train="+train + ". " + ioe.getMessage()); response.sendError(500, "Backend timed out"); } catch (CircuitBreakerException cbe) { logger.warning("Circuitbreaker - failing fast"); response.sendError(500); }catch (Exception e) { logger.log(Level.WARNING, "failure looking up timetable: train=" +train, e); response.sendError(500); } } /*remove /outcomment/deprecate after 0.6.4 release */ String lookupType(String trainCode) { trainCode = trainCode.toLowerCase(); if (trainCode.equals("a") || trainCode.equals("b") || trainCode.equals("bx") || trainCode.equals("c") || trainCode.equals("e") || trainCode.equals("f") || trainCode.equals("h")) { return "S2"; } else { return "FJRN"; } } String formatTimetable(List timetable) { StringBuffer sb = new StringBuffer(); sb.append(""); for (TimetableBean bean : timetable) { sb.append(""); sb.append("").append( bean.getStation() ).append(""); sb.append("").append( bean.getArrival() ).append(""); sb.append("").append( bean.getDeparture() ).append(""); sb.append(""); } sb.append(""); return sb.toString(); } }