/[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 292 by torben, Tue Sep 1 19:17:18 2009 UTC revision 425 by torben, Thu Oct 8 20:46:40 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    import java.util.logging.Level;
9    import java.util.logging.Logger;
10    
11  import javax.servlet.ServletException;  import javax.servlet.ServletException;
12  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServlet;
# Line 18  import dk.thoerup.traininfoservice.DBCon Line 20  import dk.thoerup.traininfoservice.DBCon
20   */   */
21  public class LocateStations extends HttpServlet {  public class LocateStations extends HttpServlet {
22          private static final long serialVersionUID = 1L;          private static final long serialVersionUID = 1L;
23          
24      /**          Logger logger = Logger.getLogger( LocateStations.class.toString() );
25       * @see HttpServlet#HttpServlet()          
26       */          /**
27      public LocateStations() {           * @see HttpServlet#HttpServlet()
28          super();           */
29          // TODO Auto-generated constructor stub          public LocateStations() {
30      }                  super();
31                    // TODO Auto-generated constructor stub
32          protected String getStations(Connection conn, double latitude, double longitude) throws SQLException {          }
33                  //inner select is workaround from not being able to use a calculated column directly in where clause  
34                  final String SQL = "SELECT * FROM ( "+          public enum Requested {
35                                                     "               SELECT name,latitude,longitude,address,stationcode, " +                  BY_NAME,
36                                                     "                     earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " +                  BY_LOCATION,
37                                                     "               FROM trainstations " +                  NONE
38                                                     "       ) AS trainstations2 " +          }
39                                                 "ORDER BY calcdist ASC " +  
40                                                 "LIMIT 4 ";  
41                            protected String getStations(Connection conn, double latitude, double longitude, String name, Requested method) throws SQLException {
42                  System.out.println(SQL);                  String SQL = "";
                   
43                  PreparedStatement stmt = null;                  PreparedStatement stmt = null;
44                  ResultSet res = null;                  ResultSet res = null;
45                    
46                  StringBuffer buff = new StringBuffer();                  StringBuffer buff = new StringBuffer();
47                    
48                  buff.append("<?xml version=\"1.0\" ?>\n");                  buff.append("<?xml version=\"1.0\" ?>\n");
49                  buff.append("<stations>\n");                  buff.append("<stations>\n");    
50                    
51                  try                  try
52                  {                  {
53                          stmt = conn.prepareStatement(SQL);  
54                          stmt.setDouble(1, latitude);                          switch (method)
55                          stmt.setDouble(2, longitude);                          {
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 enabled = true AND 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();                          res = stmt.executeQuery();
88                            
89                          while (res.next()) {                          while (res.next()) {
90                                  buff.append("<station>\n");                                  buff.append("<station>\n");
91    
92                                  buff.append("<name>").append( res.getString(1) ) .append("</name>\n");                                  buff.append("<id>").append( res.getInt(1) ).append("</id>\n");
93                                  buff.append("<latitude>").append( res.getDouble(2) ) .append("</latitude>\n");                                  buff.append("<name>").append( res.getString(2) ) .append("</name>\n");
94                                  buff.append("<longitude>").append( res.getDouble(3) ) .append("</longitude>\n");                                                                  buff.append("<latitude>").append( res.getDouble(3) ) .append("</latitude>\n");
95                                  buff.append("<address>").append( res.getString(4) ) .append("</address>\n");                                      buff.append("<longitude>").append( res.getDouble(4) ) .append("</longitude>\n");
96                                  buff.append("<stationcode>").append( res.getString(5) ) .append("</stationcode>\n");                                  res.getString(5);
97                                  buff.append("<calcdist>").append( res.getDouble(6) ) .append("</calcdist>\n");                                  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");                                                              buff.append("</station>\n");                            
103                          }                          }
104                  } finally {                  } finally {
# Line 76  public class LocateStations extends Http Line 111  public class LocateStations extends Http
111                  return buff.toString();                  return buff.toString();
112          }          }
113    
114            @Override
115          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
116                    
117                  double latitude = Double.parseDouble( request.getParameter("latitude") );                  double longitude = 0.0;
118                  double longitude = Double.parseDouble( request.getParameter("longitude") );                  double latitude = 0.0;
119                                                    String name = "";
120                  Connection conn = null;  
121                  try {                  Requested method = Requested.NONE;
122                          conn = DBConnection.getConnection();  
123                                            if (request.getParameter("latitude") != null && request.getParameter("latitude") != null) {
124                          String xml = getStations(conn, latitude, longitude);                          latitude = Double.parseDouble( request.getParameter("latitude") );
125                                                    longitude = Double.parseDouble( request.getParameter("longitude") );
126                          response.setContentType("text/xml");                          method = Requested.BY_LOCATION;
127                          response.getWriter().print(xml);                  }
128                            
129                          conn.close();                  if (request.getParameter("name") != null) {
130                          conn = null;                          name = request.getParameter("name").trim();
131                                                    method = Requested.BY_NAME;
132                  } catch (Exception e) {                  }
133                          throw new ServletException(e);  
134                  } finally {  
135                    if (method != Requested.NONE) {
136    
137                            Connection conn = null;
138                          try {                          try {
139                                  if (conn != null)                                  conn = DBConnection.getConnection();
140                                          conn.close();  
141                          } catch (Throwable t) {}                                  String xml = getStations(conn, latitude, longitude, name, method);
142    
143                                    response.setContentType("text/xml");
144                                    response.getWriter().print(xml);
145    
146                                    conn.close();
147                                    conn = null;
148    
149                            } catch (Exception e) {                        
150                                    logger.log(Level.SEVERE, "Exception while finding stations", e);
151                                    response.sendError(500);                                                
152                            } finally {
153                                    try {
154                                            if (conn != null)
155                                                    conn.close();
156                                    } catch (Throwable t) {}
157                            }
158                    } else {
159                            response.sendError(400, "not enough parameters");
160                  }                  }
161          }          }
162    

Legend:
Removed from v.292  
changed lines
  Added in v.425

  ViewVC Help
Powered by ViewVC 1.1.20