--- android/TrainInfoService/src/dk/thoerup/traininfoservice/LocateStations.java 2009/09/07 12:23:35 301 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/LocateStations.java 2010/02/08 19:12:15 588 @@ -1,106 +1,113 @@ package dk.thoerup.traininfoservice; import java.io.IOException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import dk.thoerup.traininfoservice.DBConnection; - /** * Servlet implementation class LocateStations */ public class LocateStations extends HttpServlet { private static final long serialVersionUID = 1L; - - /** - * @see HttpServlet#HttpServlet() - */ - public LocateStations() { - super(); - // TODO Auto-generated constructor stub - } - - protected String getStations(Connection conn, double latitude, double longitude) throws SQLException { - //inner select is workaround from not being able to use a calculated column directly in where clause - final String SQL = "SELECT * FROM ( "+ - " SELECT name,latitude,longitude,stationcode, " + - " earth_distance( ll_to_earth(latitude,longitude), ll_to_earth(?,?))::int AS calcdist " + - " FROM trainstations " + - " WHERE latitude IS NOT NULL AND longitude IS NOT NULL " + - " ) AS trainstations2 " + - "ORDER BY calcdist ASC " + - "LIMIT 4 "; - - System.out.println(SQL); - - PreparedStatement stmt = null; - ResultSet res = null; - - StringBuffer buff = new StringBuffer(); - - buff.append("\n"); - buff.append("\n"); - try - { - stmt = conn.prepareStatement(SQL); - stmt.setDouble(1, latitude); - stmt.setDouble(2, longitude); - - res = stmt.executeQuery(); - - while (res.next()) { - buff.append("\n"); - - buff.append("").append( res.getString(1) ) .append("\n"); - buff.append("").append( res.getDouble(2) ) .append("\n"); - buff.append("").append( res.getDouble(3) ) .append("\n"); - buff.append("").append( res.getString(4) ) .append("\n"); - buff.append("").append( res.getInt(5) ) .append("\n"); - - buff.append("\n"); + + Logger logger = Logger.getLogger( LocateStations.class.toString() ); + + StationDAO stationDao = new StationDAO(); + + + protected String transformToIntList(String input) { + String strings[] = input.split(","); + + StringBuffer sb = new StringBuffer(); + sb.append("("); + for (int i = 0; i0) { + sb.append(","); } - } finally { - if (res != null && !res.isClosed()) - res.close(); - if (stmt != null && !stmt.isClosed()) - stmt.close(); + sb.append( Integer.parseInt(strings[i])); //by doing the integer conversion we ensure that it really is a integer } + sb.append(")"); + return sb.toString(); + } + + + protected List getStations(HttpServletRequest req) throws SQLException { + List stations = null; + if (req.getParameter("latitude") != null && req.getParameter("latitude") != null) { + double latitude = Double.parseDouble( req.getParameter("latitude") ); + double longitude = Double.parseDouble( req.getParameter("longitude") ); + stations = stationDao.getByLocation(latitude, longitude); + + } else if (req.getParameter("name") != null) { + String name = req.getParameter("name").trim(); + stations = stationDao.getByName(name); + + } else if (req.getParameter("list") != null) { + String list = transformToIntList( req.getParameter("list")); + stations = stationDao.getByList(list); + } + return stations; + } + + + protected String formatStations(List stations) { + + StringBuffer buff = new StringBuffer(); + + buff.append("\n"); + buff.append("\n"); + + + for (int i=0; i\n"); + + buff.append("").append( station.getId() ).append("\n"); + buff.append("").append( station.getName() ) .append("\n"); + buff.append("").append( station.getLatitude() ) .append("\n"); + buff.append("").append( station.getLongitude() ) .append("\n"); + buff.append("").append( station.getRegional() != null ) .append("\n"); + buff.append("").append( station.getStrain() != null ) .append("\n"); + buff.append("").append( station.getMetro() != null ).append("\n"); + buff.append("
").append( station.getAddress() != null ? station.getAddress() : "").append("
"); + buff.append("").append( station.getCalcdist() ) .append("\n"); + + buff.append("\n"); + } buff.append("
\n"); return buff.toString(); } + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - double latitude = Double.parseDouble( request.getParameter("latitude") ); - double longitude = Double.parseDouble( request.getParameter("longitude") ); - - Connection conn = null; + + try { - conn = DBConnection.getConnection(); - - String xml = getStations(conn, latitude, longitude); - - response.setContentType("text/xml"); - response.getWriter().print(xml); - - conn.close(); - conn = null; - - } catch (Exception e) { - throw new ServletException(e); - } finally { - try { - if (conn != null) - conn.close(); - } catch (Throwable t) {} - } + List stations = getStations(request); + + + if (stations != null){ + String xml = formatStations(stations); + + response.setContentType("text/xml"); + response.getWriter().print(xml); + } else { + response.sendError(400, "not enough parameters"); + } + + + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception while finding stations", e); + response.sendError(500); + } } }