--- android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2009/09/28 21:33:24 350 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2010/05/05 20:11:03 711 @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; @@ -9,6 +10,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import dk.thoerup.circuitbreaker.CircuitBreakerException; +import dk.thoerup.traininfoservice.Statistics; + /** * Servlet implementation class TimetableServlet */ @@ -18,34 +22,64 @@ Logger logger = Logger.getLogger( TimetableServlet.class.getName() ); - TimetableFetcher fetcher = new TimetableFetcher(); + 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"); - String sections[] = train.split(" "); - if (sections.length != 2) { - response.sendError(400, "Invalid parameter"); - return; + 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]; } - String type = lookupType(sections[0]); - String trainID = sections[1]; try { - List timetable = fetcher.lookupTimetable(trainID, type); + List timetable = fetcher.cachedLookupTimetable(trainID, type); String responseXML = formatTimetable(timetable); response.setContentType("text/xml"); response.getWriter().print(responseXML); - } catch (Exception e) { - logger.warning("failure looking up timetable: train=" +train); - throw new ServletException(e); + } 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();