/[projects]/android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/DepartureServlet.java
ViewVC logotype

Contents of /android/TrainInfoService/src/dk/thoerup/traininfoservice/banedk/DepartureServlet.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1248 - (show annotations) (download)
Thu Mar 31 17:13:19 2011 UTC (13 years, 1 month ago) by torben
File size: 5793 byte(s)
Add support for fetching just one of regional or s-tog departures
1 package dk.thoerup.traininfoservice.banedk;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.StringReader;
6 import java.io.StringWriter;
7 import java.util.logging.Level;
8 import java.util.logging.Logger;
9
10 import javax.servlet.ServletException;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.xml.transform.Source;
16 import javax.xml.transform.Templates;
17 import javax.xml.transform.Transformer;
18 import javax.xml.transform.TransformerFactory;
19 import javax.xml.transform.stream.StreamResult;
20 import javax.xml.transform.stream.StreamSource;
21
22 import org.simpleframework.xml.Serializer;
23 import org.simpleframework.xml.core.Persister;
24
25 import dk.thoerup.android.traininfo.common.DepartureBean;
26 import dk.thoerup.circuitbreaker.CircuitBreakerException;
27 import dk.thoerup.traininfoservice.StationDAO;
28 import dk.thoerup.traininfoservice.Statistics;
29 import dk.thoerup.traininfoservice.banedk.DepartureFetcher.FetchTrainType;
30
31 /**
32 * Servlet implementation class DepartureServlet
33 */
34 @WebServlet(urlPatterns={"/DepartureServlet"})
35 public class DepartureServlet extends HttpServlet {
36 private static final long serialVersionUID = 1L;
37
38 Logger logger = Logger.getLogger( DepartureServlet.class.getName() );
39
40 DepartureFetcher fetcher;
41
42
43
44 TransformerFactory xslTransFact;
45 Templates xslTemplate;
46
47
48 @Override
49 public void init() throws ServletException {
50 super.init();
51
52 boolean useAzureSite = Boolean.parseBoolean( getServletContext().getInitParameter("useazuresite") );
53 int cacheTimeout = Integer.parseInt( getServletContext().getInitParameter("cache_timeout") );
54 int replyTimeout = Integer.parseInt( getServletContext().getInitParameter("reply_timeout") );
55 logger.info( "DepartureServlet, use azure site=" + useAzureSite + ", cache=" + cacheTimeout);
56 fetcher = new DepartureFetcher(useAzureSite, cacheTimeout, replyTimeout);
57
58 xslTransFact = TransformerFactory.newInstance();
59
60 String xslPath = getServletContext().getRealPath("/departures.xsl");
61 Source stylesheet = new StreamSource( new File(xslPath) );
62
63 try {
64 xslTemplate = xslTransFact.newTemplates(stylesheet);
65 } catch (Exception e) {
66 throw new ServletException(e);
67 }
68 }
69
70 @Override
71 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
72 if (req.getParameter("station") == null) {
73 resp.sendError(400, "not enough parameters (station)");
74 return;
75 }
76 if (req.getParameter("format") == null) {
77 resp.sendError(400, "not enough parameters (format)");
78 return;
79 }
80
81 boolean arrival = false;
82 try {
83 arrival = Integer.parseInt( req.getParameter("arrival")) != 0;
84 } catch (Exception e) {}
85
86 Statistics.getInstance().incrementDepartureLookups();
87
88 int station = Integer.parseInt( req.getParameter("station") );
89 String format = req.getParameter("format");
90
91 DepartureBean beans;
92
93 DepartureFetcher.FetchTrainType type = FetchTrainType.BOTH;
94 if ( req.getParameter("type") != null) {
95 type = FetchTrainType.valueOf( req.getParameter("type") );
96 }
97
98 try {
99 beans = fetcher.cachedLookupDepartures(station, arrival, type);
100 beans.arrival = arrival;
101 } catch (java.io.IOException ioe) {
102 logger.warning("Read failed, station="+station + ". " + ioe.getMessage() );
103 Statistics.getInstance().incrementDepartureErrors();
104 resp.sendError(500);
105 return;
106 } catch (CircuitBreakerException cbe) {
107 logger.warning("Circuitbreaker - failing fast, station=" +station);
108 Statistics.getInstance().incrementDepartureErrors();
109 resp.sendError(500);
110 return;
111 } catch (StationDAO.NostationException nse) {
112 logger.log(Level.WARNING, "Station not in Database, station=" +station);
113 Statistics.getInstance().incrementDepartureErrors();
114 resp.sendError(400, "invalid station ID");
115 return;
116 } catch (Exception e) {
117 logger.log(Level.WARNING, "Unknown exception, station=" +station, e);
118 Statistics.getInstance().incrementDepartureErrors();
119 resp.sendError(500);
120 return;
121 }
122
123 resp.setDateHeader("Expires", 0);
124 resp.setHeader("Cache-Control", "no-cache, must-revalidate");
125
126 if (format.equalsIgnoreCase("xml")) {
127 resp.setContentType("text/xml");
128 resp.getWriter().print( formatXml(beans) );
129 } else if (format.equalsIgnoreCase("html")) {
130
131 String advStr = req.getParameter("advanced");
132 boolean advanced = advStr != null ? Boolean.parseBoolean(advStr) : false;
133
134 req.setAttribute("advanced", advanced);
135 req.setAttribute("departurebeans", beans);
136 req.setAttribute("stationID", station );
137 getServletContext().getRequestDispatcher("/ViewDepartures.jsp").forward(req,resp);
138 /*resp.setContentType("text/html");
139 resp.getWriter().print( xmlToHtml(formatXml(beans)) );*/
140 } else {
141 resp.sendError(400, "Unknown format");
142 }
143
144 }
145
146 protected String formatXml(DepartureBean beans) throws ServletException{
147
148 Serializer serializer = new Persister();
149
150 StringWriter out = new StringWriter();
151
152 try {
153 serializer.write(beans, out);
154 } catch (Exception e) {
155 throw new ServletException(e);
156 }
157
158 return out.toString();
159 }
160
161 protected String xmlToHtml(String input) throws ServletException {
162
163 try {
164 Transformer trans = xslTemplate.newTransformer();
165
166
167 Source xml = new StreamSource( new StringReader(input));
168 StringWriter out = new StringWriter();
169 trans.transform(xml, new StreamResult(out));
170
171 return out.toString();
172 } catch (Exception e) {
173 throw new ServletException(e);
174 }
175 }
176
177 }

  ViewVC Help
Powered by ViewVC 1.1.20