--- android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2010/09/02 18:37:49 1026 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/TimetableServlet.java 2011/04/23 08:01:57 1373 @@ -1,7 +1,8 @@ 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; @@ -11,8 +12,14 @@ 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 @@ -31,11 +38,9 @@ public void init() throws ServletException { super.init(); - boolean useTempSite = Boolean.parseBoolean( getServletContext().getInitParameter("usetempsite") ); - int cacheTimeout = Integer.parseInt( getServletContext().getInitParameter("cache_timeout") ); - int replyTimeout = Integer.parseInt( getServletContext().getInitParameter("reply_timeout") ); - logger.info( "TimetableServlet, use temp site=" + useTempSite + ", cache=" + cacheTimeout); - fetcher = new TimetableFetcher(useTempSite,cacheTimeout,replyTimeout); + + TraininfoSettings settings = (TraininfoSettings) getServletContext().getAttribute("settings"); + fetcher = new TimetableFetcher(settings); } @Override @@ -52,54 +57,54 @@ String train = request.getParameter("train").trim(); String type = request.getParameter("type").trim(); - + + + TimetableBean timetable = null; try { - List timetable = fetcher.cachedLookupTimetable(train, type); - - String responseXML = formatTimetable(timetable); + timetable = fetcher.cachedLookupTimetable(train, type); - 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"); + timetable = generateErrorBean(1); } catch (CircuitBreakerException cbe) { - logger.warning("Circuitbreaker - failing fast"); - Statistics.getInstance().incrementTimetableErrors(); - response.sendError(500); + 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); + } + } - String formatTimetable(List timetable) { - StringBuffer sb = new StringBuffer(); - //sb.append("\n"); - - 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("").append( bean.getStationId() ).append(""); - //sb.append("").append( bean.isCancelled() ).append(""); - sb.append(""); + protected TimetableBean generateErrorBean(int code) { + TimetableBean bean = new TimetableBean(); + bean.errorCode = code; + return bean; + } + + 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(); } }