diff --git a/src/main/java/org/lapaloma/aadd/redmetro/AppRedMetro.java b/src/main/java/org/lapaloma/aadd/redmetro/AppRedMetro.java index dee6b16..64d6495 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/AppRedMetro.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/AppRedMetro.java @@ -1,6 +1,5 @@ package org.lapaloma.aadd.redmetro; -import org.lapaloma.aadd.redmetro.gestores.GestorEntityManagerJPA; import org.lapaloma.aadd.redmetro.procesador.ProcesadorURLs; /** @@ -14,11 +13,15 @@ public class AppRedMetro { // Obtiene la Session de forma estática // GestorEntityManagerJPA.getEntityManager(); - app.procesasrURLs(); + app.procesarURLs(); } - private void procesasrURLs() { + private void procesarURLs() { ProcesadorURLs procesadorURLs = new ProcesadorURLs(); + // Procesar URL de estaciones (XML) procesadorURLs.procesarURLEstacionesXML(); + + // Procesar URL de líneas y estaciones (JSON) + procesadorURLs.procesarURLLineasEstacionesJSON(); } } diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/IEstacionDAO.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/IEstacionDAO.java index 0cb4bb1..3343bc3 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/dao/IEstacionDAO.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/IEstacionDAO.java @@ -1,5 +1,9 @@ package org.lapaloma.aadd.redmetro.dao; -public interface IEstacionDAO { +import org.lapaloma.aadd.redmetro.vo.Estacion; +public interface IEstacionDAO { + Estacion obtenerEstacionPorCodigo(int codigo); + void crearEstacion(Estacion estacion); + void actualizarEstacion(Estacion estacion); } diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaDAO.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaDAO.java new file mode 100644 index 0000000..9a4a071 --- /dev/null +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaDAO.java @@ -0,0 +1,7 @@ +package org.lapaloma.aadd.redmetro.dao; + +import org.lapaloma.aadd.redmetro.vo.Linea; + +public interface ILineaDAO { + Linea obtenerLineaPorCodigo(int codigo); +} diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaEstacionDAO.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaEstacionDAO.java index 5935cc0..46b7b4b 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaEstacionDAO.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/ILineaEstacionDAO.java @@ -1,5 +1,12 @@ package org.lapaloma.aadd.redmetro.dao; -public interface ILineaEstacionDAO { +import org.lapaloma.aadd.redmetro.vo.LineaEstacion; +import org.lapaloma.aadd.redmetro.vo.LineaEstacionId; +public interface ILineaEstacionDAO { + LineaEstacion obtenerLineaEstacionPorCodigo(LineaEstacionId id); + + void crearLineaEstacion(LineaEstacion lineaEstacion); + + void actualizarLineaEstacion(LineaEstacion lineaEstacion); } diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/EstacionDaoJPA.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/EstacionDaoJPA.java index 18c8c33..7a4a5ce 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/EstacionDaoJPA.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/EstacionDaoJPA.java @@ -1,7 +1,76 @@ package org.lapaloma.aadd.redmetro.dao.jpa; import org.lapaloma.aadd.redmetro.dao.IEstacionDAO; +import org.lapaloma.aadd.redmetro.gestores.GestorEntityManagerJPA; +import org.lapaloma.aadd.redmetro.vo.Estacion; -public class EstacionDaoJPA implements IEstacionDAO{ +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; + +public class EstacionDaoJPA implements IEstacionDAO { + + @Override + public Estacion obtenerEstacionPorCodigo(int codigo) { + Estacion estacion = null; + + // try con recursos "cerrables": Session + try (EntityManager gestorEntidades = GestorEntityManagerJPA.getEntityManager()) { + estacion = gestorEntidades.find(Estacion.class, codigo); + } catch (Exception e) { + e.printStackTrace(); + } + return estacion; + } + + @Override + public void crearEstacion(Estacion estacion) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + gestorEntidades.persist(estacion); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } + + @Override + public void actualizarEstacion(Estacion estacion) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + if (!gestorEntidades.contains(estacion)) + gestorEntidades.merge(estacion); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } } diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaDaoJPA.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaDaoJPA.java new file mode 100644 index 0000000..3df6392 --- /dev/null +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaDaoJPA.java @@ -0,0 +1,23 @@ +package org.lapaloma.aadd.redmetro.dao.jpa; + +import org.lapaloma.aadd.redmetro.dao.ILineaDAO; +import org.lapaloma.aadd.redmetro.gestores.GestorEntityManagerJPA; +import org.lapaloma.aadd.redmetro.vo.Linea; + +import jakarta.persistence.EntityManager; + +public class LineaDaoJPA implements ILineaDAO { + + @Override + public Linea obtenerLineaPorCodigo(int codigo) { + Linea linea = null; + + // try con recursos "cerrables": Session + try (EntityManager gestorEntidades = GestorEntityManagerJPA.getEntityManager()) { + linea = gestorEntidades.find(Linea.class, codigo); + } catch (Exception e) { + e.printStackTrace(); + } + return linea; + } +} diff --git a/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaEstacionDaoJPA.java b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaEstacionDaoJPA.java index 75a91ba..1353f4a 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaEstacionDaoJPA.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/dao/jpa/LineaEstacionDaoJPA.java @@ -1,7 +1,77 @@ package org.lapaloma.aadd.redmetro.dao.jpa; import org.lapaloma.aadd.redmetro.dao.ILineaEstacionDAO; +import org.lapaloma.aadd.redmetro.gestores.GestorEntityManagerJPA; +import org.lapaloma.aadd.redmetro.vo.LineaEstacion; +import org.lapaloma.aadd.redmetro.vo.LineaEstacionId; -public class LineaEstacionDaoJPA implements ILineaEstacionDAO{ +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; + +public class LineaEstacionDaoJPA implements ILineaEstacionDAO { + + @Override + public LineaEstacion obtenerLineaEstacionPorCodigo(LineaEstacionId id) { + LineaEstacion lineaEstacion = null; + + // try con recursos "cerrables": Session + try (EntityManager gestorEntidades = GestorEntityManagerJPA.getEntityManager()) { + lineaEstacion = gestorEntidades.find(LineaEstacion.class, id); + } catch (Exception e) { + e.printStackTrace(); + } + return lineaEstacion; + } + + @Override + public void crearLineaEstacion(LineaEstacion lineaEstacion) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + gestorEntidades.persist(lineaEstacion); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } + + @Override + public void actualizarLineaEstacion(LineaEstacion lineaEstacion) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + if (!gestorEntidades.contains(lineaEstacion)) + gestorEntidades.merge(lineaEstacion); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } } diff --git a/src/main/java/org/lapaloma/aadd/redmetro/gestores/GestorEntityManagerJPA.java b/src/main/java/org/lapaloma/aadd/redmetro/gestores/GestorEntityManagerJPA.java index 41bde21..f1dfd12 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/gestores/GestorEntityManagerJPA.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/gestores/GestorEntityManagerJPA.java @@ -23,7 +23,7 @@ public class GestorEntityManagerJPA { // Carga la configuración desde META-INF/persistence.xml static { try { - entityManagerFactory = Persistence.createEntityManagerFactory("UP_PROYECTOSIES_ODB"); + entityManagerFactory = Persistence.createEntityManagerFactory("UP_REDMETRO_MYSQL"); } catch (Throwable ex) { System.err.println("Error en EntityManagerFactory: " + ex); throw new ExceptionInInitializerError(ex); diff --git a/src/main/java/org/lapaloma/aadd/redmetro/procesador/ProcesadorURLs.java b/src/main/java/org/lapaloma/aadd/redmetro/procesador/ProcesadorURLs.java index 5193d99..fcdec4b 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/procesador/ProcesadorURLs.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/procesador/ProcesadorURLs.java @@ -7,8 +7,17 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import org.lapaloma.aadd.redmetro.dao.IEstacionDAO; +import org.lapaloma.aadd.redmetro.dao.ILineaDAO; +import org.lapaloma.aadd.redmetro.dao.ILineaEstacionDAO; +import org.lapaloma.aadd.redmetro.dao.jpa.EstacionDaoJPA; +import org.lapaloma.aadd.redmetro.dao.jpa.LineaDaoJPA; +import org.lapaloma.aadd.redmetro.dao.jpa.LineaEstacionDaoJPA; import org.lapaloma.aadd.redmetro.gestores.GestorFicheroConfiguracion; import org.lapaloma.aadd.redmetro.vo.Estacion; +import org.lapaloma.aadd.redmetro.vo.Linea; +import org.lapaloma.aadd.redmetro.vo.LineaEstacion; +import org.lapaloma.aadd.redmetro.vo.LineaEstacionId; import tools.jackson.databind.JsonNode; import tools.jackson.databind.ObjectMapper; @@ -41,16 +50,84 @@ public class ProcesadorURLs { String direccion = nodoEstacion.path("direccion").asString(); int id = nodoEstacion.path("id").asInt(); - System.out.println("Nombre: " + nombre); - System.out.println("Dirección: " + direccion); - System.out.println("ID: " + id); - Estacion estacion = new Estacion(); estacion.setCodigo(id); estacion.setNombre(nombre); estacion.setDireccion(direccion); - - + System.out.println(estacion); + + IEstacionDAO estacionDAO = new EstacionDaoJPA(); + Estacion estacionBBDD = estacionDAO.obtenerEstacionPorCodigo(id); + + // Si no existe la estación, la creamos. Si existe, la actualizamos. + if (estacionBBDD == null) { + estacionDAO.crearEstacion(estacion); + } else { + estacionDAO.actualizarEstacion(estacion); + } + + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public void procesarURLLineasEstacionesJSON() { + + String urlJSONLienasEstaciones = GestorFicheroConfiguracion.getValorfromClave("url.json.lineaestacion"); + + URL url = null; + try { + url = new URI(urlJSONLienasEstaciones).toURL(); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (URISyntaxException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // Procesar con Jackson XML + ObjectMapper mapper = new ObjectMapper(); + + try (InputStream is = url.openStream()) { + JsonNode nodosLineasEstaciones = mapper.readTree(is); + for (JsonNode nodoLineaEstacion : nodosLineasEstaciones) { + int idLinea = nodoLineaEstacion.path("idLinea").asInt(); + int idEstacion = nodoLineaEstacion.path("idEstacion").asInt(); + int orden = nodoLineaEstacion.path("orden").asInt(); + + ILineaDAO lineaDAO = new LineaDaoJPA(); + Linea lineaBBDD = lineaDAO.obtenerLineaPorCodigo(idLinea); + + IEstacionDAO estacionDAO = new EstacionDaoJPA(); + Estacion estacionBBDD = estacionDAO.obtenerEstacionPorCodigo(idEstacion); + + // Si existen la línea y la estación, creamos la relación. + if (lineaBBDD != null && estacionBBDD != null) { + LineaEstacion lineaEstacion = new LineaEstacion(); + LineaEstacionId idLineaEstacion = new LineaEstacionId(idLinea, idEstacion); + + lineaEstacion.setId(idLineaEstacion); + lineaEstacion.setLinea(lineaBBDD); + lineaEstacion.setEstacion(estacionBBDD); + lineaEstacion.setOrden(orden); + + System.out.println(lineaEstacion); + + ILineaEstacionDAO lineaEstacionDAO = new LineaEstacionDaoJPA(); + LineaEstacion lineaEstacionBBDD = lineaEstacionDAO.obtenerLineaEstacionPorCodigo(idLineaEstacion); + + // Si no existe la estación, la creamos. Si existe, la actualizamos. + if (lineaEstacionBBDD == null) { + lineaEstacionDAO.crearLineaEstacion(lineaEstacion); + } else { + lineaEstacionDAO.actualizarLineaEstacion(lineaEstacionBBDD); + } + + } + } } catch (IOException e) { // TODO Auto-generated catch block diff --git a/src/main/java/org/lapaloma/aadd/redmetro/vo/Estacion.java b/src/main/java/org/lapaloma/aadd/redmetro/vo/Estacion.java index 98c08f7..c545213 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/vo/Estacion.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/vo/Estacion.java @@ -9,7 +9,7 @@ import jakarta.persistence.*; @Table(name = "T_ESTACION") public class Estacion { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) +// @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cod_estacion") private int codigo; diff --git a/src/main/java/org/lapaloma/aadd/redmetro/vo/Linea.java b/src/main/java/org/lapaloma/aadd/redmetro/vo/Linea.java index 0bc3cc2..8250f68 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/vo/Linea.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/vo/Linea.java @@ -31,7 +31,7 @@ public class Linea { private String nombreLargo; // Relación OneToOne con T_COLOR (clave única) - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.EAGER) @JoinColumn(name = "cod_color", nullable = false, unique = true) private Color color; diff --git a/src/main/java/org/lapaloma/aadd/redmetro/vo/LineaEstacionId.java b/src/main/java/org/lapaloma/aadd/redmetro/vo/LineaEstacionId.java index 8b82803..b5de2b2 100644 --- a/src/main/java/org/lapaloma/aadd/redmetro/vo/LineaEstacionId.java +++ b/src/main/java/org/lapaloma/aadd/redmetro/vo/LineaEstacionId.java @@ -38,4 +38,9 @@ public class LineaEstacionId implements Serializable { public int hashCode() { return Objects.hash(codigoLinea, codigoEstacion); } + + @Override + public String toString() { + return "LineaEstacionId [codigoLinea=" + codigoLinea + ", codigoEstacion=" + codigoEstacion + "]"; + } } diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 80e6f17..e5e4672 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -6,25 +6,28 @@ http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> - + - com.objectdb.jpa.Provider + org.hibernate.jpa.HibernatePersistenceProvider - es.palomafp.aadd.inm.vo.Concepto - es.palomafp.aadd.inm.vo.Patrocinador - es.palomafp.aadd.inm.vo.Proyecto - es.palomafp.aadd.inm.vo.CursoAcademico - es.palomafp.aadd.inm.vo.CursoProyecto - es.palomafp.aadd.inm.vo.Gasto - es.palomafp.aadd.inm.vo.Ingreso + org.lapaloma.aadd.redmetro.vo.Color + org.lapaloma.aadd.redmetro.vo.Linea + org.lapaloma.aadd.redmetro.vo.Estacion + org.lapaloma.aadd.redmetro.vo.LineaEstacion - - - - - - + + + + + + + + + + + + \ No newline at end of file