package controlador; /** * @author pedro rolón */ import java.util.ArrayList; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import modelo.PuntoGeografico; public class GeoConexion { Context initContext; Connection con = null; PreparedStatement statement = null; ResultSet result = null; String name = "java:/comp/env/jdbc/postgresql/Geo"; //Nombre del resource para el pool de conexiones /** * * @param longitud * @param latitud * @param nombre * @return Returns an positive int if the process was success. Returns -1 if the process was failed. * */ public int agregarPunto(double latitud, double longitud, String nombre) { int identificador = -1; try{ initContext = new InitialContext(); DataSource ds = (DataSource) initContext.lookup(name); con = ds.getConnection(); String sql = "INSERT INTO PuntosGeograficos (longitud, latitud, nombre) values (?,?,?)"; //El segundo parámetro, en este caso el 1, le indica al driver //si tiene que retornar o no las primary key generadas PreparedStatement statement = con.prepareStatement(sql,1); statement.setDouble(1, longitud); statement.setDouble(2, latitud); statement.setString(3, nombre); statement.executeUpdate(); //Obtiene el identificador del valor insertado statement.getGeneratedKeys().next(); identificador = statement.getGeneratedKeys().getInt(1); System.out.println("id: "+identificador); System.out.println("Se agregó correctamente el punto"); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al agregarPunto"); identificador = -1; } finally{ if(result != null){ try{ result.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar result en agregarPunto"); identificador = -1; } } if(statement != null){ try{ statement.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.print("Error al cerrar statement en agregarPunto"); identificador = -1; } } if(con != null){ try{ con.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar con en agregarPunto"); identificador = -1; } } } return identificador; } //Elimina un registro de la base de datos public boolean borrarPunto(int nroPuntoGeografico){ boolean logrado; try{ initContext = new InitialContext(); DataSource ds = (DataSource) initContext.lookup(name); con = ds.getConnection(); String sql = "DELETE FROM PuntosGeograficos where id=?"; PreparedStatement statement = con.prepareStatement(sql); statement.setInt(1, nroPuntoGeografico); int rowAffecteds = statement.executeUpdate(); if(rowAffecteds>0) { logrado = true; System.out.println("Se han eliminado "+ rowAffecteds+" registros."); } else { System.out.println("No se ha eliminado ningún registro"); logrado=false; } } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("error en borrarPunto"); logrado = false; } finally{ if(result != null){ try{ result.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar result en borrarPunto"); logrado = false; } } if(statement != null){ try{ statement.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.print("Error al cerrar statement en borrarPunto"); logrado = false; } } if(con != null){ try{ con.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar con en borrarPunto"); logrado = false; } } } return logrado; } //Busca en la base de datos por id del punto geografico //Retorna un objeto del tipo PuntoGeografico /** * * @param nroPuntoGeografico * @return PuntoGeografico */ public PuntoGeografico buscarPunto(int nroPuntoGeografico){ PuntoGeografico punto = new PuntoGeografico(); try{ initContext = new InitialContext(); DataSource ds = (DataSource) initContext.lookup(name); con = ds.getConnection(); String sql = "SELECT id, latitud, longitud, nombre from PuntosGeograficos where id=?"; PreparedStatement statement = con.prepareStatement(sql); statement.setInt(1, nroPuntoGeografico); result = statement.executeQuery(); if(result.next()){ int id = result.getInt(1); double latitud = result.getDouble(2); double longitud = result.getDouble(3); String nombre = result.getString(4); punto.setId(id); punto.setLatitud(latitud); punto.setLongitud(longitud); punto.setNombre(nombre); }else{ System.out.println("no se encontró"); } } catch(Exception e){ } finally{ if(result != null){ try{ result.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar result en buscarPunto"); } } if(statement != null){ try{ statement.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.print("Error al cerrar statement en buscarPunto"); } } if(con != null){ try{ con.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar con en buscarPunto"); } } } return punto; } //Retorna un array con todos los puntos en la base de datos con la distancia //correspondiente a la distancia al punto dado como //Si el size del array retornado es 0, entonces ocurrió algún error o la base de datos //está vacía /** * * @param parametroLatitud * @param parametroLongitud * @return */ public PuntoGeografico[] buscarPuntosCercanos(double parametroLatitud, double parametroLongitud){ //Para instanciar nomás PuntoGeografico[] puntos; try{ initContext = new InitialContext(); DataSource ds = (DataSource) initContext.lookup(name); con = ds.getConnection(); String sql = "SELECT id, latitud, longitud, nombre from puntosGeograficos"; //This way you can move forward and backward, so less things to worry about PreparedStatement statement = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); result = statement.executeQuery(); //Para saber la cantidad de filas que retorna el query int rowcount = 0; if(result.last()){ rowcount = result.getRow(); result.beforeFirst();//Establece el cursor al comienzo otra vez } if(rowcount==0) { puntos = null; System.out.println("No se encontró ningún dato"); }else { puntos = new PuntoGeografico[rowcount]; int i=0; while(result.next()){ int id = result.getInt(1); double latitud = result.getFloat(2); double longitud = result.getFloat(3); String nombre = result.getString(4); double distancia = distancia(parametroLatitud, parametroLongitud, latitud, longitud); puntos[i] = new PuntoGeografico(id, longitud, latitud, nombre, distancia); System.out.println("id: "+id+"\tlatitud: "+latitud+"\tlongitud: "+longitud+"\tnombre: "+nombre+"\tdistancia: "+distancia); i++; } System.out.println("Se realizó la consulta"); } } catch(Exception e){ System.out.println(e.getMessage()); puntos = null; } finally{ if(result != null){ try{ result.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar result en buscarPuntosCercanos"); puntos = null; } } if(statement != null){ try{ statement.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.print("Error al cerrar statement en buscarPuntosCercanos"); puntos = null; } } if(con != null){ try{ con.close(); } catch(Exception e){ System.out.println(e.getMessage()); System.out.println("Error al cerrar con en buscarPuntosCeranos"); puntos = null; } } } return puntos; } //Calcula la distancia entre dos puntos, basándose en sus coordenadas private double distancia(double lat1, double lng1, double lat2, double lng2) { double radioTierra = 6371; double dLat = Math.toRadians(lat2 - lat1); double dLng = Math.toRadians(lng2 - lng1); double sindLat = Math.sin(dLat / 2); double sindLng = Math.sin(dLng / 2); double va1 = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)); double va2 = 2 * Math.atan2(Math.sqrt(va1), Math.sqrt(1 - va1)); double distancia = radioTierra * va2; return distancia; } }