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

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

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

revision 388 by torben, Fri Oct 2 15:11:25 2009 UTC revision 958 by torben, Mon Jul 5 09:48:06 2010 UTC
# Line 1  Line 1 
1  package dk.thoerup.traininfoservice;  package dk.thoerup.traininfoservice;
2    
3  import java.io.IOException;  import java.io.IOException;
 import java.sql.Connection;  
 import java.sql.PreparedStatement;  
 import java.sql.ResultSet;  
4  import java.sql.SQLException;  import java.sql.SQLException;
5    import java.util.List;
6  import java.util.logging.Level;  import java.util.logging.Level;
7  import java.util.logging.Logger;  import java.util.logging.Logger;
8    
9  import javax.servlet.ServletException;  import javax.servlet.ServletException;
10    import javax.servlet.annotation.WebServlet;
11  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServlet;
12  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletRequest;
13  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpServletResponse;
14    
 import dk.thoerup.traininfoservice.DBConnection;  
   
15  /**  /**
16   * Servlet implementation class LocateStations   * Servlet implementation class LocateStations
17   */   */
18    @WebServlet(urlPatterns={"/LocateStations"})
19  public class LocateStations extends HttpServlet {  public class LocateStations extends HttpServlet {
20          private static final long serialVersionUID = 1L;          private static final long serialVersionUID = 1L;
21    
22          Logger logger = Logger.getLogger( LocateStations.class.toString() );          Logger logger = Logger.getLogger( LocateStations.class.toString() );
23            
24          /**          StationDAO stationDao = new StationDAO();
25           * @see HttpServlet#HttpServlet()  
26           */  
27          public LocateStations() {          protected String transformToIntList(String input) {            
28                  super();                  String strings[] = input.split(",");
29                  // TODO Auto-generated constructor stub  
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          public enum Requested {  
43                  BY_NAME,          protected List<StationBean> getStations(HttpServletRequest req) throws SQLException {
44                  BY_LOCATION,                  List<StationBean> stations = null;
45                  NONE                  if (req.getParameter("latitude") != null && req.getParameter("latitude") != null) {
46                            
47                            Statistics.getInstance().incrementStationLookupsLocation();
48                            
49                            double latitude = Double.parseDouble( req.getParameter("latitude") );
50                            double longitude = Double.parseDouble( req.getParameter("longitude") );
51                            stations = stationDao.getByLocation(latitude, longitude);
52    
53                    } else if (req.getParameter("name") != null) {
54                            Statistics.getInstance().incrementStationLookupsName();
55                            String name = req.getParameter("name").trim();
56                            stations = stationDao.getByName(name);
57    
58                    } else if (req.getParameter("list") != null) {
59                            Statistics.getInstance().incrementStationLookupsFavorites();
60                            String list = transformToIntList( req.getParameter("list"));
61                            stations = stationDao.getByList(list);
62                    }
63                    return stations;
64          }          }
65    
66    
67          protected String getStations(Connection conn, double latitude, double longitude, String name, Requested method) throws SQLException {          protected String formatStations(List<StationBean> stations)  {
                 String SQL = "";  
                 PreparedStatement stmt = null;  
                 ResultSet res = null;  
68    
69                  StringBuffer buff = new StringBuffer();                  StringBuffer buff = new StringBuffer();
70    
71                  buff.append("<?xml version=\"1.0\" ?>\n");                  //buff.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
72                  buff.append("<stations>\n");                      buff.append("<stations>\n");    
                   
                 try  
                 {  
   
                         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");  
                         }  
   
73    
74    
75                    for (int i=0; i<stations.size(); i++) {                
76                            StationBean station = stations.get(i);
77    
78                          res = stmt.executeQuery();                          buff.append("<station>\n");
79    
80                          while (res.next()) {                          buff.append("<id>").append( station.getId() ).append("</id>\n");
81                                  buff.append("<station>\n");                          buff.append("<name>").append( station.getName() ) .append("</name>\n");
82                            buff.append("<latitude>").append( station.getLatitude() ) .append("</latitude>\n");
83                            buff.append("<longitude>").append( station.getLongitude() ) .append("</longitude>\n");                  
84                            buff.append("<regional>").append( station.getRegional() != null ) .append("</regional>\n");
85                            buff.append("<strain>").append( station.getStrain() != null ) .append("</strain>\n");
86                            buff.append("<metro>").append( station.getMetro() != null ).append("</metro>\n");
87                            buff.append("<address>").append( station.getAddress() != null ?  station.getAddress() : "").append("</address>");                              
88                            buff.append("<calcdist>").append( station.getCalcdist() ) .append("</calcdist>\n");
89    
90                                  buff.append("<id>").append( res.getInt(1) ).append("</id>\n");                          buff.append("</station>\n");                            
91                                  buff.append("<name>").append( res.getString(2) ) .append("</name>\n");                  }
                                 buff.append("<latitude>").append( res.getDouble(3) ) .append("</latitude>\n");  
                                 buff.append("<longitude>").append( res.getDouble(4) ) .append("</longitude>\n");  
                                 res.getString(5);  
                                 buff.append("<fjerntog>").append( !res.wasNull() ) .append("</fjerntog>\n");  
                                 res.getString(6);  
                                 buff.append("<stog>").append( !res.wasNull() ) .append("</stog>\n");  
                                 buff.append("<calcdist>").append( res.getInt(7) ) .append("</calcdist>\n");  
   
                                 buff.append("</station>\n");                              
                         }  
                 } finally {  
                         if (res != null && !res.isClosed())  
                                 res.close();  
                         if (stmt != null && !stmt.isClosed())  
                                 stmt.close();  
                 }  
92                  buff.append("</stations>\n");                  buff.append("</stations>\n");
93                  return buff.toString();                  return buff.toString();
94          }          }
95    
96            @Override
97          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
98    
                 double longitude = 0.0;  
                 double latitude = 0.0;  
                 String name = "";  
   
                 Requested method = Requested.NONE;  
   
                 if (request.getParameter("latitude") != null && request.getParameter("latitude") != null) {  
                         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;  
                 }  
99    
100                    try {
101                            List<StationBean> stations = getStations(request);
102    
                 if (method != Requested.NONE) {  
103    
104                          Connection conn = null;                          if (stations != null){
105                          try {                                  String xml = formatStations(stations);
                                 conn = DBConnection.getConnection();  
   
                                 String xml = getStations(conn, latitude, longitude, name, method);  
106    
107                                  response.setContentType("text/xml");                                  response.setContentType("text/xml");
108                                  response.getWriter().print(xml);                                  response.getWriter().print(xml);
109                            } else {
110                                  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) {}  
111                          }                          }
112                  } else {  
113                          response.sendError(400, "not enough parameters");  
114                  }                  } catch (Exception e) {                        
115                            logger.log(Level.SEVERE, "Exception while finding stations", e);
116                            response.sendError(500);                                                
117                    }
118          }          }
119    
120  }  }

Legend:
Removed from v.388  
changed lines
  Added in v.958

  ViewVC Help
Powered by ViewVC 1.1.20