package dk.thoerup.traininfoservice.banedk; import java.io.IOException; 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.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; @Override public void init() throws ServletException { super.init(); 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(); try { TimetableBean timetable = fetcher.cachedLookupTimetable(train, type); String responseXML = formatTimetable(timetable); response.setContentType("text/xml"); response.getWriter().print(responseXML); } catch (java.io.IOException ioe) { logger.warning("(timetable) Read failed, type=" + type + ", train="+train + ". " + ioe.getMessage()); Statistics.getInstance().incrementTimetableErrors(); response.sendError(500, "Backend timed out"); } catch (CircuitBreakerException cbe) { logger.warning("Circuitbreaker - failing fast, type=" + type + ", train="+train); Statistics.getInstance().incrementTimetableErrors(); response.sendError(500); }catch (Exception e) { logger.log(Level.WARNING, "failure looking up timetable: type=" + type + ",train=" +train, e); Statistics.getInstance().incrementTimetableErrors(); response.sendError(500); } } 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); } return out.toString(); } }