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

Annotation of /android/TrainInfoServiceGoogle/src/dk/thoerup/traininfoservice/banedk/DepartureServlet.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1092 - (hide annotations) (download)
Tue Sep 21 16:45:24 2010 UTC (13 years, 8 months ago) by torben
File size: 5080 byte(s)
- Cache the XSLT template
- Use a StringWriter for XML output instead of ByteArrayOutputStream (the stringwriter is giving correct charset on app engine)

1 torben 307 package dk.thoerup.traininfoservice.banedk;
2    
3 torben 1075 import java.io.ByteArrayInputStream;
4 torben 1060 import java.io.ByteArrayOutputStream;
5 torben 1075 import java.io.File;
6 torben 307 import java.io.IOException;
7 torben 1092 import java.io.StringWriter;
8 torben 348 import java.util.logging.Level;
9     import java.util.logging.Logger;
10 torben 307
11     import javax.servlet.ServletException;
12     import javax.servlet.http.HttpServlet;
13     import javax.servlet.http.HttpServletRequest;
14     import javax.servlet.http.HttpServletResponse;
15 torben 1075 import javax.xml.transform.Source;
16 torben 1092 import javax.xml.transform.Templates;
17 torben 1075 import javax.xml.transform.Transformer;
18 torben 307 import javax.xml.transform.TransformerFactory;
19 torben 1075 import javax.xml.transform.stream.StreamResult;
20     import javax.xml.transform.stream.StreamSource;
21 torben 307
22 torben 1060 import org.simpleframework.xml.core.Persister;
23 torben 307
24 torben 1061 import dk.thoerup.android.traininfo.common.DepartureBean;
25 torben 468 import dk.thoerup.circuitbreaker.CircuitBreakerException;
26 torben 711 import dk.thoerup.traininfoservice.Statistics;
27 torben 307
28     /**
29     * Servlet implementation class DepartureServlet
30     */
31 torben 1080
32 torben 307 public class DepartureServlet extends HttpServlet {
33     private static final long serialVersionUID = 1L;
34 torben 348
35     Logger logger = Logger.getLogger( DepartureServlet.class.getName() );
36 torben 307
37 torben 580 DepartureFetcher fetcher;
38 torben 1075
39    
40 torben 307
41 torben 1075
42 torben 1092
43     TransformerFactory xslTransFact;
44     Templates xslTemplate;
45 torben 307
46 torben 425 @Override
47 torben 580 public void init() throws ServletException {
48     super.init();
49 torben 584
50 torben 1034 boolean useAzureSite = Boolean.parseBoolean( getServletContext().getInitParameter("useazuresite") );
51 torben 584 int cacheTimeout = Integer.parseInt( getServletContext().getInitParameter("cache_timeout") );
52 torben 1026 int replyTimeout = Integer.parseInt( getServletContext().getInitParameter("reply_timeout") );
53 torben 1036 logger.info( "DepartureServlet, use azure site=" + useAzureSite + ", cache=" + cacheTimeout);
54 torben 1034 fetcher = new DepartureFetcher(useAzureSite, cacheTimeout, replyTimeout);
55 torben 1075
56 torben 1092
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 torben 580 }
69    
70     @Override
71 torben 711 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
72 torben 458 if (req.getParameter("station") == null) {
73     resp.sendError(400, "not enough parameters");
74     return;
75     }
76 torben 829
77     boolean arrival = false;
78     try {
79     arrival = Integer.parseInt( req.getParameter("arrival")) != 0;
80     } catch (Exception e) {}
81    
82 torben 711 Statistics.getInstance().incrementDepartureLookups();
83 torben 458
84 torben 307 int station = Integer.parseInt( req.getParameter("station") );
85     String format = req.getParameter("format");
86    
87 torben 1021 DepartureBean beans;
88 torben 307
89     try {
90 torben 829 beans = fetcher.cachedLookupDepartures(station, arrival);
91 torben 1074 beans.arrival = arrival;
92 torben 462 } catch (java.io.IOException ioe) {
93     logger.warning("Read failed, station="+station + ". " + ioe.getMessage() );
94 torben 716 Statistics.getInstance().incrementDepartureErrors();
95 torben 348 resp.sendError(500);
96     return;
97 torben 421 } catch (CircuitBreakerException cbe) {
98     logger.warning("Circuitbreaker - failing fast");
99 torben 716 Statistics.getInstance().incrementDepartureErrors();
100 torben 421 resp.sendError(500);
101     return;
102 torben 451 } catch (Exception e) {
103 torben 348 logger.log(Level.WARNING, "Unknown exception, station=" +station, e);
104 torben 716 Statistics.getInstance().incrementDepartureErrors();
105 torben 348 resp.sendError(500);
106     return;
107 torben 307 }
108    
109     resp.setDateHeader("Expires", 0);
110     resp.setHeader("Cache-Control", "no-cache, must-revalidate");
111    
112     if (format.equalsIgnoreCase("xml")) {
113 torben 1092 resp.setContentType("text/xml; charset=utf-8");
114 torben 1074 resp.getWriter().print( formatXml(beans) );
115 torben 1092
116    
117 torben 307 } else if (format.equalsIgnoreCase("html")) {
118 torben 1075 /*
119 torben 585 String advStr = req.getParameter("advanced");
120     boolean advanced = advStr != null ? Boolean.parseBoolean(advStr) : false;
121    
122     req.setAttribute("advanced", advanced);
123 torben 307 req.setAttribute("departurebeans", beans);
124     req.setAttribute("stationID", station );
125 torben 1075 getServletContext().getRequestDispatcher("/ViewDepartures.jsp").forward(req,resp);*/
126     resp.setContentType("text/html");
127     resp.getWriter().print( xmlToHtml(formatXml(beans)) );
128 torben 307 } else {
129 torben 862 resp.sendError(400, "Unknown format");
130 torben 307 }
131    
132     }
133    
134 torben 1074 protected String formatXml(DepartureBean beans) throws ServletException{
135 torben 1060
136 torben 1092 Persister serializer = new Persister();
137 torben 307
138 torben 1092
139     StringWriter out = new StringWriter();
140    
141     try {
142 torben 1060 serializer.write(beans, out);
143 torben 307 } catch (Exception e) {
144     throw new ServletException(e);
145     }
146 torben 1060
147     return out.toString();
148 torben 307 }
149 torben 1075
150 torben 1092 protected String xmlToHtml(String input) throws ServletException {
151 torben 307
152 torben 1092 try {
153     Transformer trans = xslTemplate.newTransformer();
154 torben 1075
155     Source xml = new StreamSource( new ByteArrayInputStream(input.getBytes() ));
156     ByteArrayOutputStream out = new ByteArrayOutputStream();
157     trans.transform(xml, new StreamResult(out));
158    
159     return out.toString();
160     } catch (Exception e) {
161 torben 1092 throw new ServletException(e);
162 torben 1075 }
163     }
164    
165 torben 307 }

  ViewVC Help
Powered by ViewVC 1.1.20