--- android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2009/10/01 08:31:47 378 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2011/04/28 10:13:36 1396 @@ -1,87 +1,111 @@ package dk.thoerup.traininfoservice.banedk; import java.io.IOException; -import java.util.List; +import java.io.StringWriter; + import java.util.logging.Level; 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.simpleframework.xml.Serializer; +import org.simpleframework.xml.core.Persister; + +import dk.thoerup.android.traininfo.common.DepartureBean; +import dk.thoerup.android.traininfo.common.TimetableBean; +import dk.thoerup.circuitbreaker.CircuitBreakerException; +import dk.thoerup.traininfoservice.Statistics; +import dk.thoerup.traininfoservice.TraininfoSettings;; + /** * Servlet implementation class TimetableServlet */ +@WebServlet(urlPatterns={"/TimetableServlet"}) public class TimetableServlet extends HttpServlet { private static final long serialVersionUID = 1L; Logger logger = Logger.getLogger( TimetableServlet.class.getName() ); - TimetableFetcher fetcher = new TimetableFetcher(); + TimetableFetcher fetcher; - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String train = request.getParameter("train").trim(); + + @Override + public void init() throws ServletException { + super.init(); - String sections[] = train.split(" "); - if (sections.length != 2) { - response.sendError(400, "Invalid parameter"); + + TraininfoSettings settings = (TraininfoSettings) getServletContext().getAttribute("settings"); + fetcher = new TimetableFetcher(settings); + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getParameter("train") == null) { + response.sendError(400, "not enough parameters (train)"); + return; + } + if (request.getParameter("type") == null) { + response.sendError(400, "not enough parameters (type)"); return; } + Statistics.getInstance().incrementTimetableLookups(); + + String train = request.getParameter("train").trim(); + String type = request.getParameter("type").trim(); + - String type = lookupType(sections[0]); - String trainID = sections[1]; + TimetableBean timetable = null; try { - List timetable = fetcher.lookupTimetable(trainID, type); + timetable = fetcher.cachedLookupTimetable(train, type); + } catch (java.io.IOException ioe) { + logger.warning("(timetable) Read failed, type=" + type + ", train="+train + ". " + ioe.getMessage()); + Statistics.getInstance().incrementTimetableErrors(); + //timetable = generateErrorBean(1); + response.sendError( 500, "Backend didn't answer" ); + } catch (CircuitBreakerException cbe) { + logger.warning("Circuitbreaker - failing fast, type=" + type + ", train="+train); + Statistics.getInstance().incrementTimetableErrors(); + timetable = generateErrorBean(1); + }catch (Exception e) { + logger.log(Level.WARNING, "failure looking up timetable: type=" + type + ",train=" +train, e); + Statistics.getInstance().incrementTimetableErrors(); + response.sendError(500); + } + + if (timetable != null) { String responseXML = formatTimetable(timetable); response.setContentType("text/xml"); response.getWriter().print(responseXML); - } catch (java.net.SocketTimeoutException ste) { - logger.warning("(timetable) Read timed out, train="+train); - response.sendError(500, "Backend timed out"); - } catch (Exception e) { - logger.log(Level.WARNING, "failure looking up timetable: train=" +train, e); - response.sendError(500); } } - 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"; - } + protected TimetableBean generateErrorBean(int code) { + TimetableBean bean = new TimetableBean(); + bean.errorCode = code; + return bean; } - 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(""); + String formatTimetable(TimetableBean timetable) throws ServletException { + Serializer serializer = new Persister(); + + StringWriter out = new StringWriter(); + + try { + serializer.write(timetable, out); + } catch (Exception e) { + throw new ServletException(e); } - sb.append(""); - - return sb.toString(); + return out.toString(); } }