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

Contents of /android/TrainInfoService/src/dk/thoerup/traininfoservice/LocateStations.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 348 - (show annotations) (download)
Sun Sep 27 19:14:39 2009 UTC (14 years, 7 months ago) by torben
File size: 4563 byte(s)
Improve on error handling and logging
1 package dk.thoerup.traininfoservice;
2
3 import java.io.IOException;
4 import java.sql.Connection;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import java.util.logging.Level;
9 import java.util.logging.Logger;
10
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 import dk.thoerup.traininfoservice.DBConnection;
17
18 /**
19 * Servlet implementation class LocateStations
20 */
21 public class LocateStations extends HttpServlet {
22 private static final long serialVersionUID = 1L;
23
24 Logger logger = Logger.getLogger( LocateStations.class.toString() );
25
26 /**
27 * @see HttpServlet#HttpServlet()
28 */
29 public LocateStations() {
30 super();
31 // TODO Auto-generated constructor stub
32 }
33
34 public enum Requested {
35 BY_NAME,
36 BY_LOCATION,
37 NONE
38 }
39
40
41 protected String getStations(Connection conn, double latitude, double longitude, String name, Requested method) throws SQLException {
42 String SQL = "";
43 PreparedStatement stmt = null;
44 ResultSet res = null;
45
46 StringBuffer buff = new StringBuffer();
47
48 buff.append("<?xml version=\"1.0\" ?>\n");
49 buff.append("<stations>\n");
50
51 try
52 {
53
54 switch (method)
55 {
56 case BY_LOCATION:
57 //inner select is workaround from not being able to use a calculated column directly in where clause
58 SQL = "SELECT * FROM ( "+
59 " SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, " +
60 " earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " +
61 " FROM trainstations " +
62 " WHERE latitude IS NOT NULL AND longitude IS NOT NULL " +
63 " ) AS trainstations2 " +
64 "ORDER BY calcdist ASC " +
65 "LIMIT 4 ";
66 stmt = conn.prepareStatement(SQL);
67 stmt.setDouble(1, latitude);
68 stmt.setDouble(2, longitude);
69
70 break;
71 case BY_NAME:
72 SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog,0.0 " +
73 "FROM trainstations " +
74 "WHERE name ILIKE ? AND latitude IS NOT NULL AND longitude IS NOT NULL " +
75 "ORDER BY name ";
76 stmt = conn.prepareStatement(SQL);
77 stmt.setString(1, "%" + name + "%");
78 break;
79 default:
80 // This should not be possible
81 logger.severe("getStations(): default switch case");
82 }
83
84
85
86
87 res = stmt.executeQuery();
88
89 while (res.next()) {
90 buff.append("<station>\n");
91
92 buff.append("<id>").append( res.getInt(1) ).append("</id>\n");
93 buff.append("<name>").append( res.getString(2) ) .append("</name>\n");
94 buff.append("<latitude>").append( res.getDouble(3) ) .append("</latitude>\n");
95 buff.append("<longitude>").append( res.getDouble(4) ) .append("</longitude>\n");
96 res.getString(5);
97 buff.append("<fjerntog>").append( !res.wasNull() ) .append("</fjerntog>\n");
98 res.getString(6);
99 buff.append("<stog>").append( !res.wasNull() ) .append("</stog>\n");
100 buff.append("<calcdist>").append( res.getInt(7) ) .append("</calcdist>\n");
101
102 buff.append("</station>\n");
103 }
104 } finally {
105 if (res != null && !res.isClosed())
106 res.close();
107 if (stmt != null && !stmt.isClosed())
108 stmt.close();
109 }
110 buff.append("</stations>\n");
111 return buff.toString();
112 }
113
114 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
115
116 double longitude = 0.0;
117 double latitude = 0.0;
118 String name = "";
119
120 Requested method = Requested.NONE;
121
122 if (request.getParameter("latitude") != null && request.getParameter("latitude") != null) {
123 latitude = Double.parseDouble( request.getParameter("latitude") );
124 longitude = Double.parseDouble( request.getParameter("longitude") );
125 method = Requested.BY_LOCATION;
126 }
127
128 if (request.getParameter("name") != null) {
129 name = request.getParameter("name");
130 method = Requested.BY_NAME;
131 }
132
133
134 if (method != Requested.NONE) {
135
136 Connection conn = null;
137 try {
138 conn = DBConnection.getConnection();
139
140 String xml = getStations(conn, latitude, longitude, name, method);
141
142 response.setContentType("text/xml");
143 response.getWriter().print(xml);
144
145 conn.close();
146 conn = null;
147
148 } catch (Exception e) {
149 logger.log(Level.SEVERE, "Exception while finding stations", e);
150 response.sendError(500);
151 } finally {
152 try {
153 if (conn != null)
154 conn.close();
155 } catch (Throwable t) {}
156 }
157 } else {
158 response.sendError(400, "not enough parameters");
159 }
160 }
161
162 }

  ViewVC Help
Powered by ViewVC 1.1.20