/[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 549 - (show annotations) (download)
Tue Jan 26 20:18:57 2010 UTC (14 years, 3 months ago) by torben
File size: 4973 byte(s)
Also report whether the station is a copenhagen metro station
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
9 import java.util.logging.Level;
10 import java.util.logging.Logger;
11
12 import javax.servlet.ServletException;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16
17 /**
18 * Servlet implementation class LocateStations
19 */
20 public class LocateStations extends HttpServlet {
21 private static final long serialVersionUID = 1L;
22
23 Logger logger = Logger.getLogger( LocateStations.class.toString() );
24
25
26
27 protected String transformToIntList(String input) {
28 String strings[] = input.split(",");
29
30 StringBuffer sb = new StringBuffer();
31 sb.append("(");
32 for (int i = 0; i<strings.length; i++) {
33 if (i>0) {
34 sb.append(",");
35 }
36 sb.append( Integer.parseInt(strings[i])); //by doing the integer conversion we ensure that it really is a integer
37 }
38 sb.append(")");
39 return sb.toString();
40 }
41
42
43 protected PreparedStatement createStatement(Connection conn, HttpServletRequest req) throws SQLException {
44
45 PreparedStatement stmt = null;
46 String SQL;
47
48 if (req.getParameter("latitude") != null && req.getParameter("latitude") != null) {
49 //inner select is workaround from not being able to use a calculated column directly in where clause
50 SQL = "SELECT * FROM ( "+
51 " SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, stationcode_metro, address," +
52 " earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " +
53 " FROM trainstations " +
54 " WHERE enabled = true " +
55 " ) AS trainstations2 " +
56 "ORDER BY calcdist ASC " +
57 "LIMIT 4 ";
58 double latitude = Double.parseDouble( req.getParameter("latitude") );
59 double longitude = Double.parseDouble( req.getParameter("longitude") );
60 stmt = conn.prepareStatement(SQL);
61 stmt.setDouble(1, latitude);
62 stmt.setDouble(2, longitude);
63 } else if (req.getParameter("name") != null) {
64 SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, stationcode_metro, address, 0.0 " +
65 "FROM trainstations " +
66 "WHERE name ILIKE ? AND enabled = true " +
67 "ORDER BY name ";
68
69 String name = req.getParameter("name").trim();
70 stmt = conn.prepareStatement(SQL);
71 stmt.setString(1, name + "%");
72 } else if (req.getParameter("list") != null) {
73 String list = transformToIntList( req.getParameter("list"));
74 SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog,stationcode_metro, address,0.0 " +
75 "FROM trainstations " +
76 "WHERE id IN " + list + " AND enabled = true " +
77 "ORDER BY name ";
78 stmt = conn.prepareStatement(SQL);
79 }
80
81 return stmt;
82 }
83
84
85 protected String formatResultset(PreparedStatement stmt) throws SQLException {
86 ResultSet res = null;
87
88 StringBuffer buff = new StringBuffer();
89
90 buff.append("<?xml version=\"1.0\" ?>\n");
91 buff.append("<stations>\n");
92
93 try
94 {
95 res = stmt.executeQuery();
96
97 while (res.next()) {
98 buff.append("<station>\n");
99
100 buff.append("<id>").append( res.getInt(1) ).append("</id>\n");
101 buff.append("<name>").append( res.getString(2) ) .append("</name>\n");
102 buff.append("<latitude>").append( res.getDouble(3) ) .append("</latitude>\n");
103 buff.append("<longitude>").append( res.getDouble(4) ) .append("</longitude>\n");
104 res.getString(5);
105 buff.append("<fjerntog>").append( !res.wasNull() ) .append("</fjerntog>\n");
106 res.getString(6);
107 buff.append("<stog>").append( !res.wasNull() ) .append("</stog>\n");
108 res.getString(7);
109 buff.append("<metro>").append( !res.wasNull() ).append("</metro>\n");
110
111 String address = res.getString(8);
112 buff.append("<address>").append( res.wasNull() ? "" : address ).append("</address>");
113 buff.append("<calcdist>").append( res.getInt(9) ) .append("</calcdist>\n");
114
115 buff.append("</station>\n");
116 }
117 } finally {
118 if (res != null && !res.isClosed())
119 res.close();
120 if (stmt != null && !stmt.isClosed())
121 stmt.close();
122 }
123 buff.append("</stations>\n");
124 return buff.toString();
125 }
126
127 @Override
128 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
129
130 Connection conn = null;
131 try {
132 conn = DBConnection.getConnection();
133
134 PreparedStatement stmt = createStatement(conn, request);
135 if (stmt != null){
136 String xml = formatResultset(stmt);
137
138 response.setContentType("text/xml");
139 response.getWriter().print(xml);
140 } else {
141 response.sendError(400, "not enough parameters");
142 }
143
144
145 } catch (Exception e) {
146 logger.log(Level.SEVERE, "Exception while finding stations", e);
147 response.sendError(500);
148 } finally {
149 try {
150 if (conn != null) {
151 conn.close();
152 }
153 } catch (Exception t) {}
154 }
155 }
156
157 }

  ViewVC Help
Powered by ViewVC 1.1.20