commit 034e14b67d94bd6cd2781024a962ed68604019cf Author: Isidoro Nevares Martín Date: Tue Feb 24 15:00:08 2026 +0100 Commit inicial diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..1dfc1ca --- /dev/null +++ b/.classpath @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..93e00af --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/ +*.class +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..eac5c29 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + aadd_act5_6 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + + + 1771843084640 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1b6e1ef --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2565d53 --- /dev/null +++ b/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + eu.agenciaesa + aadd_act5_6 + 0.0.1-SNAPSHOT + + + + org.mongodb + mongodb-driver-sync + 5.6.2 + compile + + + + + org.postgresql + postgresql + 42.7.8 + compile + + + + + com.mysql + mysql-connector-j + 9.5.0 + + + + + org.hibernate.orm + hibernate-core + 7.1.11.Final + + + + + tools.jackson.dataformat + jackson-dataformat-xml + 3.0.1 + + + \ No newline at end of file diff --git a/src/main/java/eu/agenciaesa/inm/AppAgenciaEsa.java b/src/main/java/eu/agenciaesa/inm/AppAgenciaEsa.java new file mode 100644 index 0000000..0b90aec --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/AppAgenciaEsa.java @@ -0,0 +1,59 @@ +package eu.agenciaesa.inm; + +import eu.agenciaesa.inm.dao.IExperimentoDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorEntityManagerJPA; +import eu.agenciaesa.inm.vo.TipoExperimento; + +/** + * Clase principal que inicia la sesión de Hibernate - JPA. Al obtener un EntityManager, + * Hibernate ejecutará hbm2ddl.auto=create y recreará la base de datos según las + * entidades definidas. + */ +public class AppAgenciaEsa { + public static void main(String[] args) { + System.out.println("Inicio del programa."); + + AppAgenciaEsa app = new AppAgenciaEsa(); + + // Generación de la base de datos (JPA - hibernate - PostgreSQL) + GestorEntityManagerJPA.getEntityManager(); + + try { + app.procesarInformacionAgenciaESA(); + } catch (AgenciaESAException e) { + String mensajeError = "Error en la clase %s al realizar una operación de %s"; + String operacion = "Operación desconocida"; + int codigoError = e.getCodigoError(); + switch (codigoError) { + case AgenciaESAException.ERROR_GESTION_CONEXION: + operacion = "Gestión de Conexión"; + break; + case AgenciaESAException.ERROR_CONSULTA: + operacion = "Consulta"; + break; + case AgenciaESAException.ERROR_INSERCION: + operacion = "Inserción"; + break; + case AgenciaESAException.ERROR_BORRADO: + operacion = "Borrado"; + break; + case AgenciaESAException.ERROR_ACTUALIZACION: + operacion = "Actualización"; + break; + } + mensajeError = String.format(mensajeError, e.getClaseOrigen().getName(), operacion); + System.err.println(mensajeError); + e.printStackTrace(); + } + System.out.println("Fin del programa."); + } + + private void procesarInformacionAgenciaESA() throws AgenciaESAException { + System.out.println(TipoExperimento.Climatológico.toString()); + IExperimentoDao experimentoDao = null; + experimentoDao.obtenerListaExperimentos(); + + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/IBaseDao.java b/src/main/java/eu/agenciaesa/inm/dao/IBaseDao.java new file mode 100644 index 0000000..0c84362 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/IBaseDao.java @@ -0,0 +1,13 @@ +package eu.agenciaesa.inm.dao; + +import java.util.List; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.vo.Base; + +public interface IBaseDao { + void insertarListaBases(List listaBases) throws AgenciaESAException; + + List obtenerListaBases() throws AgenciaESAException; + + Base obtenerBasePorCodigo(String codigo) throws AgenciaESAException; +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/ICuerpoCelesteDao.java b/src/main/java/eu/agenciaesa/inm/dao/ICuerpoCelesteDao.java new file mode 100644 index 0000000..37dc9d4 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/ICuerpoCelesteDao.java @@ -0,0 +1,13 @@ +package eu.agenciaesa.inm.dao; + +import java.util.List; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.vo.CuerpoCeleste; + +public interface ICuerpoCelesteDao { + void insertarListaCuerposCelestes(List listaCuerpos) throws AgenciaESAException; + + List obtenerListaCuerposCelestes() throws AgenciaESAException; + + CuerpoCeleste obtenerCuerpoPorNombre(String nombre) throws AgenciaESAException; +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/IExperimentoDao.java b/src/main/java/eu/agenciaesa/inm/dao/IExperimentoDao.java new file mode 100644 index 0000000..2e3bd4b --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/IExperimentoDao.java @@ -0,0 +1,12 @@ +package eu.agenciaesa.inm.dao; + +import java.util.List; + +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.vo.Experimento; + +public interface IExperimentoDao { + void insertarListaExperimentos(List listaExperimentos) throws AgenciaESAException; + + List obtenerListaExperimentos() throws AgenciaESAException; +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/IGeneradorDao.java b/src/main/java/eu/agenciaesa/inm/dao/IGeneradorDao.java new file mode 100644 index 0000000..55698f6 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/IGeneradorDao.java @@ -0,0 +1,11 @@ +package eu.agenciaesa.inm.dao; + +import java.util.List; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.vo.Generador; + +public interface IGeneradorDao { + void insertarListaGeneradores(List listaGeneradores) throws AgenciaESAException; + + List obtenerListaGeneradores() throws AgenciaESAException; +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/IModuloDao.java b/src/main/java/eu/agenciaesa/inm/dao/IModuloDao.java new file mode 100644 index 0000000..cf1b8bd --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/IModuloDao.java @@ -0,0 +1,11 @@ +package eu.agenciaesa.inm.dao; + +import java.util.List; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.vo.Modulo; + +public interface IModuloDao { + void insertarListaModulos(List listaModulos) throws AgenciaESAException; + + List obtenerListaModulos() throws AgenciaESAException; +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/hibernate/BaseDaoHibernate.java b/src/main/java/eu/agenciaesa/inm/dao/hibernate/BaseDaoHibernate.java new file mode 100644 index 0000000..a5cbfcc --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/hibernate/BaseDaoHibernate.java @@ -0,0 +1,49 @@ +package eu.agenciaesa.inm.dao.hibernate; + +import java.util.List; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import eu.agenciaesa.inm.dao.IBaseDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorSesionHibernate; +import eu.agenciaesa.inm.vo.Base; + +public class BaseDaoHibernate implements IBaseDao { + + @Override + public void insertarListaBases(List listaBases) throws AgenciaESAException { + Transaction tx = null; + try (Session session = GestorSesionHibernate.getSession()) { + tx = session.beginTransaction(); + for (Base base : listaBases) { + session.persist(base); + } + tx.commit(); + } catch (Exception e) { + if (tx != null) + tx.rollback(); + throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, BaseDaoHibernate.class); + } + } + + @Override + public List obtenerListaBases() throws AgenciaESAException { + try (Session session = GestorSesionHibernate.getSession()) { + Query query = session.createQuery("FROM Base", Base.class); + return query.list(); + } catch (Exception e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, BaseDaoHibernate.class); + } + } + + @Override + public Base obtenerBasePorCodigo(String codigo) throws AgenciaESAException { + try (Session session = GestorSesionHibernate.getSession()) { + return session.find(Base.class, codigo); + } catch (Exception e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, BaseDaoHibernate.class); + } + } +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/hibernate/ModuloDaoHibernate.java b/src/main/java/eu/agenciaesa/inm/dao/hibernate/ModuloDaoHibernate.java new file mode 100644 index 0000000..83f8166 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/hibernate/ModuloDaoHibernate.java @@ -0,0 +1,40 @@ +package eu.agenciaesa.inm.dao.hibernate; + +import java.util.List; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import eu.agenciaesa.inm.dao.IModuloDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorSesionHibernate; +import eu.agenciaesa.inm.vo.Modulo; + +public class ModuloDaoHibernate implements IModuloDao { + + @Override + public void insertarListaModulos(List listaModulos) throws AgenciaESAException { + Transaction tx = null; + try (Session session = GestorSesionHibernate.getSession()) { + tx = session.beginTransaction(); + for (Modulo modulo : listaModulos) { + session.persist(modulo); + } + tx.commit(); + } catch (Exception e) { + if (tx != null) + tx.rollback(); + throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, ModuloDaoHibernate.class); + } + } + + @Override + public List obtenerListaModulos() throws AgenciaESAException { + try (Session session = GestorSesionHibernate.getSession()) { + Query query = session.createQuery("FROM Modulo", Modulo.class); + return query.list(); + } catch (Exception e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, ModuloDaoHibernate.class); + } + } +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/jdbc/CuerpoCelesteDaoJDBC.java b/src/main/java/eu/agenciaesa/inm/dao/jdbc/CuerpoCelesteDaoJDBC.java new file mode 100644 index 0000000..1797b85 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/jdbc/CuerpoCelesteDaoJDBC.java @@ -0,0 +1,88 @@ +package eu.agenciaesa.inm.dao.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import eu.agenciaesa.inm.dao.ICuerpoCelesteDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorConexionJDBC; +import eu.agenciaesa.inm.vo.CuerpoCeleste; +import eu.agenciaesa.inm.vo.TipoCuerpoCeleste; + +public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDao { + + @Override + public void insertarListaCuerposCelestes(List listaCuerpos) throws AgenciaESAException { + String sql = "INSERT INTO T_CUERPO_CELESTE (nombre, gravedad_superficie_ms2, tipo) VALUES (?, ?, ?)"; + try (Connection con = GestorConexionJDBC.getConexionSGDB(); + PreparedStatement ps = con.prepareStatement(sql)) { + + con.setAutoCommit(false); + for (CuerpoCeleste cuerpo : listaCuerpos) { + ps.setString(1, cuerpo.getNombre()); + ps.setDouble(2, cuerpo.getGravedadSuperficioMs2()); + ps.setString(3, cuerpo.getTipo() != null ? cuerpo.getTipo().name() : null); + ps.addBatch(); + } + ps.executeBatch(); + con.commit(); + } catch (SQLException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, CuerpoCelesteDaoJDBC.class); + } + } + + @Override + public List obtenerListaCuerposCelestes() throws AgenciaESAException { + List lista = new ArrayList<>(); + String sql = "SELECT * FROM T_CUERPO_CELESTE"; + try (Connection con = GestorConexionJDBC.getConexionSGDB(); + PreparedStatement ps = con.prepareStatement(sql); + ResultSet rs = ps.executeQuery()) { + + while (rs.next()) { + CuerpoCeleste cuerpo = new CuerpoCeleste(); + cuerpo.setIdentificador(rs.getLong("identificador")); + cuerpo.setNombre(rs.getString("nombre")); + cuerpo.setGravedadSuperficioMs2(rs.getDouble("gravedad_superficie_ms2")); + String tipoStr = rs.getString("tipo"); + if (tipoStr != null) { + cuerpo.setTipo(TipoCuerpoCeleste.valueOf(tipoStr)); + } + lista.add(cuerpo); + } + } catch (SQLException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, CuerpoCelesteDaoJDBC.class); + } + return lista; + } + + @Override + public CuerpoCeleste obtenerCuerpoPorNombre(String nombre) throws AgenciaESAException { + CuerpoCeleste cuerpo = null; + String sql = "SELECT * FROM T_CUERPO_CELESTE WHERE nombre = ?"; + try (Connection con = GestorConexionJDBC.getConexionSGDB(); + PreparedStatement ps = con.prepareStatement(sql)) { + + ps.setString(1, nombre); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + cuerpo = new CuerpoCeleste(); + cuerpo.setIdentificador(rs.getLong("identificador")); + cuerpo.setNombre(rs.getString("nombre")); + cuerpo.setGravedadSuperficioMs2(rs.getDouble("gravedad_superficie_ms2")); + String tipoStr = rs.getString("tipo"); + if (tipoStr != null) { + cuerpo.setTipo(TipoCuerpoCeleste.valueOf(tipoStr)); + } + } + } + } catch (SQLException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, CuerpoCelesteDaoJDBC.class); + } + return cuerpo; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/jdbc/GeneradorDaoJDBC.java b/src/main/java/eu/agenciaesa/inm/dao/jdbc/GeneradorDaoJDBC.java new file mode 100644 index 0000000..3d2ba35 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/jdbc/GeneradorDaoJDBC.java @@ -0,0 +1,70 @@ +package eu.agenciaesa.inm.dao.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import eu.agenciaesa.inm.dao.IGeneradorDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorConexionJDBC; +import eu.agenciaesa.inm.vo.Base; +import eu.agenciaesa.inm.vo.Generador; +import eu.agenciaesa.inm.vo.TipoGenerador; + +public class GeneradorDaoJDBC implements IGeneradorDao { + + @Override + public void insertarListaGeneradores(List listaGeneradores) throws AgenciaESAException { + String sql = "INSERT INTO T_GENERADOR (nombre, potencia_mw, tipo, cod_base) VALUES (?, ?, ?, ?)"; + try (Connection con = GestorConexionJDBC.getConexionSGDB(); + PreparedStatement ps = con.prepareStatement(sql)) { + + con.setAutoCommit(false); + for (Generador gen : listaGeneradores) { + ps.setString(1, gen.getNombre()); + ps.setDouble(2, gen.getPotenciaMW()); + ps.setString(3, gen.getTipo() != null ? gen.getTipo().name() : null); + ps.setString(4, gen.getBase() != null ? gen.getBase().getCodigo() : null); + ps.addBatch(); + } + ps.executeBatch(); + con.commit(); + } catch (SQLException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, GeneradorDaoJDBC.class); + } + } + + @Override + public List obtenerListaGeneradores() throws AgenciaESAException { + List lista = new ArrayList<>(); + String sql = "SELECT * FROM T_GENERADOR"; + try (Connection con = GestorConexionJDBC.getConexionSGDB(); + PreparedStatement ps = con.prepareStatement(sql); + ResultSet rs = ps.executeQuery()) { + + while (rs.next()) { + Generador gen = new Generador(); + gen.setIdentificador(rs.getLong("identificador")); + gen.setNombre(rs.getString("nombre")); + gen.setPotenciaMW(rs.getDouble("potencia_mw")); + String tipoStr = rs.getString("tipo"); + if (tipoStr != null) { + gen.setTipo(TipoGenerador.valueOf(tipoStr)); + } + String codBase = rs.getString("cod_base"); + if (codBase != null) { + Base base = new Base(); + base.setCodigo(codBase); + gen.setBase(base); + } + lista.add(gen); + } + } catch (SQLException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, GeneradorDaoJDBC.class); + } + return lista; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/dao/jpa/ExperimentoDaoJPA.java b/src/main/java/eu/agenciaesa/inm/dao/jpa/ExperimentoDaoJPA.java new file mode 100644 index 0000000..b219d48 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/dao/jpa/ExperimentoDaoJPA.java @@ -0,0 +1,50 @@ +package eu.agenciaesa.inm.dao.jpa; + +import java.util.List; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.TypedQuery; + +import eu.agenciaesa.inm.dao.IExperimentoDao; +import eu.agenciaesa.inm.excepciones.AgenciaESAException; +import eu.agenciaesa.inm.gestores.GestorEntityManagerJPA; +import eu.agenciaesa.inm.vo.Experimento; + +public class ExperimentoDaoJPA implements IExperimentoDao { + + @Override + public void insertarListaExperimentos(List listaExperimentos) throws AgenciaESAException { + EntityManager em = GestorEntityManagerJPA.getEntityManager(); + EntityTransaction tx = em.getTransaction(); + try { + tx.begin(); + for (Experimento exp : listaExperimentos) { + // El campo "resultado" ya viene calculado por el ProcesadorDatos + // siguiendo las reglas de negocio, o se puede recalcular aquí. + // Según el requisito: "el campo resultado seguirá estás condiciones..." + // Me aseguro de persistir el objeto. + em.persist(exp); + } + tx.commit(); + } catch (Exception e) { + if (tx.isActive()) + tx.rollback(); + throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, ExperimentoDaoJPA.class); + } finally { + em.close(); + } + } + + @Override + public List obtenerListaExperimentos() throws AgenciaESAException { + EntityManager em = GestorEntityManagerJPA.getEntityManager(); + try { + TypedQuery query = em.createQuery("SELECT e FROM Experimento e", Experimento.class); + return query.getResultList(); + } catch (Exception e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, ExperimentoDaoJPA.class); + } finally { + em.close(); + } + } +} diff --git a/src/main/java/eu/agenciaesa/inm/excepciones/AgenciaESAException.java b/src/main/java/eu/agenciaesa/inm/excepciones/AgenciaESAException.java new file mode 100644 index 0000000..b164a34 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/excepciones/AgenciaESAException.java @@ -0,0 +1,40 @@ +package eu.agenciaesa.inm.excepciones; + +public class AgenciaESAException extends Exception { + + private static final long serialVersionUID = 1L; + + public static final int ERROR_GENERAL = 0; + public static final int ERROR_GESTION_CONEXION = 1; + public static final int ERROR_CONSULTA = 2; + public static final int ERROR_INSERCION = 3; + public static final int ERROR_ACTUALIZACION = 4; + public static final int ERROR_BORRADO = 5; + + private int codigoError; + private Class claseOrigen; + + @SuppressWarnings("rawtypes") + public AgenciaESAException(Exception excepcion, int tipoError, Class claseOrigenError) { + super(excepcion); + this.codigoError = tipoError; + this.claseOrigen = claseOrigenError; + } + + public int getCodigoError() { + return codigoError; + } + + public void setCodigoError(int codigoError) { + this.codigoError = codigoError; + } + + public Class getClaseOrigen() { + return claseOrigen; + } + + public void setClaseOrigen(Class claseOrigen) { + this.claseOrigen = claseOrigen; + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionJDBC.java b/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionJDBC.java new file mode 100644 index 0000000..f77f30f --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionJDBC.java @@ -0,0 +1,38 @@ +package eu.agenciaesa.inm.gestores; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import eu.agenciaesa.inm.excepciones.AgenciaESAException; + +/** + * GestorConexionJDBC: Clase que gestiona las conexiones JDBC a la base de + * datos. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + */ +public class GestorConexionJDBC { + + // Evita que pueda construirse un objeto de la clase. + private GestorConexionJDBC() { + } + + public static Connection getConexionSGDB() throws AgenciaESAException { + Connection conexionSGDB = null; + + String urlBBDD = GestorFicheroConfiguracion.obtenerValor("jdbc.url"); + String usuario = GestorFicheroConfiguracion.obtenerValor("jdbc.usuario"); + String contrasenya = GestorFicheroConfiguracion.obtenerValor("jdbc.password"); + + try { + String claseDriver = GestorFicheroConfiguracion.obtenerValor("jdbc.driver"); + Class.forName(claseDriver); + conexionSGDB = DriverManager.getConnection(urlBBDD, usuario, contrasenya); + } catch (SQLException | ClassNotFoundException e) { + throw new AgenciaESAException(e, AgenciaESAException.ERROR_GESTION_CONEXION, GestorConexionJDBC.class); + } + + return conexionSGDB; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionMongoDB.java b/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionMongoDB.java new file mode 100644 index 0000000..79767a5 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/gestores/GestorConexionMongoDB.java @@ -0,0 +1,39 @@ +package eu.agenciaesa.inm.gestores; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoDatabase; + +/** + * + * GestorConexionMongoDB: Clase que realiza la gestión de Conexiones a MongoDB. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 30 enero 2026 + * + * + */ + +public class GestorConexionMongoDB { + private static MongoDatabase mongoDBDatabase= null; + + private GestorConexionMongoDB() { // Constructor privado para evitar instanciación + } + + // Carga la configuración desde META-INF/persistence.xml + static { + // Cadena de conexion con la base de datos MongoDB + String uri = GestorFicheroConfiguracion.obtenerValor("url.conexion.mongodb"); + // Se abre la conexión con MongoDB + MongoClient clienteMongo = MongoClients.create(uri); + + // Obtener una base de datos MongoDB desde Java + String bbddMongoDB= GestorFicheroConfiguracion.obtenerValor("bbdd.mongodb"); + mongoDBDatabase = clienteMongo.getDatabase(bbddMongoDB); + } + + public static MongoDatabase getMongoDatabase() { + return mongoDBDatabase; + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/gestores/GestorEntityManagerJPA.java b/src/main/java/eu/agenciaesa/inm/gestores/GestorEntityManagerJPA.java new file mode 100644 index 0000000..cdd1e7e --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/gestores/GestorEntityManagerJPA.java @@ -0,0 +1,41 @@ +package eu.agenciaesa.inm.gestores; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + +/** + * + * GestorEntityManagerJPA: Clase que realiza la gestión de EntityManagers de JPA. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 4 dic 2025 + * + * + */ + +public class GestorEntityManagerJPA { + private static EntityManagerFactory entityManagerFactory = null; + + private GestorEntityManagerJPA() { // Constructor privado para evitar instanciación + } + + // Carga la configuración desde META-INF/persistence.xml + static { + try { + entityManagerFactory = Persistence.createEntityManagerFactory("UP_AGENCIAESA_POSTGRESQL"); + } catch (Throwable ex) { + System.err.println("Error en EntityManagerFactory: " + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static EntityManager getEntityManager() { + return entityManagerFactory.createEntityManager(); + } + + + public static void closeEntityManagerFactory() { + entityManagerFactory.close(); + } +} diff --git a/src/main/java/eu/agenciaesa/inm/gestores/GestorFicheroConfiguracion.java b/src/main/java/eu/agenciaesa/inm/gestores/GestorFicheroConfiguracion.java new file mode 100644 index 0000000..4257168 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/gestores/GestorFicheroConfiguracion.java @@ -0,0 +1,39 @@ +/** + * GestorFicheroConfiguracion: clase utilitaria para leer propiedades del archivo application.properties. + * Provee un método estático que devuelve el valor asociado a una clave. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.agenciaesa.inm.gestores; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class GestorFicheroConfiguracion { + private static final Properties PROPIEDADES = new Properties(); + + static { + try (InputStream is = GestorFicheroConfiguracion.class.getClassLoader() + .getResourceAsStream("conf.properties")) { + if (is != null) { + PROPIEDADES.load(is); + } else { + throw new IllegalStateException("No se encontró application.properties en el classpath"); + } + } catch (IOException e) { + throw new IllegalStateException("Error al cargar application.properties", e); + } + } + + /** + * Obtiene el valor asociado a la clave especificada. + * + * @param clave la clave a buscar + * @return el valor o {@code null} si no existe + */ + public static String obtenerValor(String clave) { + return PROPIEDADES.getProperty(clave); + } +} diff --git a/src/main/java/eu/agenciaesa/inm/gestores/GestorSesionHibernate.java b/src/main/java/eu/agenciaesa/inm/gestores/GestorSesionHibernate.java new file mode 100644 index 0000000..3f4e2c4 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/gestores/GestorSesionHibernate.java @@ -0,0 +1,42 @@ +package eu.agenciaesa.inm.gestores; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +/** + * GestorSesionHibernate: gestiona las sesiones de Hibernate para la Agencia + * ESA. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + */ +public class GestorSesionHibernate { + private static SessionFactory sessionFactory = null; + + private GestorSesionHibernate() {// Constructor privado para evitar instanciación + } + + // Carga la configuración desde hibernate.cfg.xml + static { + try { + sessionFactory = new Configuration().configure().buildSessionFactory(); + } catch (Throwable ex) { + System.err.println("Error en SessionFactory: " + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static Session getSession() { + return sessionFactory.openSession(); + } + + public static Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + + public static void cerrarFactoria() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/src/main/java/eu/agenciaesa/inm/procesamiento/ProcesadorDatos.java b/src/main/java/eu/agenciaesa/inm/procesamiento/ProcesadorDatos.java new file mode 100644 index 0000000..8d73bd1 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/procesamiento/ProcesadorDatos.java @@ -0,0 +1,380 @@ +package eu.agenciaesa.inm.procesamiento; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import eu.agenciaesa.inm.gestores.GestorFicheroConfiguracion; +import eu.agenciaesa.inm.utilidades.GestorURLs; +import eu.agenciaesa.inm.vo.Base; +import eu.agenciaesa.inm.vo.CuerpoCeleste; +import eu.agenciaesa.inm.vo.Experimento; +import eu.agenciaesa.inm.vo.FuncionPrincipalBase; +import eu.agenciaesa.inm.vo.Generador; +import eu.agenciaesa.inm.vo.Modulo; +import eu.agenciaesa.inm.vo.TipoExperimento; +import eu.agenciaesa.inm.vo.TipoGenerador; + +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.xml.XmlMapper; + +/** + * ProcesadorDatos: clase que procesa los distintos orígenes de información + * de la Agencia ESA (XML, JSON, CSV), usando JsonNode de Jackson sin + * anotaciones + * de mapeo. + * + * Estructura espejada de ProcesadorDatos en examen_aadd_2trim_FP. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + */ +public class ProcesadorDatos { + + // ----------------------------------------------------------------------- + // BASES Y MÓDULOS desde XML + // ----------------------------------------------------------------------- + + /** + * Obtiene la lista de Bases (con sus Módulos) desde la URL XML configurada. + * + * @return Lista de objetos Base o null si hay error. + */ + public List obtenerBasesDeURL(String urlBases) { + List listaBases = null; + + String xmlContenido = GestorURLs.getTextoFromURL(urlBases); + if (xmlContenido == null || xmlContenido.isEmpty()) { + System.err.println("No se pudo obtener el XML de bases desde la URL: " + urlBases); + return null; + } + + ObjectMapper mapeadorXML = new XmlMapper(); + try { + JsonNode nodoRaiz = mapeadorXML.readTree(xmlContenido); + if (nodoRaiz != null) { + listaBases = new ArrayList<>(); + + // El XML tiene ...... + // Jackson XML convierte el nodo raíz en el elemento "bases" + // y los hijos "base" en campos o arrays. + JsonNode nodoBases = nodoRaiz.has("base") ? nodoRaiz.get("base") : nodoRaiz; + + if (nodoBases.isArray()) { + for (JsonNode nodoBase : nodoBases) { + Base base = obtenerBaseDeJsonNode(nodoBase); + if (base != null) + listaBases.add(base); + } + } else if (!nodoBases.isMissingNode() && !nodoBases.isNull()) { + Base base = obtenerBaseDeJsonNode(nodoBases); + if (base != null) + listaBases.add(base); + } + } + } catch (Exception e) { + System.err.println("Error procesando XML de bases con JsonNode: " + e.getMessage()); + e.printStackTrace(); + } + + return listaBases; + } + + /** + * Convierte un JsonNode que representa un elemento <base> del XML. + */ + private Base obtenerBaseDeJsonNode(JsonNode nodoBase) { + if (nodoBase == null || nodoBase.isNull()) + return null; + + Base base = new Base(); + + if (nodoBase.has("id")) { + base.setCodigo(nodoBase.get("id").asText("")); + } + if (nodoBase.has("nombre")) { + base.setNombre(nodoBase.get("nombre").asText("")); + } + if (nodoBase.has("fecha_establecimiento")) { + String fechaStr = nodoBase.get("fecha_establecimiento").asText(""); + if (!fechaStr.isEmpty()) { + try { + base.setFechaEstablecimiento(LocalDate.parse(fechaStr)); + } catch (Exception e) { + System.err.println("Fecha de establecimiento no válida: " + fechaStr); + } + } + } + if (nodoBase.has("funcion_ppal")) { + String funcion = nodoBase.get("funcion_ppal").asText(""); + try { + base.setFuncionPrincipal(FuncionPrincipalBase.valueOf(funcion)); + } catch (IllegalArgumentException e) { + System.err.println("Función principal desconocida: " + funcion); + } + } + // Cuerpo celeste referenciado por nombre en el atributo nombre del elemento + // + if (nodoBase.has("cuerpo")) { + JsonNode nodoCuerpo = nodoBase.get("cuerpo"); + String nombreCuerpo = nodoCuerpo.has("nombre") ? nodoCuerpo.get("nombre").asText("") : ""; + if (!nombreCuerpo.isEmpty()) { + CuerpoCeleste cuerpo = new CuerpoCeleste(); + cuerpo.setNombre(nombreCuerpo); + base.setCuerpo(cuerpo); + } + } + + return base; + } + + /** + * Obtiene la lista de Módulos para una base a partir del JsonNode de la base. + * Se llama por el procesador de bases para extraer módulos anidados. + */ + public List obtenerModulosDeBase(JsonNode nodoBase, Base base) { + List listaModulos = new ArrayList<>(); + if (nodoBase == null || !nodoBase.has("modulos")) + return listaModulos; + + JsonNode nodoModulos = nodoBase.get("modulos"); + JsonNode nodoModulo = nodoModulos.has("modulo") ? nodoModulos.get("modulo") : nodoModulos; + + if (nodoModulo.isArray()) { + for (JsonNode m : nodoModulo) { + Modulo modulo = obtenerModuloDeJsonNode(m, base); + if (modulo != null) + listaModulos.add(modulo); + } + } else if (!nodoModulo.isMissingNode() && !nodoModulo.isNull()) { + Modulo modulo = obtenerModuloDeJsonNode(nodoModulo, base); + if (modulo != null) + listaModulos.add(modulo); + } + return listaModulos; + } + + private Modulo obtenerModuloDeJsonNode(JsonNode nodoModulo, Base base) { + if (nodoModulo == null || nodoModulo.isNull()) + return null; + Modulo modulo = new Modulo(); + if (nodoModulo.has("id")) { + modulo.setCodigo(nodoModulo.get("id").asText("")); + } + if (nodoModulo.has("nombre")) { + modulo.setNombre(nodoModulo.get("nombre").asText("")); + } + if (nodoModulo.has("consumo_energia")) { + modulo.setConsumoEnergiaMW(nodoModulo.get("consumo_energia").asDouble(0.0)); + } + modulo.setBase(base); + return modulo; + } + + // ----------------------------------------------------------------------- + // EXPERIMENTOS desde JSON + // ----------------------------------------------------------------------- + + /** + * Obtiene la lista de Experimentos desde la URL JSON configurada. + * Aplica la lógica de construcción del campo "resultado" según el tipo. + * + * @return Lista de objetos Experimento o null si hay error. + */ + public List obtenerExperimentosDeURL(String urlExperimentos) { + List listaExperimentos = null; + + String jsonContenido = GestorURLs.getTextoFromURL(urlExperimentos); + if (jsonContenido == null || jsonContenido.isEmpty()) { + System.err.println("No se pudo obtener el JSON de experimentos desde la URL: " + urlExperimentos); + return null; + } + + ObjectMapper mapeadorJSON = new ObjectMapper(); + try { + JsonNode nodoRaiz = mapeadorJSON.readTree(jsonContenido); + if (nodoRaiz != null) { + listaExperimentos = new ArrayList<>(); + + // El JSON puede ser un array de experimentos directamente o + // un objeto con un campo "experimentos" o similar. + JsonNode elementos = nodoRaiz.isArray() ? nodoRaiz + : (nodoRaiz.has("experimentos") ? nodoRaiz.get("experimentos") : nodoRaiz); + + if (elementos.isArray()) { + for (JsonNode nodo : elementos) { + Experimento exp = obtenerExperimentoDeJsonNode(nodo); + if (exp != null) + listaExperimentos.add(exp); + } + } else if (!elementos.isMissingNode() && !elementos.isNull()) { + // Iterar los campos del objeto por si cada campo es un experimento + Iterator campos = elementos.elements(); + while (campos.hasNext()) { + Experimento exp = obtenerExperimentoDeJsonNode(campos.next()); + if (exp != null) + listaExperimentos.add(exp); + } + } + } + } catch (Exception e) { + System.err.println("Error procesando JSON de experimentos con JsonNode: " + e.getMessage()); + e.printStackTrace(); + } + + return listaExperimentos; + } + + /** + * Convierte un JsonNode que representa un experimento en el objeto Experimento, + * incluyendo la construcción del campo resultado según el tipo. + */ + private Experimento obtenerExperimentoDeJsonNode(JsonNode nodoExp) { + if (nodoExp == null || nodoExp.isNull()) + return null; + + Experimento experimento = new Experimento(); + + if (nodoExp.has("nombre")) { + experimento.setNombre(nodoExp.get("nombre").asText("")); + } + + // Tipo de experimento + TipoExperimento tipo = null; + if (nodoExp.has("tipo")) { + try { + tipo = TipoExperimento.valueOf(nodoExp.get("tipo").asText("")); + experimento.setTipo(tipo); + } catch (IllegalArgumentException e) { + System.err.println("Tipo de experimento desconocido: " + nodoExp.get("tipo").asText("")); + } + } + + // Módulo asociado (solo se asocia código para que el DAO resuelva la relación) + if (nodoExp.has("cod_modulo")) { + Modulo modulo = new Modulo(); + modulo.setCodigo(nodoExp.get("cod_modulo").asText("")); + experimento.setModulo(modulo); + } + + // Construcción del campo "resultado" según la lógica de negocio del + // ContextoProyecto + String resultado = construirResultado(tipo, nodoExp); + experimento.setResultado(resultado); + + return experimento; + } + + /** + * Aplica las reglas de negocio del ContextoProyecto para el campo resultado: + *
    + *
  • Geológico: "Muestra de {material} obtenida a {profundidad} m de + * profundidad."
  • + *
  • Biológico: "Análisis de {organismo} realizado bajo nivel {nivel} + * de bioseguridad.
  • + *
  • Climatológico: "Estudio de {variable} durante {dias} días con + * frecuencia {frecuencia}."
  • + *
+ */ + private String construirResultado(TipoExperimento tipo, JsonNode nodo) { + if (tipo == null) + return "Resultado no determinado."; + switch (tipo) { + case Geológico: + String material = nodo.has("material") ? nodo.get("material").asText("Basalto") : "Basalto"; + String profundidad = nodo.has("profundidad") ? nodo.get("profundidad").asText("120") : "120"; + return String.format("Muestra de %s obtenida a %s m de profundidad.", material, profundidad); + + case Biológico: + String organismo = nodo.has("organismo") ? nodo.get("organismo").asText("Microorganismo") + : "Microorganismo"; + String nivel = nodo.has("nivel") ? nodo.get("nivel").asText("3") : "3"; + return String.format("Análisis de %s realizado bajo nivel %s de bioseguridad.", organismo, nivel); + + case Climatológico: + String variable = nodo.has("variable") ? nodo.get("variable").asText("Temperatura") : "Temperatura"; + String dias = nodo.has("dias") ? nodo.get("dias").asText("30") : "30"; + String frecuencia = nodo.has("frecuencia") ? nodo.get("frecuencia").asText("Diaria") : "Diaria"; + return String.format("Estudio de %s durante %s días con frecuencia %s.", variable, dias, frecuencia); + + default: + return "Resultado no determinado."; + } + } + + // ----------------------------------------------------------------------- + // GENERADORES desde CSV + // ----------------------------------------------------------------------- + + /** + * Obtiene la lista de Generadores desde un fichero CSV. + * Cabecera esperada: identificador,nombre,potencia_mw,tipo,cod_base + * + * @param rutaCSV ruta al fichero CSV + * @return Lista de Generador o null si hay error. + */ + public List obtenerGeneradoresDeFicheroCSV(String rutaCSV) { + List listaGeneradores = null; + + try (BufferedReader reader = new BufferedReader(new FileReader(rutaCSV))) { + listaGeneradores = new ArrayList<>(); + String linea; + boolean primeraLinea = true; + + while ((linea = reader.readLine()) != null) { + if (primeraLinea) { + // Saltar cabecera + primeraLinea = false; + continue; + } + if (linea.trim().isEmpty()) + continue; + + Generador generador = obtenerGeneradorDeLineaCSV(linea); + if (generador != null) + listaGeneradores.add(generador); + } + } catch (IOException e) { + System.err.println("Error leyendo CSV de generadores: " + e.getMessage()); + e.printStackTrace(); + } + + return listaGeneradores; + } + + /** + * Parsea una línea del CSV y devuelve un Generador. + * Formato: nombre,potencia_mw,tipo,cod_base + */ + private Generador obtenerGeneradorDeLineaCSV(String linea) { + String[] partes = linea.split(","); + if (partes.length < 4) { + System.err.println("Línea CSV de generador con formato incorrecto: " + linea); + return null; + } + + Generador generador = new Generador(); + generador.setNombre(partes[0].trim()); + try { + generador.setPotenciaMW(Double.parseDouble(partes[1].trim())); + } catch (NumberFormatException e) { + System.err.println("Potencia MW no válida: " + partes[1].trim()); + } + try { + generador.setTipo(TipoGenerador.valueOf(partes[2].trim())); + } catch (IllegalArgumentException e) { + System.err.println("Tipo de generador desconocido: " + partes[2].trim()); + } + if (partes.length >= 4 && !partes[3].trim().isEmpty()) { + Base base = new Base(); + base.setCodigo(partes[3].trim()); + generador.setBase(base); + } + + return generador; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/utilidades/GestorURLs.java b/src/main/java/eu/agenciaesa/inm/utilidades/GestorURLs.java new file mode 100644 index 0000000..7bee6ff --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/utilidades/GestorURLs.java @@ -0,0 +1,42 @@ +package eu.agenciaesa.inm.utilidades; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpResponse.BodyHandlers; + +/** + * GestorURLs: Clase de utilidades para descargar contenido de URLs. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + */ +public class GestorURLs { + + // Evita que pueda construirse un objeto de la clase. + private GestorURLs() { + } + + /** + * Descarga el contenido textual de la URL indicada. + * + * @param rutaURL URL de la que obtener el texto + * @return Texto de la respuesta o null si ocurre un error + */ + public static String getTextoFromURL(String rutaURL) { + String resultadoURL = null; + + HttpClient cliente = HttpClient.newHttpClient(); + URI uriPrueba = URI.create(rutaURL); + HttpRequest request = HttpRequest.newBuilder().uri(uriPrueba).GET().build(); + try { + HttpResponse respuesta = cliente.send(request, BodyHandlers.ofString()); + resultadoURL = respuesta.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return resultadoURL; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Base.java b/src/main/java/eu/agenciaesa/inm/vo/Base.java new file mode 100644 index 0000000..7958419 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Base.java @@ -0,0 +1,76 @@ +package eu.agenciaesa.inm.vo; + +import java.time.LocalDate; + +import jakarta.persistence.*; + +/** + * Entidad que representa la tabla T_BASE. + */ +@Entity +@Table(name = "T_BASE") +public class Base { + @Id + @Column(name = "codigo", columnDefinition = "char(4)") + private String codigo; + + @Column(name = "nombre", nullable = false, length = 100) + private String nombre; + + @Column(name = "fecha_establecimiento") + private LocalDate fechaEstablecimiento; + + @Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado + @Column(name = "funcion_principal", nullable = false) + private FuncionPrincipalBase funcionPrincipal; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "id_cuerpo", referencedColumnName = "identificador") + private CuerpoCeleste cuerpo; + + public String getCodigo() { + return codigo; + } + + public void setCodigo(String codigo) { + this.codigo = codigo; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public LocalDate getFechaEstablecimiento() { + return fechaEstablecimiento; + } + + public void setFechaEstablecimiento(LocalDate fechaEstablecimiento) { + this.fechaEstablecimiento = fechaEstablecimiento; + } + + public FuncionPrincipalBase getFuncionPrincipal() { + return funcionPrincipal; + } + + public void setFuncionPrincipal(FuncionPrincipalBase funcionPrincipal) { + this.funcionPrincipal = funcionPrincipal; + } + + public CuerpoCeleste getCuerpo() { + return cuerpo; + } + + public void setCuerpo(CuerpoCeleste cuerpo) { + this.cuerpo = cuerpo; + } + + @Override + public String toString() { + return "Base [codigo=" + codigo + ", nombre=" + nombre + ", fechaEstablecimiento=" + fechaEstablecimiento + + ", funcionPrincipal=" + funcionPrincipal + ", cuerpo=" + cuerpo + "]"; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/CuerpoCeleste.java b/src/main/java/eu/agenciaesa/inm/vo/CuerpoCeleste.java new file mode 100644 index 0000000..e1cf9be --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/CuerpoCeleste.java @@ -0,0 +1,61 @@ +package eu.agenciaesa.inm.vo; + +import jakarta.persistence.*; + +/** + * Entidad que representa la tabla T_CUERPO_CELESTE. + */ +@Entity +@Table(name = "T_CUERPO_CELESTE") +public class CuerpoCeleste { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long identificador; + + @Column(name = "nombre", nullable = false, length = 100) + private String nombre; + + @Column(name = "gravedad_superficie_ms2", nullable = false) + private double gravedadSuperficioMs2; + + @Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado + private TipoCuerpoCeleste tipo; + + public Long getIdentificador() { + return identificador; + } + + public void setIdentificador(Long identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public double getGravedadSuperficioMs2() { + return gravedadSuperficioMs2; + } + + public void setGravedadSuperficioMs2(double gravedadSuperficioMs2) { + this.gravedadSuperficioMs2 = gravedadSuperficioMs2; + } + + public TipoCuerpoCeleste getTipo() { + return tipo; + } + + public void setTipo(TipoCuerpoCeleste tipo) { + this.tipo = tipo; + } + + @Override + public String toString() { + return "CuerpoCeleste [identificador=" + identificador + ", nombre=" + nombre + ", gravedadSuperficioMs2=" + + gravedadSuperficioMs2 + ", tipo=" + tipo + "]"; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Experimento.java b/src/main/java/eu/agenciaesa/inm/vo/Experimento.java new file mode 100644 index 0000000..83b02ed --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Experimento.java @@ -0,0 +1,84 @@ +package eu.agenciaesa.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * Entidad que representa la tabla T_EXPERIMENTO. + */ +@Entity +@Table(name = "T_EXPERIMENTO") +public class Experimento { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long identificador; + + @Column(name = "nombre", nullable = false, length = 100) + private String nombre; + + @Column(name = "resultado", nullable = false) + private String resultado; + + @Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado + private TipoExperimento tipo; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "cod_modulo", referencedColumnName ="codigo" ) + private Modulo modulo; + + public Long getIdentificador() { + return identificador; + } + + public void setIdentificador(Long identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getResultado() { + return resultado; + } + + public void setResultado(String resultado) { + this.resultado = resultado; + } + + public TipoExperimento getTipo() { + return tipo; + } + + public void setTipo(TipoExperimento tipo) { + this.tipo = tipo; + } + + public Modulo getModulo() { + return modulo; + } + + public void setModulo(Modulo modulo) { + this.modulo = modulo; + } + + @Override + public String toString() { + return "Experimento [identificador=" + identificador + ", nombre=" + nombre + ", resultado=" + resultado + + ", tipo=" + tipo + ", modulo=" + modulo + "]"; + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/FuncionPrincipalBase.java b/src/main/java/eu/agenciaesa/inm/vo/FuncionPrincipalBase.java new file mode 100644 index 0000000..7906789 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/FuncionPrincipalBase.java @@ -0,0 +1,6 @@ +package eu.agenciaesa.inm.vo; + +public enum FuncionPrincipalBase { + Investigación, Logística, Control; + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Generador.java b/src/main/java/eu/agenciaesa/inm/vo/Generador.java new file mode 100644 index 0000000..bad7035 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Generador.java @@ -0,0 +1,84 @@ +package eu.agenciaesa.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; + +/** + * Entidad que representa la tabla T_GENERADOR. + */ +@Entity +@Table(name = "T_GENERADOR") +public class Generador { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "identificador") + private Long identificador; + + @Column(name = "nombre", nullable = false, length = 100) + private String nombre; + + @Column(name = "potencia_mw", nullable = false) + private double potenciaMW; + + @Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado + private TipoGenerador tipo; + + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "cod_base", referencedColumnName = "codigo") + private Base base; + + public Long getIdentificador() { + return identificador; + } + + public void setIdentificador(Long identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public double getPotenciaMW() { + return potenciaMW; + } + + public void setPotenciaMW(double potenciaMW) { + this.potenciaMW = potenciaMW; + } + + public TipoGenerador getTipo() { + return tipo; + } + + public void setTipo(TipoGenerador tipo) { + this.tipo = tipo; + } + + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + } + + @Override + public String toString() { + return "Generador [identificador=" + identificador + ", nombre=" + nombre + ", potenciaMW=" + potenciaMW + + ", tipo=" + tipo + ", base=" + base + "]"; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Mision.java b/src/main/java/eu/agenciaesa/inm/vo/Mision.java new file mode 100644 index 0000000..1aec1b2 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Mision.java @@ -0,0 +1,39 @@ +package eu.agenciaesa.inm.vo; + +import java.time.LocalDate; + +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; + +/** + * Entidad que representa la tabla T_MISION. + */ +@Entity +@Table(name = "T_MISION") +public class Mision { + @EmbeddedId + private MisionID idMision; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("codigoNave") + @JoinColumn(name = "cod_nave", nullable = false, insertable = false, updatable = false) + private Nave nave; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("idCuerpoCeleste") + @JoinColumn(name = "id_cuerpo_celeste", nullable = false, insertable = false, updatable = false) + private CuerpoCeleste cuerpoCeleste; + + @Column(name = "fecha_fin", nullable = true) + private LocalDate fechaFin; + + @Column(name = "objetivo_principal", nullable = false) + private String objetivoPrincipal; + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/MisionID.java b/src/main/java/eu/agenciaesa/inm/vo/MisionID.java new file mode 100644 index 0000000..3a4d969 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/MisionID.java @@ -0,0 +1,80 @@ +package eu.agenciaesa.inm.vo; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.Objects; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +@Embeddable +public class MisionID implements Serializable { + + private static final long serialVersionUID = 1L; + + @Column(name = "cod_nave", nullable = false) + private String codigoNave; + + @Column(name = "id_cuerpo_celeste", nullable = false) + private Long idCuerpoCeleste; + + @Column(name = "fecha_inicio", nullable = false) + private LocalDate fechaInicio; + + public MisionID() {} + + public MisionID(String codigoNave, Long idCuerpoCeleste, LocalDate fechaInicio) { + this.codigoNave = codigoNave; + this.idCuerpoCeleste = idCuerpoCeleste; + this.fechaInicio = fechaInicio; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MisionID that = (MisionID) o; + + return codigoNave == that.codigoNave && idCuerpoCeleste == that.idCuerpoCeleste && fechaInicio == that.fechaInicio; + } + + @Override + public int hashCode() { + return Objects.hash(codigoNave, idCuerpoCeleste, fechaInicio); + } + + public String getCodigoNave() { + return codigoNave; + } + + public void setCodigoNave(String codigoNave) { + this.codigoNave = codigoNave; + } + + public Long getIdCuerpoCeleste() { + return idCuerpoCeleste; + } + + public void setIdCuerpoCeleste(Long idCuerpoCeleste) { + this.idCuerpoCeleste = idCuerpoCeleste; + } + + public LocalDate getFechaInicio() { + return fechaInicio; + } + + public void setFechaInicio(LocalDate fechaInicio) { + this.fechaInicio = fechaInicio; + } + + @Override + public String toString() { + return "MisionID [codigoNave=" + codigoNave + ", idCuerpoCeleste=" + idCuerpoCeleste + ", fechaInicio=" + + fechaInicio + "]"; + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Modulo.java b/src/main/java/eu/agenciaesa/inm/vo/Modulo.java new file mode 100644 index 0000000..25f9012 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Modulo.java @@ -0,0 +1,68 @@ +package eu.agenciaesa.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * Entidad que representa la tabla T_MODULO. + */ +@Entity +@Table(name = "T_MODULO") +public class Modulo { + @Id + @Column(name = "codigo", columnDefinition = "char(4)") + private String codigo; + + @Column(name = "nombre", nullable = false, length = 100) + private String nombre; + + @Column(name = "consumo_energia_mw", nullable = false) + private double consumoEnergiaMW; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "cod_base", referencedColumnName = "codigo") + private Base base; + + public String getCodigo() { + return codigo; + } + + public void setCodigo(String codigo) { + this.codigo = codigo; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public double getConsumoEnergiaMW() { + return consumoEnergiaMW; + } + + public void setConsumoEnergiaMW(double consumoEnergiaMW) { + this.consumoEnergiaMW = consumoEnergiaMW; + } + + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + } + + @Override + public String toString() { + return "Modulo [codigo=" + codigo + ", nombre=" + nombre + ", consumoEnergiaMW=" + consumoEnergiaMW + ", base=" + + base + "]"; + } +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/Nave.java b/src/main/java/eu/agenciaesa/inm/vo/Nave.java new file mode 100644 index 0000000..8c1c0a8 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/Nave.java @@ -0,0 +1,78 @@ +package eu.agenciaesa.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +/** + * Entidad que representa la tabla T_NAVE. + */ +@Entity +@Table(name = "T_NAVE") +public class Nave { + @Id + @Column(name = "codigo", columnDefinition = "char(4)") + private String codigo; + + @Column(name = "nombre", nullable = false, length = 255) + private String nombre; + + @Column(name = "capacidad_tripulacion", nullable = false) + private int capacidadTripulación; + + @Column(name = "autonomia_dias", nullable =false) + private int autonomiaDias; + + @Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado + private TipoNave tipo; + + public TipoNave getTipo() { + return tipo; + } + + public void setTipo(TipoNave tipo) { + this.tipo = tipo; + } + + public String getCodigo() { + return codigo; + } + + public void setCodigo(String codigo) { + this.codigo = codigo; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public int getCapacidadTripulación() { + return capacidadTripulación; + } + + public void setCapacidadTripulación(int capacidadTripulación) { + this.capacidadTripulación = capacidadTripulación; + } + + public int getAutonomiaDias() { + return autonomiaDias; + } + + public void setAutonomiaDias(int autonomiaDias) { + this.autonomiaDias = autonomiaDias; + } + + @Override + public String toString() { + return "Nave [codigo=" + codigo + ", nombre=" + nombre + ", capacidadTripulación=" + capacidadTripulación + + ", autonomiaDias=" + autonomiaDias + "]"; + } + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/TipoCuerpoCeleste.java b/src/main/java/eu/agenciaesa/inm/vo/TipoCuerpoCeleste.java new file mode 100644 index 0000000..fb604f8 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/TipoCuerpoCeleste.java @@ -0,0 +1,6 @@ +package eu.agenciaesa.inm.vo; + +public enum TipoCuerpoCeleste { + Planeta, Satélite, Asteroide, Planetoide; + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/TipoExperimento.java b/src/main/java/eu/agenciaesa/inm/vo/TipoExperimento.java new file mode 100644 index 0000000..a5416b5 --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/TipoExperimento.java @@ -0,0 +1,6 @@ +package eu.agenciaesa.inm.vo; + +public enum TipoExperimento { + Biológico, Climatológico, Geológico; + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/TipoGenerador.java b/src/main/java/eu/agenciaesa/inm/vo/TipoGenerador.java new file mode 100644 index 0000000..35c318e --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/TipoGenerador.java @@ -0,0 +1,6 @@ +package eu.agenciaesa.inm.vo; + +public enum TipoGenerador { + Nuclear, Solar, Geotérmica; + +} diff --git a/src/main/java/eu/agenciaesa/inm/vo/TipoNave.java b/src/main/java/eu/agenciaesa/inm/vo/TipoNave.java new file mode 100644 index 0000000..597301a --- /dev/null +++ b/src/main/java/eu/agenciaesa/inm/vo/TipoNave.java @@ -0,0 +1,6 @@ +package eu.agenciaesa.inm.vo; + +public enum TipoNave { + Transporte, Reconocimiento, Científica, Mantenimiento; + +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..82febc4 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,24 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + + eu.agenciaesa.inm.vo.Experimento + + + + + + + + + + + + + + diff --git a/src/main/resources/conf.properties b/src/main/resources/conf.properties new file mode 100644 index 0000000..506c310 --- /dev/null +++ b/src/main/resources/conf.properties @@ -0,0 +1,5 @@ +url.conexion.mongodb=mongodb://admin:mongodb_123@192.168.1.36:27017 +bbdd.mongodb=agencia_esa_inm +url.bases=https://dam2.decieloytierra.es/agenciaesa/bases-modulos.xml +url.experimentos=https://aulavirtual35.educa.madrid.org/ies.lapaloma.madrid/pluginfile.php/232510/mod_assign/intro/experimentos_modulos.json?time=1771520391646 +ruta.csv=info-generadores.csv \ No newline at end of file diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..d7f6e93 --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,26 @@ + + + + + jdbc:postgresql://192.168.1.36:5432/agencia_esa_inm + org.postgresql.Driver + + org.hibernate.dialect.PostgreSQLDialect + + postgres + postgres_123 + + + update + true + true + false + + + + + + + \ No newline at end of file