Restructarción código

This commit is contained in:
Isidoro Nevares Martín 2026-02-25 12:14:13 +01:00
parent ae3441237a
commit a4372718dc
40 changed files with 747 additions and 947 deletions

View File

@ -26,8 +26,9 @@
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk-25">
<attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
@ -38,19 +39,19 @@
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>aadd_act5_6</name>
<name>aadd_act5_6_v1</name>
<comment></comment>
<projects>
</projects>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -1,9 +1,14 @@
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.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=24
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=24
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
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.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.compiler.source=24

View File

@ -0,0 +1,5 @@
nombre|tipo|potencia_mw|numero_serie|base
Central Nuclear Laguna|Nuclear|1200.50|123456789012345|Arsia Prime
Planta Solar Solida|Solar|50.75|987654321098765|Spanish base Quijote
Planta Geotérmica Térmica|Geotérmica|300.00|456789123456789|Europa Research Hub
Central Nuclear Atlántica|Nuclear|950.25|102938475610293|Base Beyond
1 nombre tipo potencia_mw numero_serie base
2 Central Nuclear Laguna Nuclear 1200.50 123456789012345 Arsia Prime
3 Planta Solar Solida Solar 50.75 987654321098765 Spanish base Quijote
4 Planta Geotérmica Térmica Geotérmica 300.00 456789123456789 Europa Research Hub
5 Central Nuclear Atlántica Nuclear 950.25 102938475610293 Base Beyond

View File

@ -40,5 +40,12 @@
<artifactId>jackson-dataformat-xml</artifactId>
<version>3.0.1</version>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</dependency>
</dependencies>
</project>

View File

@ -1,14 +1,29 @@
package eu.agenciaesa.inm;
import java.util.List;
import eu.agenciaesa.inm.dao.IBaseDao;
import eu.agenciaesa.inm.dao.IExperimentoDao;
import eu.agenciaesa.inm.dao.IGeneradorDao;
import eu.agenciaesa.inm.dao.IModuloDao;
import eu.agenciaesa.inm.dao.hibernate.BaseDaoHibernate;
import eu.agenciaesa.inm.dao.hibernate.ModuloDaoHibernate;
import eu.agenciaesa.inm.dao.jdbc.GeneradorDaoJDBC;
import eu.agenciaesa.inm.dao.jpa.ExperimentoDaoJPA;
import eu.agenciaesa.inm.dao.mngdb.ExperimientoDaoMongoDB;
import eu.agenciaesa.inm.excepciones.AgenciaESAException;
import eu.agenciaesa.inm.gestores.GestorEntityManagerJPA;
import eu.agenciaesa.inm.vo.TipoExperimento;
import eu.agenciaesa.inm.gestores.GestorSesionHibernate;
import eu.agenciaesa.inm.procesamiento.ProcesadorGeneradoresFicheroCSV;
import eu.agenciaesa.inm.procesamiento.ProcesadorModulosURL;
import eu.agenciaesa.inm.vo.Base;
import eu.agenciaesa.inm.vo.Experimento;
import eu.agenciaesa.inm.vo.Generador;
import eu.agenciaesa.inm.vo.Modulo;
/**
* 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.
* Clase principal realiza el procesamiento de información de datos de la
* agencia ESA con orígenes y destinos diversos.
*/
public class AppAgenciaEsa {
public static void main(String[] args) {
@ -16,11 +31,13 @@ public class AppAgenciaEsa {
AppAgenciaEsa app = new AppAgenciaEsa();
// Generación de la base de datos (JPA - hibernate - PostgreSQL)
GestorEntityManagerJPA.getEntityManager();
try {
app.procesarInformacionAgenciaESA();
app.tratarInformacionBasesYModulos();
app.tratarInformacionGeneradores();
app.tratarInformacionExperimentos();
} catch (AgenciaESAException e) {
String mensajeError = "Error en la clase %s al realizar una operación de %s";
String operacion = "Operación desconocida";
@ -46,14 +63,74 @@ public class AppAgenciaEsa {
System.err.println(mensajeError);
e.printStackTrace();
}
// Cerrar recursos al finalizar el programa
GestorSesionHibernate.cerrarFactoria();
GestorEntityManagerJPA.closeEntityManagerFactory();
System.out.println("Fin del programa.");
}
private void procesarInformacionAgenciaESA() throws AgenciaESAException {
System.out.println(TipoExperimento.Climatológico.toString());
IExperimentoDao experimentoDao = null;
experimentoDao.obtenerListaExperimentos();
private void tratarInformacionBasesYModulos() throws AgenciaESAException {
ProcesadorModulosURL procesador = new ProcesadorModulosURL();
/*
* Obtención de la lista de bases con sus módulos anidados a partir de la URL.
* Se jeuga con la cardinalidad que hay en la relacion entre Base y Modulo, que es de 1 a N,
* Una Base contiene una lista de Modulos, y cada Modulo tiene una referencia a su Base "padre".
* Para ello se "jugará" con la configuración de Base (En Base se usa CascadeType.ALL para que al almacenar las bases almacene los módulos).
*/
List<Base> listaBases = procesador.obtenerListaBasesDeURL();
if (listaBases != null) {
IBaseDao baseDao = new BaseDaoHibernate();
for (Base base : listaBases) {
Base baseBBDD= baseDao.obtenerBasePorNombre(base.getNombre());
// Se comprueba si la base ya existe en la BBDD para evitar insertar duplicados,
// ya que no se contempla la actualización de una base existente.
if(baseBBDD==null) {
baseDao.insertarBase(base);
}
}
}
}
private void tratarInformacionGeneradores() throws AgenciaESAException {
ProcesadorGeneradoresFicheroCSV procesador = new ProcesadorGeneradoresFicheroCSV();
List<Generador> listaGeneradores = procesador.obtenerGeneradoresDeFicheroCSV();
if (listaGeneradores != null) {
// Inserción mediante JDBC
IGeneradorDao generadorDao = new GeneradorDaoJDBC();
for (Generador generador : listaGeneradores) {
System.out.println(generador);
Generador generadorBBDD = generadorDao.obtenerGeneradorPorNombre(generador.getNombre());
// Se comprueba si el generador ya existe en la BBDD para evitar insertar duplicados,
if (generadorBBDD ==null) {
generadorDao.insertarGenerador(generador);
}
}
}
}
private void tratarInformacionExperimentos() throws AgenciaESAException {
// Consulta de Experimentos en MongoDB
IExperimentoDao experimentoDao = new ExperimientoDaoMongoDB();
List<Experimento> listaExperimentos = experimentoDao.obtenerListaExperimentos();
if (listaExperimentos != null) {
// Inserción mediante JPA
experimentoDao = new ExperimentoDaoJPA();
for (Experimento experimento : listaExperimentos) {
System.out.println(experimento);
IModuloDao moduloDao = new ModuloDaoHibernate();
Modulo moduloBBDD = moduloDao.obtenerModuloPorCodigo(experimento.getModulo().getCodigo());
//
if(moduloBBDD!=null) {
experimento.setModulo(moduloBBDD);
experimentoDao.insertarExperimento(experimento);
}
}
}
}
}

View File

@ -1,13 +1,10 @@
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<Base> listaBases) throws AgenciaESAException;
void insertarBase(Base base) throws AgenciaESAException;
List<Base> obtenerListaBases() throws AgenciaESAException;
Base obtenerBasePorCodigo(String codigo) throws AgenciaESAException;
Base obtenerBasePorNombre(String nombreBase) throws AgenciaESAException;
}

View File

@ -5,9 +5,9 @@ import eu.agenciaesa.inm.excepciones.AgenciaESAException;
import eu.agenciaesa.inm.vo.CuerpoCeleste;
public interface ICuerpoCelesteDao {
void insertarListaCuerposCelestes(List<CuerpoCeleste> listaCuerpos) throws AgenciaESAException;
void insertarCuerpoCeleste(CuerpoCeleste cuerpo) throws AgenciaESAException;
List<CuerpoCeleste> obtenerListaCuerposCelestes() throws AgenciaESAException;
CuerpoCeleste obtenerCuerpoPorNombre(String nombre) throws AgenciaESAException;
CuerpoCeleste obtenerCuerpoCelestePorNombre(String nombre) throws AgenciaESAException;
}

View File

@ -6,7 +6,7 @@ import eu.agenciaesa.inm.excepciones.AgenciaESAException;
import eu.agenciaesa.inm.vo.Experimento;
public interface IExperimentoDao {
void insertarListaExperimentos(List<Experimento> listaExperimentos) throws AgenciaESAException;
void insertarExperimento(Experimento experimento) throws AgenciaESAException;
List<Experimento> obtenerListaExperimentos() throws AgenciaESAException;
}

View File

@ -1,11 +1,10 @@
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<Generador> listaGeneradores) throws AgenciaESAException;
void insertarGenerador(Generador generador) throws AgenciaESAException;
List<Generador> obtenerListaGeneradores() throws AgenciaESAException;
Generador obtenerGeneradorPorNombre(String nombreGenerador) throws AgenciaESAException;
}

View File

@ -1,11 +1,10 @@
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<Modulo> listaModulos) throws AgenciaESAException;
void insertarModulo(Modulo modulo) throws AgenciaESAException;
List<Modulo> obtenerListaModulos() throws AgenciaESAException;
Modulo obtenerModuloPorCodigo(String codigoModulo) throws AgenciaESAException;
}

View File

@ -1,9 +1,8 @@
package eu.agenciaesa.inm.dao.hibernate;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.hibernate.query.SelectionQuery;
import eu.agenciaesa.inm.dao.IBaseDao;
import eu.agenciaesa.inm.excepciones.AgenciaESAException;
@ -13,13 +12,13 @@ import eu.agenciaesa.inm.vo.Base;
public class BaseDaoHibernate implements IBaseDao {
@Override
public void insertarListaBases(List<Base> listaBases) throws AgenciaESAException {
public void insertarBase(Base base) 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)
@ -28,22 +27,21 @@ public class BaseDaoHibernate implements IBaseDao {
}
}
@Override
public List<Base> obtenerListaBases() throws AgenciaESAException {
try (Session session = GestorSesionHibernate.getSession()) {
Query<Base> 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 {
public Base obtenerBasePorNombre(String nombre) throws AgenciaESAException {
Base base=null;
String sentenciaHQL = "SELECT b FROM Base b WHERE b.nombre = :nombre";
try (Session session = GestorSesionHibernate.getSession()) {
return session.find(Base.class, codigo);
SelectionQuery<Base> sentenciaConsulta = session.createSelectionQuery(sentenciaHQL, Base.class);
sentenciaConsulta.setParameter("nombre", nombre);
base = sentenciaConsulta.getSingleResultOrNull();
} catch (Exception e) {
throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, BaseDaoHibernate.class);
}
return base;
}
}

View File

@ -1,9 +1,8 @@
package eu.agenciaesa.inm.dao.hibernate;
import java.util.List;
import org.hibernate.HibernateException;
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;
@ -13,13 +12,13 @@ import eu.agenciaesa.inm.vo.Modulo;
public class ModuloDaoHibernate implements IModuloDao {
@Override
public void insertarListaModulos(List<Modulo> listaModulos) throws AgenciaESAException {
public void insertarModulo(Modulo modulo) 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)
@ -29,12 +28,17 @@ public class ModuloDaoHibernate implements IModuloDao {
}
@Override
public List<Modulo> obtenerListaModulos() throws AgenciaESAException {
try (Session session = GestorSesionHibernate.getSession()) {
Query<Modulo> query = session.createQuery("FROM Modulo", Modulo.class);
return query.list();
} catch (Exception e) {
public Modulo obtenerModuloPorCodigo(String codigoModulo) throws AgenciaESAException {
Modulo modulo = null;
// try con recursos "cerrables": Session
try (Session sesion = GestorSesionHibernate.getSession();) {
modulo = sesion.find(Modulo.class, codigoModulo);
} catch (HibernateException e) {
throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, ModuloDaoHibernate.class);
}
return modulo;
}
}

View File

@ -11,25 +11,25 @@ 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;
import eu.agenciaesa.inm.vo.ETipoCuerpoCeleste;
public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDao {
@Override
public void insertarListaCuerposCelestes(List<CuerpoCeleste> listaCuerpos) throws AgenciaESAException {
String sql = "INSERT INTO T_CUERPO_CELESTE (nombre, gravedad_superficie_ms2, tipo) VALUES (?, ?, ?)";
public void insertarCuerpoCeleste(CuerpoCeleste cuerpo) throws AgenciaESAException {
String sentenciaSQL = """
INSERT INTO T_CUERPO_CELESTE (nombre, gravedad_superficie_ms2, tipo)
VALUES (?, ?, ?)
""";
try (Connection con = GestorConexionJDBC.getConexionSGDB();
PreparedStatement ps = con.prepareStatement(sql)) {
PreparedStatement ps = con.prepareStatement(sentenciaSQL)) {
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();
ps.executeUpdate();
} catch (SQLException e) {
throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, CuerpoCelesteDaoJDBC.class);
}
@ -44,14 +44,7 @@ public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDao {
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));
}
CuerpoCeleste cuerpo = obtenerCuerpoCelesteDeResultSet(rs);
lista.add(cuerpo);
}
} catch (SQLException e) {
@ -61,23 +54,15 @@ public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDao {
}
@Override
public CuerpoCeleste obtenerCuerpoPorNombre(String nombre) throws AgenciaESAException {
public CuerpoCeleste obtenerCuerpoCelestePorNombre(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)) {
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));
}
cuerpo = obtenerCuerpoCelesteDeResultSet(rs);
}
}
} catch (SQLException e) {
@ -85,4 +70,18 @@ public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDao {
}
return cuerpo;
}
private CuerpoCeleste obtenerCuerpoCelesteDeResultSet(ResultSet resultado) throws SQLException {
CuerpoCeleste cuerpo = new CuerpoCeleste();
cuerpo.setIdentificador(resultado.getLong("identificador"));
cuerpo.setNombre(resultado.getString("nombre"));
cuerpo.setGravedadSuperficioMs2(resultado.getDouble("gravedad_superficie_ms2"));
String tipoStr = resultado.getString("tipo");
if (tipoStr != null) {
cuerpo.setTipo(ETipoCuerpoCeleste.valueOf(tipoStr));
}
return cuerpo;
}
}

View File

@ -4,67 +4,77 @@ 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.ETipoGenerador;
import eu.agenciaesa.inm.vo.Generador;
import eu.agenciaesa.inm.vo.TipoGenerador;
public class GeneradorDaoJDBC implements IGeneradorDao {
@Override
public void insertarListaGeneradores(List<Generador> 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)) {
public void insertarGenerador(Generador generador) throws AgenciaESAException {
String sentenciaSQL = """
INSERT INTO T_GENERADOR (nombre, potencia_mw, tipo, cod_base)
VALUES (?, ?, ?, ?)
""";
try (Connection con = GestorConexionJDBC.getConexionSGDB();
PreparedStatement ps = con.prepareStatement(sentenciaSQL)) {
ps.setString(1, generador.getNombre());
ps.setDouble(2, generador.getPotenciaMW());
ps.setString(3, generador.getTipo() != null ? generador.getTipo().name() : null);
ps.setString(4, generador.getBase() != null ? generador.getBase().getCodigo() : null);
ps.executeUpdate();
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<Generador> obtenerListaGeneradores() throws AgenciaESAException {
List<Generador> lista = new ArrayList<>();
String sql = "SELECT * FROM T_GENERADOR";
public Generador obtenerGeneradorPorNombre(String nombreGenerador) throws AgenciaESAException {
Generador generador = null;
String sql = """
SELECT * FROM T_GENERADOR g join T_BASE b
on cod_base = codigo
WHERE g.nombre = ?
""";
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);
PreparedStatement ps = con.prepareStatement(sql);) {
ps.setString(1, nombreGenerador);
ResultSet rs = ps.executeQuery();
// Se asume que el nombre del generador es único, por lo que se detiene al encontrar el primero
if(rs.next()) {
generador = obtenerGeneradorDeResultSet(rs);
}
} catch (SQLException e) {
throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, GeneradorDaoJDBC.class);
}
return lista;
return generador;
}
private Generador obtenerGeneradorDeResultSet(ResultSet resultado) throws SQLException {
Generador generador = new Generador();
generador.setIdentificador(resultado.getLong("identificador"));
generador.setNombre(resultado.getString("g.nombre"));
generador.setPotenciaMW(resultado.getDouble("potencia_mw"));
String tipoStr = resultado.getString("tipo");
if (tipoStr != null) {
generador.setTipo(ETipoGenerador.valueOf(tipoStr));
}
String codBase = resultado.getString("b.codigo");
if (codBase != null) {
Base base = new Base();
base.setCodigo(codBase);
base.setNombre(resultado.getString("b.nombre"));
generador.setBase(base);
}
return generador;
}
}

View File

@ -13,25 +13,21 @@ import eu.agenciaesa.inm.vo.Experimento;
public class ExperimentoDaoJPA implements IExperimentoDao {
@Override
public void insertarListaExperimentos(List<Experimento> listaExperimentos) throws AgenciaESAException {
EntityManager em = GestorEntityManagerJPA.getEntityManager();
EntityTransaction tx = em.getTransaction();
public void insertarExperimento(Experimento experimento) throws AgenciaESAException {
EntityManager entityManager = GestorEntityManagerJPA.getEntityManager();
EntityTransaction transaccion = entityManager.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();
transaccion.begin();
entityManager.persist(experimento);
transaccion.commit();
} catch (Exception e) {
if (tx.isActive())
tx.rollback();
if (transaccion.isActive())
transaccion.rollback();
throw new AgenciaESAException(e, AgenciaESAException.ERROR_INSERCION, ExperimentoDaoJPA.class);
} finally {
em.close();
entityManager.close();
}
}

View File

@ -13,18 +13,19 @@ import eu.agenciaesa.inm.excepciones.AgenciaESAException;
import eu.agenciaesa.inm.gestores.GestorConexionMongoDB;
import eu.agenciaesa.inm.vo.Experimento;
import eu.agenciaesa.inm.vo.Modulo;
import eu.agenciaesa.inm.vo.TipoExperimento;
import eu.agenciaesa.inm.vo.ETipoExperimento;
/**
* ExperimientoDaoMongoDB: Clase que se encarga de ...
* ExperimientoDaoMongoDB: Clase que se encarga de implementar el acceso a datos de los experimentos utilizando MongoDB como base de datos
*
* @autor: Isidoro Nevares Martín (IES Virgen de la Paloma)
* @date: 24 feb 2026
*/
public class ExperimientoDaoMongoDB implements IExperimentoDao {
private final static String COLECCION = "C_EXPERIMENTO";
@Override
public void insertarListaExperimentos(List<Experimento> listaExperimentos) throws AgenciaESAException {
public void insertarExperimento(Experimento experimento) throws AgenciaESAException {
// TODO Auto-generated method stub
}
@ -37,33 +38,40 @@ public class ExperimientoDaoMongoDB implements IExperimentoDao{
try {
coleccionMongoDB = GestorConexionMongoDB.getMongoDatabase().getCollection(COLECCION);
FindIterable<Document> documentos = coleccionMongoDB.find();
for (Document documento : documentos) {
String nombreExperimento = documento.getString("nombre");
String sTipoExperimiento = documento.getString("tipo");
TipoExperimento tipoExperimento=TipoExperimento.valueOf(sTipoExperimiento);
ETipoExperimento tipoExperimento = ETipoExperimento.valueOf(sTipoExperimiento);
String resultadoExperimento = null;
Document documentoDatos = documento.get("datos", Document.class);
if(tipoExperimento == TipoExperimento.Geológico) {
switch (tipoExperimento) {
case Geológico:
String tipoRoca = documentoDatos.getString("tipo_roca");
Integer profundidad = documentoDatos.getInteger("profundidad_muestra_m");
resultadoExperimento = "Muestra de " + tipoRoca + " obtenida a " + profundidad + "m de profundidad.";
} else if(tipoExperimento == TipoExperimento.Biológico) {
resultadoExperimento = "Muestra de %s obtenida a %s m de profundidad.";
resultadoExperimento = String.format(resultadoExperimento, tipoRoca, profundidad);
break;
case Biológico:
String tipoMuestra = documentoDatos.getString("tipo_muestra");
Integer nivel = documentoDatos.getInteger("nivel_bioseguridad");
resultadoExperimento = "Análisis de " + tipoMuestra + " realizado bajo nivel " + nivel + " de bioseguridad.";
} else {
resultadoExperimento = "Análisis de %s realizado bajo nivel %d de bioseguridad.";
resultadoExperimento = String.format(resultadoExperimento, tipoMuestra, nivel);
break;
case Climatológico:
Integer duracion = documentoDatos.getInteger("duracion_dias");
String frecuencia = documentoDatos.getString("frecuencia");
String parametro = documentoDatos.getString("parametro_estudio");
resultadoExperimento = "Estudio de " + parametro + " durante " + duracion + " días con frecuencia " + frecuencia;
resultadoExperimento = "Estudio de %s durante %d días con frecuencia %s.";
resultadoExperimento = String.format(resultadoExperimento, parametro, duracion, frecuencia);
break;
}
// Aquí no llamo a otro DAO para obtener el módulo, sino que lo creo directamente con el código que tengo en el documento de MongoDB
String codigoModulo = documento.getString("modulo_id");
Modulo modulo = new Modulo();
modulo.setCodigo(codigoModulo);
@ -77,7 +85,7 @@ public class ExperimientoDaoMongoDB implements IExperimentoDao{
listaExperimentos.add(experimento);
}
} catch (Exception e) {
throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA , getClass());
throw new AgenciaESAException(e, AgenciaESAException.ERROR_CONSULTA, ExperimientoDaoMongoDB.class);
}
return listaExperimentos;

View File

@ -23,12 +23,12 @@ public class GestorConexionMongoDB {
// 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");
String uri = GestorFicheroConfiguracion.obtenerValor("mongodb.url");
// 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");
String bbddMongoDB= GestorFicheroConfiguracion.obtenerValor("mongodb.bbdd");
mongoDBDatabase = clienteMongo.getDatabase(bbddMongoDB);
}

View File

@ -16,7 +16,7 @@ public class GestorFicheroConfiguracion {
static {
try (InputStream is = GestorFicheroConfiguracion.class.getClassLoader()
.getResourceAsStream("conf.properties")) {
.getResourceAsStream("agenciaesa.conf")) {
if (is != null) {
PROPIEDADES.load(is);
} else {
@ -29,9 +29,7 @@ public class GestorFicheroConfiguracion {
/**
* 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);

View File

@ -1,392 +0,0 @@
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.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.databind.node.ArrayNode;
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<Base> obtenerBasesDeURL(String urlBases) {
List<Base> 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 <bases><base id="...">...</base>...</bases>
// 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 &lt;base&gt; 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
// <cuerpo>
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<Modulo> obtenerModulosDeBase(JsonNode nodoBase, Base base) {
List<Modulo> 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<Experimento> obtenerExperimentosDeURL(String urlExperimentos) {
List<Experimento> 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<JsonNode> 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:
* <ul>
* <li><b>Geológico</b>: "Muestra de {material} obtenida a {profundidad} m de
* profundidad."</li>
* <li><b>Biológico</b>: "Análisis de {organismo} realizado bajo nivel {nivel}
* de bioseguridad.</li>
* <li><b>Climatológico</b>: "Estudio de {variable} durante {dias} días con
* frecuencia {frecuencia}."</li>
* </ul>
*/
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<Generador> obtenerGeneradoresDeFicheroCSV(String rutaCSV) {
List<Generador> 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;
}
private ArrayNode convertirJsonNodeEnArrayNode(JsonNode node) {
ObjectMapper mapper = new ObjectMapper();
if (node.isArray()) {
return (ArrayNode) node;
} else {
ArrayNode arrayNode = mapper.createArrayNode();
if (!node.isMissingNode()) {
arrayNode.add(node);
}
return arrayNode;
}
}
}

View File

@ -0,0 +1,85 @@
package eu.agenciaesa.inm.procesamiento;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import eu.agenciaesa.inm.dao.IBaseDao;
import eu.agenciaesa.inm.dao.hibernate.BaseDaoHibernate;
import eu.agenciaesa.inm.excepciones.AgenciaESAException;
import eu.agenciaesa.inm.gestores.GestorFicheroConfiguracion;
import eu.agenciaesa.inm.vo.Base;
import eu.agenciaesa.inm.vo.ETipoGenerador;
import eu.agenciaesa.inm.vo.Generador;
/**
* ProcesadorFicheroCSV: clase que procesa los generadores provenientes de un
* fichero CSV
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
*/
public class ProcesadorGeneradoresFicheroCSV {
public List<Generador> obtenerGeneradoresDeFicheroCSV() throws AgenciaESAException {
String rutaCSV = GestorFicheroConfiguracion.obtenerValor("ruta.csv.generadores");
List<Generador> listaGeneradores = null;
try (BufferedReader reader = new BufferedReader(new FileReader(rutaCSV))) {
listaGeneradores = new ArrayList<>();
String linea;
// Saltar cabecera
reader.readLine();
while ((linea = reader.readLine()) != null) {
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;
}
private Generador obtenerGeneradorDeLineaCSV(String linea) throws AgenciaESAException {
Generador generador = null;
String[] partes = linea.split("\\|");
String nombreGenerador= partes[0].trim();
String tipoGenerador= partes[1].trim();
String potenciaMW= partes[2].trim();
String nombreBase= partes[4].trim();
if(nombreBase!=null && !nombreBase.isEmpty()) {
IBaseDao baseDao = new BaseDaoHibernate();
Base baseBBDD = baseDao.obtenerBasePorNombre(nombreBase);
// Solo se crea el generador si existe la base asociada en la BBDD, si no se ignora el registro del CSV
if (baseBBDD != null) {
generador = new Generador();
generador.setNombre(nombreGenerador);
generador.setPotenciaMW(Double.parseDouble(potenciaMW));
generador.setTipo(ETipoGenerador.valueOf(tipoGenerador));
generador.setBase(baseBBDD);
}
}
if (partes.length >= 4 && !partes[3].trim().isEmpty()) {
}
return generador;
}
}

View File

@ -0,0 +1,161 @@
package eu.agenciaesa.inm.procesamiento;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import eu.agenciaesa.inm.dao.ICuerpoCelesteDao;
import eu.agenciaesa.inm.dao.jdbc.CuerpoCelesteDaoJDBC;
import eu.agenciaesa.inm.excepciones.AgenciaESAException;
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.EFuncionPrincipalBase;
import eu.agenciaesa.inm.vo.Modulo;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.node.ArrayNode;
import tools.jackson.dataformat.xml.XmlMapper;
/**
* ProcesadorBaseYModulosURL: clase que procesa las base y módulos que vienen de
* una URL
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
*/
public class ProcesadorModulosURL {
// Se ofrece este método público se devuelve una lista de Base (que contendrá la lista de módulos) a partir de la URL de configuración.
// El método se puede llamar desde el main o desde un procesador de bases para obtener la lista completa de bases con sus módulos anidados.
public List<Base> obtenerListaBasesDeURL() {
String urlBases = GestorFicheroConfiguracion.obtenerValor("url.bases-modulos");
List<Base> 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<>();
JsonNode nodoBases = nodoRaiz.has("base") ? nodoRaiz.get("base") : nodoRaiz;
nodoBases = convertirJsonNodeEnArrayNode(nodoBases);
for (JsonNode nodoBase : nodoBases) {
Base base = obtenerBaseDeJsonNode(nodoBase);
if (base != null) {
listaBases.add(base);
List<Modulo> listaModulos = obtenerModulosDeBase(nodoBase, base);
base.setListaModulos(listaModulos);
}
}
}
} catch (Exception e) {
System.err.println("Error procesando XML de bases con JsonNode: " + e.getMessage());
e.printStackTrace();
}
return listaBases;
}
private Base obtenerBaseDeJsonNode(JsonNode nodoBase) throws AgenciaESAException {
if (nodoBase == null || nodoBase.isNull())
return null;
String codigo = nodoBase.get("id").asString();
String nombreBase = nodoBase.get("nombre").asString();
String fechaStr = nodoBase.get("fecha_establecimiento").asString();
Base base = new Base();
base.setCodigo(codigo);
base.setNombre(nombreBase);
if (!fechaStr.isEmpty()) {
try {
base.setFechaEstablecimiento(LocalDate.parse(fechaStr));
} catch (Exception e) {
System.err.println("Fecha de establecimiento no válida: " + fechaStr);
}
}
String funcion = nodoBase.get("funcion_ppal").asString();
try {
base.setFuncionPrincipal(EFuncionPrincipalBase.valueOf(funcion));
} catch (IllegalArgumentException e) {
System.err.println("Función principal desconocida: " + funcion);
}
JsonNode nodoCuerpo = nodoBase.get("cuerpo");
String nombreCuerpo = nodoCuerpo.get("nombre").asString();
// Se carga el cuerpo celeste asociado a la base. Si el cuerpo no existe en la BBDD, se inserta uno nuevo con el nombre obtenido del XML.
if (!nombreCuerpo.isEmpty()) {
ICuerpoCelesteDao cuerpoDao = new CuerpoCelesteDaoJDBC();
CuerpoCeleste cuerpo = null;
CuerpoCeleste cuerpoBBDD = cuerpoDao.obtenerCuerpoCelestePorNombre(nombreCuerpo);
if(cuerpoBBDD == null) {
cuerpo = new CuerpoCeleste();
cuerpo.setNombre(nombreCuerpo);
cuerpoDao.insertarCuerpoCeleste(cuerpo);
}
cuerpo= cuerpoDao.obtenerCuerpoCelestePorNombre(nombreCuerpo);
base.setCuerpo(cuerpo);
}
return base;
}
private List<Modulo> obtenerModulosDeBase(JsonNode nodoBase, Base base) {
List<Modulo> listaModulos = new ArrayList<>();
if (nodoBase == null)
return listaModulos;
JsonNode nodoListaModulos = nodoBase.get("modulos").get("modulo");
nodoListaModulos = convertirJsonNodeEnArrayNode(nodoListaModulos);
for (JsonNode nodoModulo : nodoListaModulos) {
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;
String codigo = nodoModulo.get("id").asString();
String nombreModulo = nodoModulo.get("nombre").asString();
Double consumoEnergia = nodoModulo.get("consumo_energia").asDouble(0.0);
Modulo modulo = new Modulo();
modulo.setCodigo(codigo);
modulo.setNombre(nombreModulo);
modulo.setConsumoEnergiaMW(consumoEnergia);
modulo.setBase(base);
return modulo;
}
private ArrayNode convertirJsonNodeEnArrayNode(JsonNode node) {
ObjectMapper mapper = new ObjectMapper();
if (node.isArray()) {
return (ArrayNode) node;
} else {
ArrayNode arrayNode = mapper.createArrayNode();
if (!node.isMissingNode()) {
arrayNode.add(node);
}
return arrayNode;
}
}
}

View File

@ -1,12 +1,32 @@
package eu.agenciaesa.inm.vo;
import java.time.LocalDate;
import java.util.List;
import jakarta.persistence.*;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* Entidad que representa la tabla T_BASE.
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "T_BASE")
public class Base {
@ -22,55 +42,13 @@ public class Base {
@Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado
@Column(name = "funcion_principal", nullable = false)
private FuncionPrincipalBase funcionPrincipal;
private EFuncionPrincipalBase funcionPrincipal;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_cuerpo", referencedColumnName = "identificador")
private CuerpoCeleste cuerpo;
public String getCodigo() {
return codigo;
}
@OneToMany(mappedBy = "base", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<Modulo> listaModulos;
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 + "]";
}
}

View File

@ -1,10 +1,19 @@
package eu.agenciaesa.inm.vo;
import jakarta.persistence.*;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
/**
* Entidad que representa la tabla T_CUERPO_CELESTE.
*/
@Data
@Entity
@Table(name = "T_CUERPO_CELESTE")
public class CuerpoCeleste {
@ -19,43 +28,6 @@ public class CuerpoCeleste {
private double gravedadSuperficioMs2;
@Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado
private TipoCuerpoCeleste tipo;
private ETipoCuerpoCeleste 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 + "]";
}
}

View File

@ -1,6 +1,6 @@
package eu.agenciaesa.inm.vo;
public enum FuncionPrincipalBase {
public enum EFuncionPrincipalBase {
Investigación, Logística, Control;
}

View File

@ -1,6 +1,6 @@
package eu.agenciaesa.inm.vo;
public enum TipoCuerpoCeleste {
public enum ETipoCuerpoCeleste {
Planeta, Satélite, Asteroide, Planetoide;
}

View File

@ -1,6 +1,6 @@
package eu.agenciaesa.inm.vo;
public enum TipoExperimento {
public enum ETipoExperimento {
Biológico, Climatológico, Geológico;
}

View File

@ -1,6 +1,6 @@
package eu.agenciaesa.inm.vo;
public enum TipoGenerador {
public enum ETipoGenerador {
Nuclear, Solar, Geotérmica;
}

View File

@ -1,6 +1,6 @@
package eu.agenciaesa.inm.vo;
public enum TipoNave {
public enum ETipoNave {
Transporte, Reconocimiento, Científica, Mantenimiento;
}

View File

@ -11,10 +11,12 @@ import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Data;
/**
* Entidad que representa la tabla T_EXPERIMENTO.
*/
@Data
@Entity
@Table(name = "T_EXPERIMENTO")
public class Experimento {
@ -29,56 +31,10 @@ public class Experimento {
private String resultado;
@Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado
private TipoExperimento tipo;
private ETipoExperimento 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 + "]";
}
}

View File

@ -11,10 +11,12 @@ import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.Data;
/**
* Entidad que representa la tabla T_GENERADOR.
*/
@Data
@Entity
@Table(name = "T_GENERADOR")
public class Generador {
@ -30,55 +32,10 @@ public class Generador {
private double potenciaMW;
@Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado
private TipoGenerador tipo;
private ETipoGenerador 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 + "]";
}
}

View File

@ -10,10 +10,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.MapsId;
import jakarta.persistence.Table;
import lombok.Data;
/**
* Entidad que representa la tabla T_MISION.
*/
@Data
@Entity
@Table(name = "T_MISION")
public class Mision {

View File

@ -6,7 +6,9 @@ import java.util.Objects;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.Data;
@Data
@Embeddable
public class MisionID implements Serializable {
@ -47,34 +49,4 @@ public class MisionID implements Serializable {
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 + "]";
}
}

View File

@ -7,10 +7,19 @@ import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* Entidad que representa la tabla T_MODULO.
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "T_MODULO")
public class Modulo {
@ -28,41 +37,4 @@ public class Modulo {
@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 + "]";
}
}

View File

@ -6,10 +6,13 @@ import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
/**
* Entidad que representa la tabla T_NAVE.
*/
@Data
@Entity
@Table(name = "T_NAVE")
public class Nave {
@ -27,13 +30,13 @@ public class Nave {
private int autonomiaDias;
@Enumerated(EnumType.STRING) // Se almacena el valor de un enumerado
private TipoNave tipo;
private ETipoNave tipo;
public TipoNave getTipo() {
public ETipoNave getTipo() {
return tipo;
}
public void setTipo(TipoNave tipo) {
public void setTipo(ETipoNave tipo) {
this.tipo = tipo;
}

View File

@ -5,19 +5,31 @@
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<!-- Unidad Persistencia Hibernate -->
<persistence-unit name="UP_AGENCIAESA_POSTGRESQL" transaction-type="RESOURCE_LOCAL">
<!-- Proveedor de persistencia JPA -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- Clases a "mapear" -->
<class>eu.agenciaesa.inm.vo.Nave</class>
<class>eu.agenciaesa.inm.vo.CuerpoCeleste</class>
<class>eu.agenciaesa.inm.vo.Base</class>
<class>eu.agenciaesa.inm.vo.Generador</class>
<class>eu.agenciaesa.inm.vo.Modulo</class>
<class>eu.agenciaesa.inm.vo.Experimento</class>
<class>eu.agenciaesa.inm.vo.MisionID</class>
<class>eu.agenciaesa.inm.vo.Mision</class>
<!-- Configuración para la conexión a la Base de Datos -->
<!-- Configuración de propiedades del SGDB (PostgreSQL) -->
<properties>
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://192.168.1.36:5432/agencia_esa_inm"/>
<property name="jakarta.persistence.jdbc.user" value="postgres" />
<property name="jakarta.persistence.jdbc.password" value="postgres_123" />
<property name="jakarta.persistence.jdbc.user" value="vdlp"/>
<property name="jakarta.persistence.jdbc.password" value="postgresql_123"/>
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="hibernate.show_sql" value="true" />
<!-- Configuración Hibernate -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="format_sql" value="true" />
</properties>
</persistence-unit>

View File

@ -0,0 +1,15 @@
# Información sobre la Base de datos MySQL
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://192.168.1.36:5432/agencia_esa_inm
jdbc.usuario=vdlp
jdbc.password=postgresql_123
# Información sobre la Base de datos MongoDB
mongodb.url=mongodb://admin:mongodb_123@192.168.1.36:27017
mongodb.bbdd=agencia_esa_inm
#ruta fichero xml para bases y módulos
url.bases-modulos=https://dam2.decieloytierra.es/agenciaesa/bases-modulos.xml
#ruta fichero csv con información de los generadores
ruta.csv.generadores=ficheros/info-generadores.csv

View File

@ -1,5 +0,0 @@
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

View File

@ -9,8 +9,8 @@
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="connection.username">postgres</property>
<property name="connection.password">postgres_123</property>
<property name="connection.username">vdlp</property>
<property name="connection.password">postgresql_123</property>
<!-- Configuración de Hibernate -->
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 'update' para mantener el esquema en sincronía con las entidades -->
@ -18,8 +18,15 @@
<property name="hibernate.format_sql">true</property> <!-- Da formato a las consultas SQL -->
<property name="hibernate.use_sql_comments">false</property> <!-- Añade comentarios en las consultas SQL -->
<!-- Clases a "mapear" -->
<mapping class="eu.agenciaesa.inm.vo.Nave"></mapping>
<mapping class="eu.agenciaesa.inm.vo.CuerpoCeleste"></mapping>
<mapping class="eu.agenciaesa.inm.vo.Base"></mapping>
<mapping class="eu.agenciaesa.inm.vo.Generador"></mapping>
<mapping class="eu.agenciaesa.inm.vo.Modulo"></mapping>
<mapping class="eu.agenciaesa.inm.vo.Experimento"></mapping>
<mapping class="eu.agenciaesa.inm.vo.MisionID"></mapping>
<mapping class="eu.agenciaesa.inm.vo.Mision"></mapping>
</session-factory>