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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 430 by torben, Thu Oct 8 20:46:40 2009 UTC revision 431 by torben, Sat Oct 10 08:33:27 2009 UTC
# Line 5  import java.sql.Connection; Line 5  import java.sql.Connection;
5  import java.sql.PreparedStatement;  import java.sql.PreparedStatement;
6  import java.sql.ResultSet;  import java.sql.ResultSet;
7  import java.sql.SQLException;  import java.sql.SQLException;
8    
9  import java.util.logging.Level;  import java.util.logging.Level;
10  import java.util.logging.Logger;  import java.util.logging.Logger;
11    
# Line 13  import javax.servlet.http.HttpServlet; Line 14  import javax.servlet.http.HttpServlet;
14  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletRequest;
15  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpServletResponse;
16    
 import dk.thoerup.traininfoservice.DBConnection;  
   
17  /**  /**
18   * Servlet implementation class LocateStations   * Servlet implementation class LocateStations
19   */   */
# Line 22  public class LocateStations extends Http Line 21  public class LocateStations extends Http
21          private static final long serialVersionUID = 1L;          private static final long serialVersionUID = 1L;
22    
23          Logger logger = Logger.getLogger( LocateStations.class.toString() );          Logger logger = Logger.getLogger( LocateStations.class.toString() );
24    
25    
26                    
27          /**          protected String transformToIntList(String input) {            
28           * @see HttpServlet#HttpServlet()                  String strings[] = input.split(",");
29           */                  
30          public LocateStations() {                  StringBuffer sb = new StringBuffer();
31                  super();                  sb.append("(");
32                  // TODO Auto-generated constructor stub                  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    
         public enum Requested {  
                 BY_NAME,  
                 BY_LOCATION,  
                 NONE  
         }  
42    
43            protected PreparedStatement createStatement(Connection conn, HttpServletRequest req) throws SQLException {
44    
         protected String getStations(Connection conn, double latitude, double longitude, String name, Requested method) throws SQLException {  
                 String SQL = "";  
45                  PreparedStatement stmt = null;                  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, " +
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,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,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;                  ResultSet res = null;
87    
88                  StringBuffer buff = new StringBuffer();                  StringBuffer buff = new StringBuffer();
89    
90                  buff.append("<?xml version=\"1.0\" ?>\n");                  buff.append("<?xml version=\"1.0\" ?>\n");
91                  buff.append("<stations>\n");                      buff.append("<stations>\n");    
92                    
93                  try                  try
94                  {                  {
   
                         switch (method)  
                         {  
                         case BY_LOCATION:  
                                 //inner select is workaround from not being able to use a calculated column directly in where clause  
                                 SQL = "SELECT * FROM ( "+  
                                                 "               SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, " +  
                                                 "                     earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " +  
                                                 "               FROM trainstations " +  
                                                 "               WHERE enabled = true AND latitude IS NOT NULL AND longitude IS NOT NULL " +  
                                                 "       ) AS trainstations2 " +  
                                                 "ORDER BY calcdist ASC " +  
                                                 "LIMIT 4 ";  
                                 stmt = conn.prepareStatement(SQL);  
                                 stmt.setDouble(1, latitude);  
                                 stmt.setDouble(2, longitude);  
   
                                 break;  
                         case BY_NAME:  
                                 SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog,0.0 " +  
                                         "FROM trainstations " +  
                                         "WHERE name ILIKE ? AND latitude IS NOT NULL AND longitude IS NOT NULL " +  
                                         "ORDER BY name ";  
                                 stmt = conn.prepareStatement(SQL);  
                                 stmt.setString(1, name + "%");  
                                 break;  
                         default:  
                                 // This should not be possible  
                                 logger.severe("getStations(): default switch case");  
                         }  
   
   
   
   
95                          res = stmt.executeQuery();                          res = stmt.executeQuery();
96    
97                          while (res.next()) {                          while (res.next()) {
# Line 114  public class LocateStations extends Http Line 122  public class LocateStations extends Http
122          @Override          @Override
123          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
124    
125                  double longitude = 0.0;                  Connection conn = null;
126                  double latitude = 0.0;                  try {
127                  String name = "";                          conn = DBConnection.getConnection();
128    
129                  Requested method = Requested.NONE;                          PreparedStatement stmt = createStatement(conn, request);
130                            if (stmt != null){
131                  if (request.getParameter("latitude") != null && request.getParameter("latitude") != null) {                                  String xml = formatResultset(stmt);
                         latitude = Double.parseDouble( request.getParameter("latitude") );  
                         longitude = Double.parseDouble( request.getParameter("longitude") );  
                         method = Requested.BY_LOCATION;  
                 }  
   
                 if (request.getParameter("name") != null) {  
                         name = request.getParameter("name").trim();  
                         method = Requested.BY_NAME;  
                 }  
   
   
                 if (method != Requested.NONE) {  
   
                         Connection conn = null;  
                         try {  
                                 conn = DBConnection.getConnection();  
   
                                 String xml = getStations(conn, latitude, longitude, name, method);  
132    
133                                  response.setContentType("text/xml");                                  response.setContentType("text/xml");
134                                  response.getWriter().print(xml);                                  response.getWriter().print(xml);
135                            } else {
136                                  conn.close();                                  response.sendError(400, "not enough parameters");              
                                 conn = null;  
   
                         } catch (Exception e) {                          
                                 logger.log(Level.SEVERE, "Exception while finding stations", e);  
                                 response.sendError(500);                                                  
                         } finally {  
                                 try {  
                                         if (conn != null)  
                                                 conn.close();  
                                 } catch (Throwable t) {}  
137                          }                          }
138                  } else {  
139                          response.sendError(400, "not enough parameters");  
140                    } catch (Exception e) {                        
141                            logger.log(Level.SEVERE, "Exception while finding stations", e);
142                            response.sendError(500);                                                
143                    } finally {
144                            try {
145                                    if (conn != null) {
146                                            conn.close();
147                                    }
148                            } catch (Throwable t) {}
149                  }                  }
150          }          }
151    

Legend:
Removed from v.430  
changed lines
  Added in v.431

  ViewVC Help
Powered by ViewVC 1.1.20