/[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 978 - (show annotations) (download)
Sat Jul 10 10:53:44 2010 UTC (13 years, 10 months ago) by torben
File size: 7313 byte(s)
Add code to extract notifications
1 package dk.thoerup.traininfoservice.banedk;
2
3 import java.io.IOException;
4 import java.util.logging.Level;
5 import java.util.logging.Logger;
6
7 import javax.servlet.ServletException;
8 import javax.servlet.annotation.WebServlet;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import javax.xml.parsers.DocumentBuilder;
13 import javax.xml.parsers.DocumentBuilderFactory;
14 import javax.xml.transform.OutputKeys;
15 import javax.xml.transform.Transformer;
16 import javax.xml.transform.TransformerFactory;
17 import javax.xml.transform.dom.DOMSource;
18 import javax.xml.transform.stream.StreamResult;
19
20 import org.w3c.dom.DOMImplementation;
21 import org.w3c.dom.Document;
22 import org.w3c.dom.Element;
23
24 import dk.thoerup.circuitbreaker.CircuitBreakerException;
25 import dk.thoerup.traininfoservice.StationDAO;
26 import dk.thoerup.traininfoservice.Statistics;
27
28 /**
29 * Servlet implementation class DepartureServlet
30 */
31 @WebServlet(urlPatterns={"/DepartureServlet"})
32 public class DepartureServlet extends HttpServlet {
33 private static final long serialVersionUID = 1L;
34
35 Logger logger = Logger.getLogger( DepartureServlet.class.getName() );
36
37 DepartureFetcher fetcher;
38 TransformerFactory transformerFactory = TransformerFactory.newInstance();
39 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
40
41
42 @Override
43 public void init() throws ServletException {
44 super.init();
45
46 boolean useTempSite = Boolean.parseBoolean( getServletContext().getInitParameter("usetempsite") );
47 int cacheTimeout = Integer.parseInt( getServletContext().getInitParameter("cache_timeout") );
48 logger.info( "DepartureServlet, use temp site=" + useTempSite + ", cache=" + cacheTimeout);
49 fetcher = new DepartureFetcher(useTempSite, cacheTimeout);
50 }
51
52 @Override
53 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
54 if (req.getParameter("station") == null) {
55 resp.sendError(400, "not enough parameters");
56 return;
57 }
58
59 boolean arrival = false;
60 try {
61 arrival = Integer.parseInt( req.getParameter("arrival")) != 0;
62 } catch (Exception e) {}
63
64 Statistics.getInstance().incrementDepartureLookups();
65
66 int station = Integer.parseInt( req.getParameter("station") );
67 String format = req.getParameter("format");
68
69 DepartureBean beans;
70
71 String stationName = StationDAO.getStationName(station);
72
73 try {
74 beans = fetcher.cachedLookupDepartures(station, arrival);
75 } catch (java.io.IOException ioe) {
76 logger.warning("Read failed, station="+station + ". " + ioe.getMessage() );
77 Statistics.getInstance().incrementDepartureErrors();
78 resp.sendError(500);
79 return;
80 } catch (CircuitBreakerException cbe) {
81 logger.warning("Circuitbreaker - failing fast");
82 Statistics.getInstance().incrementDepartureErrors();
83 resp.sendError(500);
84 return;
85 } catch (Exception e) {
86 logger.log(Level.WARNING, "Unknown exception, station=" +station, e);
87 Statistics.getInstance().incrementDepartureErrors();
88 resp.sendError(500);
89 return;
90 }
91
92 resp.setDateHeader("Expires", 0);
93 resp.setHeader("Cache-Control", "no-cache, must-revalidate");
94
95 if (format.equalsIgnoreCase("xml")) {
96 resp.setContentType("text/xml");
97 resp.getWriter().print( formatXml(beans, stationName, arrival) );
98 } else if (format.equalsIgnoreCase("html")) {
99
100 String advStr = req.getParameter("advanced");
101 boolean advanced = advStr != null ? Boolean.parseBoolean(advStr) : false;
102
103 req.setAttribute("advanced", advanced);
104 req.setAttribute("stationname", stationName );
105 req.setAttribute("departurebeans", beans);
106 req.setAttribute("stationID", station );
107 getServletContext().getRequestDispatcher("/ViewDepartures.jsp").forward(req,resp);
108 } else {
109 resp.sendError(400, "Unknown format");
110 }
111
112 }
113
114 protected String formatXml(DepartureBean beans, String stationName, boolean arrival) throws ServletException{
115 String xml = "";
116 try {
117 DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
118 DOMImplementation impl = builder.getDOMImplementation();
119
120
121 Document doc = impl.createDocument(null,null,null);
122 Element root = doc.createElement("departureinfo");
123 root.setAttribute("station", stationName);
124 root.setAttribute("arrival", Boolean.toString(arrival) );
125
126 for (String notif : beans.notifications) {
127 Element notElem = doc.createElement("notification");
128 notElem.setTextContent(notif);
129 root.appendChild(notElem);
130 }
131
132 for (DepartureEntry departure : beans.departureEntries) {
133 Element train = doc.createElement("train");
134
135 Element time = doc.createElement("time");
136 time.setTextContent( departure.getTime() );
137 train.appendChild(time);
138
139 Element updated = doc.createElement("updated");
140 updated.setTextContent( String.valueOf(departure.getUpdated()) );
141 train.appendChild(updated);
142
143 Element trainNumber = doc.createElement("trainnumber");
144 trainNumber.setTextContent( departure.getTrainNumber() );
145 train.appendChild(trainNumber);
146
147 Element destination = doc.createElement("destination");
148 destination.setTextContent( departure.getDestination());
149 train.appendChild(destination);
150
151 Element origin = doc.createElement("origin");
152 origin.setTextContent( departure.getOrigin() );
153 train.appendChild(origin);
154
155 Element location= doc.createElement("location");
156 location.setTextContent( departure.getLocation() );
157 train.appendChild(location);
158
159 Element status = doc.createElement("status");
160 status.setTextContent( departure.getStatus() );
161 train.appendChild(status);
162
163 Element note = doc.createElement("note");
164 note.setTextContent( departure.getNote() );
165 train.appendChild(note);
166
167 Element type = doc.createElement("type");
168 type.setTextContent( departure.getType() );
169 train.appendChild(type);
170
171 root.appendChild(train);
172 }
173
174 doc.appendChild(root);
175
176
177 DOMSource domSource = new DOMSource(doc);
178
179 Transformer transformer = transformerFactory.newTransformer();
180 //transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
181 transformer.setOutputProperty(OutputKeys.METHOD, "xml");
182 transformer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
183 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "1");
184 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
185 java.io.StringWriter sw = new java.io.StringWriter();
186 StreamResult sr = new StreamResult(sw);
187 transformer.transform(domSource, sr);
188 xml = sw.toString();
189
190
191 } catch (Exception e) {
192 throw new ServletException(e);
193 }
194 return xml;
195 }
196
197 }

  ViewVC Help
Powered by ViewVC 1.1.20