/[projects]/android/DroidRadarService/src/dk/thoerup/droidradarservice/LocationService.java
ViewVC logotype

Contents of /android/DroidRadarService/src/dk/thoerup/droidradarservice/LocationService.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 274 - (show annotations) (download)
Fri Aug 21 14:03:03 2009 UTC (14 years, 8 months ago) by torben
File size: 4705 byte(s)


1 package dk.thoerup.droidradarservice;
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 javax.naming.Context;
10 import javax.naming.InitialContext;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.sql.DataSource;
16
17 public class LocationService extends HttpServlet {
18 private static final long serialVersionUID = 1L;
19
20
21 public LocationService() {
22 super();
23 // TODO Auto-generated constructor stub
24 }
25
26
27 protected void updateDb(Connection conn, long imei, double latitude, double longitude, String handle, String group) throws SQLException {
28 PreparedStatement stmt = null;
29 try {
30 stmt = conn.prepareStatement("UPDATE droidradar SET handle=?, groupname=?, latitude=?, longitude=?, updated=now() WHERE imei=?");
31 stmt.setString(1, handle);
32 stmt.setString(2, group);
33 stmt.setDouble(3, latitude);
34 stmt.setDouble(4, longitude);
35 stmt.setLong(5, imei);
36
37 int count = stmt.executeUpdate();
38
39
40 System.out.println("count" + count);
41
42 if (count < 1) {
43 stmt.close();
44 stmt = conn.prepareStatement("INSERT INTO droidradar (imei,handle,groupname,latitude,longitude,updated) VALUES (?,?,?,?,?, now() )" );
45 stmt.setLong(1, imei);
46 stmt.setString(2, handle);
47 stmt.setString(3, group);
48 stmt.setDouble(4, latitude);
49 stmt.setDouble(5, longitude);
50 stmt.execute();
51 }
52 } finally {
53 if (stmt != null && !stmt.isClosed())
54 stmt.close();
55 }
56 }
57
58 protected String locateDroids(Connection conn, long imei, double latitude, double longitude) throws SQLException {
59 //inner select is workaround from not being able to use a calculated column directly in where clause
60 final String SQL = "SELECT * FROM ( "+
61 " SELECT imei,handle,groupname,latitude,longitude, " +
62 " extract(epoch from now())::int - extract(epoch from updated)::int AS lastupdate, " +
63 " earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " +
64 " FROM droidradar " +
65 " WHERE imei <> ? AND updated > now() - interval '15 minutes' " +
66 " ) AS droidradar2 " +
67 "WHERE calcdist < 64000 " +
68 "ORDER BY calcdist ASC ";
69
70 System.out.println(SQL);
71
72 PreparedStatement stmt = null;
73 ResultSet res = null;
74
75 StringBuffer buff = new StringBuffer();
76
77 buff.append("<?xml version=\"1.0\"?>\n");
78 buff.append("<droids>\n");
79 try
80 {
81 stmt = conn.prepareStatement(SQL);
82 stmt.setDouble(1, latitude);
83 stmt.setDouble(2, longitude);
84 stmt.setLong(3, imei);
85
86 res = stmt.executeQuery();
87
88 while (res.next()) {
89 buff.append("<droid>\n");
90 buff.append("<imei>").append(res.getLong(1) ) .append("</imei>\n");
91 buff.append("<handle>").append(res.getString(2) ) .append("</handle>\n");
92 buff.append("<group>").append(res.getString(3) ) .append("</group>\n");
93 buff.append("<latitude>").append(res.getString(4) ) .append("</latitude>\n");
94 buff.append("<longitude>").append(res.getString(5) ) .append("</longitude>\n");
95 buff.append("<lastupdate>").append(res.getInt(6) ) .append("</lastupdate>\n");
96
97 buff.append("</droid>\n");
98 }
99 } finally {
100 if (res != null && !res.isClosed())
101 res.close();
102 if (stmt != null && !stmt.isClosed())
103 stmt.close();
104 }
105 buff.append("</droids>\n");
106 return buff.toString();
107 }
108
109 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
110
111 long imei = Long.parseLong(request.getParameter("imei"));
112
113 double latitude = Double.parseDouble( request.getParameter("latitude"));
114 double longitude = Double.parseDouble( request.getParameter("longitude"));
115
116
117 String handle = request.getParameter("handle");
118 String group = request.getParameter("group");
119
120
121 Connection conn = null;
122 try {
123 Context ctx = new InitialContext();
124 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test");
125 conn = ds.getConnection();
126
127 updateDb(conn, imei, latitude, longitude, handle, group);
128
129 String xml = locateDroids(conn, imei, latitude, longitude);
130
131 response.setContentType("text/xml");
132 response.getWriter().print(xml);
133
134 conn.close();
135 conn = null;
136
137
138 } catch (Exception e) {
139 throw new ServletException(e);
140 } finally {
141 try {
142 if (conn != null)
143 conn.close();
144 } catch (Throwable t) {}
145 }
146
147 }
148
149 }

  ViewVC Help
Powered by ViewVC 1.1.20