From 8f0db0690f797a9f22a1c96ad740faaf7b4f64d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isidoro=20Nevares=20Mart=C3=ADn?= Date: Fri, 28 Nov 2025 11:19:47 +0100 Subject: [PATCH] commit inicial --- .classpath | 41 ++++ .gitignore | 3 + .project | 23 +++ .settings/org.eclipse.jdt.core.prefs | 13 ++ .settings/org.eclipse.m2e.core.prefs | 4 + configuracion/aplicacion.properties | 13 ++ ficheros-datos/operaciones_esa.xml | 157 +++++++++++++++ ficheros-datos/tripulantes_sinmision.csv | 4 + pom.xml | 30 +++ src/.project | 11 ++ .../eu/esa/gemis/AplicacionAgenciaESA.java | 128 +++++++++++++ src/main/java/eu/esa/gemis/dao/IBaseDAO.java | 9 + .../eu/esa/gemis/dao/ICuerpoCelesteDAO.java | 10 + .../esa/gemis/dao/IGeneradorPrincipalDAO.java | 10 + .../java/eu/esa/gemis/dao/IMisionDAO.java | 19 ++ src/main/java/eu/esa/gemis/dao/INaveDAO.java | 10 + .../java/eu/esa/gemis/dao/ITripulanteDAO.java | 23 +++ .../esa/gemis/dao/ITripulanteMisionDAO.java | 10 + .../eu/esa/gemis/dao/impl/BaseDaoJDBC.java | 16 ++ .../gemis/dao/impl/CuerpoCelesteDaoJDBC.java | 16 ++ .../dao/impl/GeneradorPrincipalDaoJDBC.java | 16 ++ .../eu/esa/gemis/dao/impl/MisionDaoJDBC.java | 127 +++++++++++++ .../eu/esa/gemis/dao/impl/NaveDaoJDBC.java | 16 ++ .../esa/gemis/dao/impl/TripulanteDaoJDBC.java | 178 ++++++++++++++++++ .../dao/impl/TripulanteMisionDaoJDBC.java | 16 ++ .../gemis/excepcion/AgenciaEsaException.java | 46 +++++ .../esa/gemis/gestor/GestorConexionJDBC.java | 32 ++++ .../gestor/GestorFicheroConfiguracion.java | 40 ++++ .../procesos/ProcesadorTripulantesCSV.java | 54 ++++++ .../gemis/procesos/ProcesadorXMLMision.java | 124 ++++++++++++ .../util/ConversorTiposDatosYFormatos.java | 26 +++ src/main/java/eu/esa/gemis/vo/Base.java | 74 ++++++++ .../java/eu/esa/gemis/vo/CuerpoCeleste.java | 53 ++++++ .../eu/esa/gemis/vo/GeneradorPrincipal.java | 62 ++++++ src/main/java/eu/esa/gemis/vo/Mision.java | 111 +++++++++++ src/main/java/eu/esa/gemis/vo/Nave.java | 62 ++++++ src/main/java/eu/esa/gemis/vo/Tripulante.java | 83 ++++++++ .../eu/esa/gemis/vo/TripulanteMision.java | 46 +++++ .../main/java/eu/esa/gemis/dao/IBaseDAO.java | 23 +++ .../eu/esa/gemis/dao/ICuerpoCelesteDAO.java | 23 +++ .../esa/gemis/dao/IGeneradorPrincipalDAO.java | 23 +++ .../main/java/eu/esa/gemis/dao/INaveDAO.java | 23 +++ .../java/eu/esa/gemis/dao/ITripulanteDAO.java | 23 +++ .../gemis/exception/AgenciaEsaException.java | 32 ++++ .../eu/esa/gemis/util/GestorConexionJDBC.java | 31 +++ .../util/GestorFicheroConfiguracion.java | 39 ++++ src/main/main/java/eu/esa/gemis/vo/Base.java | 91 +++++++++ .../java/eu/esa/gemis/vo/CuerpoCeleste.java | 66 +++++++ .../eu/esa/gemis/vo/GeneradorPrincipal.java | 77 ++++++++ .../main/java/eu/esa/gemis/vo/Mision.java | 125 ++++++++++++ .../main/java/eu/esa/gemis/vo/Modulo.java | 91 +++++++++ src/main/main/java/eu/esa/gemis/vo/Nave.java | 77 ++++++++ .../main/java/eu/esa/gemis/vo/Tripulante.java | 102 ++++++++++ .../eu/esa/gemis/vo/TripulanteMision.java | 89 +++++++++ .../main/resources/application.properties | 5 + 55 files changed, 2656 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 configuracion/aplicacion.properties create mode 100644 ficheros-datos/operaciones_esa.xml create mode 100644 ficheros-datos/tripulantes_sinmision.csv create mode 100644 pom.xml create mode 100644 src/.project create mode 100644 src/main/java/eu/esa/gemis/AplicacionAgenciaESA.java create mode 100644 src/main/java/eu/esa/gemis/dao/IBaseDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/IMisionDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/INaveDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/ITripulanteDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/ITripulanteMisionDAO.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/BaseDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/CuerpoCelesteDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/GeneradorPrincipalDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/MisionDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/NaveDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/TripulanteDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/dao/impl/TripulanteMisionDaoJDBC.java create mode 100644 src/main/java/eu/esa/gemis/excepcion/AgenciaEsaException.java create mode 100644 src/main/java/eu/esa/gemis/gestor/GestorConexionJDBC.java create mode 100644 src/main/java/eu/esa/gemis/gestor/GestorFicheroConfiguracion.java create mode 100644 src/main/java/eu/esa/gemis/procesos/ProcesadorTripulantesCSV.java create mode 100644 src/main/java/eu/esa/gemis/procesos/ProcesadorXMLMision.java create mode 100644 src/main/java/eu/esa/gemis/util/ConversorTiposDatosYFormatos.java create mode 100644 src/main/java/eu/esa/gemis/vo/Base.java create mode 100644 src/main/java/eu/esa/gemis/vo/CuerpoCeleste.java create mode 100644 src/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java create mode 100644 src/main/java/eu/esa/gemis/vo/Mision.java create mode 100644 src/main/java/eu/esa/gemis/vo/Nave.java create mode 100644 src/main/java/eu/esa/gemis/vo/Tripulante.java create mode 100644 src/main/java/eu/esa/gemis/vo/TripulanteMision.java create mode 100644 src/main/main/java/eu/esa/gemis/dao/IBaseDAO.java create mode 100644 src/main/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java create mode 100644 src/main/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java create mode 100644 src/main/main/java/eu/esa/gemis/dao/INaveDAO.java create mode 100644 src/main/main/java/eu/esa/gemis/dao/ITripulanteDAO.java create mode 100644 src/main/main/java/eu/esa/gemis/exception/AgenciaEsaException.java create mode 100644 src/main/main/java/eu/esa/gemis/util/GestorConexionJDBC.java create mode 100644 src/main/main/java/eu/esa/gemis/util/GestorFicheroConfiguracion.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/Base.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/CuerpoCeleste.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/Mision.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/Modulo.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/Nave.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/Tripulante.java create mode 100644 src/main/main/java/eu/esa/gemis/vo/TripulanteMision.java create mode 100644 src/main/main/resources/application.properties diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..d863192 --- /dev/null +++ b/.classpath @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..ab17787 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + AgenciaESA + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..bfac099 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +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=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=24 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/configuracion/aplicacion.properties b/configuracion/aplicacion.properties new file mode 100644 index 0000000..514bc94 --- /dev/null +++ b/configuracion/aplicacion.properties @@ -0,0 +1,13 @@ +# Configuraci髇 de la aplicaci髇 AgenciaESA +# JDBC MySQL +jdbc.url=jdbc:mysql://192.168.1.36:3306/agencia_esa_xxx +jdbc.usuario=root +jdbc.password=mysql_123 + +# Fichero CSV +ruta.fichero.csv=ficheros-datos/tripulantes_sinmision.csv +csv.cabecera=num_tripulante|nombre|apellidos|id_esa|especialidad|fecha_ingreso +csv.separador=| + +# Fichero XML Lectura +ruta.fichero.xml=ficheros-datos/operaciones_esa.xml \ No newline at end of file diff --git a/ficheros-datos/operaciones_esa.xml b/ficheros-datos/operaciones_esa.xml new file mode 100644 index 0000000..65cfaa1 --- /dev/null +++ b/ficheros-datos/operaciones_esa.xml @@ -0,0 +1,157 @@ + + + + + Reabastecimiento Ares I + ESA-TRANS-02 + Marte + 2034-04-02 + 2034-04-25 + En curso + Entrega ampliada de repuestos en Base Ares + 18950000 + + + + Piloto + 2 + + + Ingeniero + 3 + + + Cient铆fico + 2 + + + + + + Atm贸sfera Olympus I + ESA-SCIEN-03 + Marte + 2034-08-10 + 2034-12-10 + Planificada + + Estudio atmosf茅rico marciano + 14000000 + + + + Piloto + 3 + + + Ingeniero + 2 + + + Cient铆fico + 3 + + + + + + Mantenimiento Avanzado Selene III + ESA-MANT-01 + Luna + 2036-02-01 + 2037-10-10 + Planificada + Mantenimiento avanzado de sistemas t茅rmicos + + 6900000 + Alta + Bajo + Prueba de nuevos trajes de aislamiento + + + + Piloto + 2 + 105 + + + + Ingeniero + 3 + 7 + Aumento de experiencia tras misi贸n en Armstrong + + + + Comunicaciones + 2 + 6 + + + + Cient铆fico + 3 + + + + + + Exploraci贸n Criog茅nica Europa II + ESA-SCIEN-03 + Europa + 2040-03-01 + 2040-05-20 + Planificada + + An谩lisis espectral del hielo profundo + 21200000 + + Se requieren sondas perforadoras reforzadas + + + + Piloto + 3 + + + Ingeniero + 2 + + Elena + Markovic + Serbia + 4 + Rob贸tica Criog茅nica + + + + Cient铆fico + 3 + + Rafael + Bianchi + Italia + 5 + Espectrometr铆a + + + + Comunicaciones + 1 + + Freya + Hansen + Dinamarca + 3 + Protocolos de enlace profundo + + + + + + + + diff --git a/ficheros-datos/tripulantes_sinmision.csv b/ficheros-datos/tripulantes_sinmision.csv new file mode 100644 index 0000000..a164300 --- /dev/null +++ b/ficheros-datos/tripulantes_sinmision.csv @@ -0,0 +1,4 @@ +num_tripulante|nombre|apellidos|id_esa|especialidad|fecha_ingreso +18|Nicola|Winter|2018|Ingenier铆a|2022-11-23 +19|John|McFall|2019|Comunicaciones|2022-11-23 +20|Paolo|Nespoli|2020|Ingenier铆a|1998-05-01 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bfe5a20 --- /dev/null +++ b/pom.xml @@ -0,0 +1,30 @@ + + 4.0.0 + eu.esa.gemis + AgenciaESA + 0.0.1-SNAPSHOT + AgenciaESA + Aplicaci贸n Java con acceso a datos (AADD) para examen 2.潞 DAM + + + 24 + 24 + UTF-8 + + + + + + com.mysql + mysql-connector-j + 9.5.0 + + + + + tools.jackson.dataformat + jackson-dataformat-xml + 3.0.1 + + + \ No newline at end of file diff --git a/src/.project b/src/.project new file mode 100644 index 0000000..f7d6de6 --- /dev/null +++ b/src/.project @@ -0,0 +1,11 @@ + + + src + + + + + + + + diff --git a/src/main/java/eu/esa/gemis/AplicacionAgenciaESA.java b/src/main/java/eu/esa/gemis/AplicacionAgenciaESA.java new file mode 100644 index 0000000..f66257e --- /dev/null +++ b/src/main/java/eu/esa/gemis/AplicacionAgenciaESA.java @@ -0,0 +1,128 @@ +package eu.esa.gemis; + +import java.util.List; +import java.util.Scanner; + +import eu.esa.gemis.dao.IMisionDAO; +import eu.esa.gemis.dao.impl.MisionDaoJDBC; +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.procesos.ProcesadorTripulantesCSV; +import eu.esa.gemis.procesos.ProcesadorXMLMision; +import eu.esa.gemis.util.ConversorTiposDatosYFormatos; +import eu.esa.gemis.vo.Mision; + +/** + * + * AplicacionAgenciaESA: Clase que realiza el tratamiento principal de la + * aplicaci贸n. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + * + */ + +public class AplicacionAgenciaESA { + + public static void main(String[] args) { + AplicacionAgenciaESA app = new AplicacionAgenciaESA(); + + try { + // Tratamiento de l贸gica de negocio + app.realizarTratamientoAgenciaESA(); + + } 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.out.println(mensajeError); + e.printStackTrace(); + } + } + + private void realizarTratamientoAgenciaESA() throws AgenciaEsaException { + Scanner entrada = new Scanner(System.in); + + System.out.println("Men煤:"); + System.out.println(" 1: Almacenar en CSV los tripulantes sin misiones asignadas."); + System.out.println(" 2: Procesar fichero operaciones_esa.xml"); + System.out.println(" 3: Imprimir en consola el listado de misiones inciadas en un a帽o."); + System.out.println("----------------------------------------------------------"); + System.out.println("Introduce la operaci贸n a realizar:"); + // Operaci贸n recogida + String operacion = entrada.nextLine().trim(); + + while (!("123".contains(operacion))) { + System.out.println("Has seleccionado un operaci贸n err贸nea (ha de ser un n煤mero entre 1 y 3)"); + System.out.print("Introduce la operaci贸n a realizar:"); + + // Operaci贸n recogida + operacion = entrada.nextLine(); + } + System.out.println("Operaci贸n a realizar: " + operacion); + // Cerrar la entrada del Scanner + entrada.close(); + + ejecutarFuncionalidades(operacion); + } + + public void ejecutarFuncionalidades(String operacion) throws AgenciaEsaException { + switch (operacion) { + case "1": { // Almacenar en CSV los tripulantes sin misiones asignadas + // Almacenar tripulantes en fichero CSV + ProcesadorTripulantesCSV procesadorTripulantesCSV = new ProcesadorTripulantesCSV(); + procesadorTripulantesCSV.almacenarTripulantesSinMisionEnFicheroCSV(); + System.out.println("Tripulantes sin misi贸n almacenados en fichero tripulantes_sin_mision.csv"); + break; + } + case "2": { // Procesar Fichero operaciones_esa.xml + System.out.println("Ejecutar procesamiento fichero operaciones_esa.xml"); + + ProcesadorXMLMision procesadorXMLMision = new ProcesadorXMLMision(); + procesadorXMLMision.procesarFicheroXMLMisiones(); + + break; + } + case "3": { // Imprimir en consola el listado de misiones inciadas en un a帽o. + System.out.println("Obtener e imprimir en consola el listado de misiones iniciadas en un a帽o."); + IMisionDAO iMisionDAO = new MisionDaoJDBC(); + List listaMisiones = iMisionDAO.obtenerMisionesIniciadasEnAnyo(2034); + + for (Mision mision : listaMisiones) { +// System.out.println(mision); + // Formatear fecha a dd/MM/yyyy + String fechaFormateada = ConversorTiposDatosYFormatos.convertirAFechaConFormato(mision.getFechaInicio(), + "dd/MM/yyyy"); + + String textoImprimir = "La misi贸n %s comenz贸 el %s con destino a %s (%s) utilizando la nave %s con capacidad para %d tripulantes."; + textoImprimir = String.format(textoImprimir, mision.getNombre(), fechaFormateada, + mision.getCuerpoCeleste().getNombre(), mision.getCuerpoCeleste().getTipo(), + mision.getNave().getCodigo(), mision.getNave().getCapacidadTripulacion()); + System.out.println(textoImprimir); + } + break; + } + default: { + break; + } + } + } +} diff --git a/src/main/java/eu/esa/gemis/dao/IBaseDAO.java b/src/main/java/eu/esa/gemis/dao/IBaseDAO.java new file mode 100644 index 0000000..5f8db1b --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/IBaseDAO.java @@ -0,0 +1,9 @@ +/** + * IBaseDAO: Interfaz DAO para la entidad Base. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +public interface IBaseDAO { +} diff --git a/src/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java b/src/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java new file mode 100644 index 0000000..e33736b --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java @@ -0,0 +1,10 @@ +/** + * ICuerpoCelesteDAO: Interfaz DAO para la entidad CuerpoCeleste. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +public interface ICuerpoCelesteDAO { +} diff --git a/src/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java b/src/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java new file mode 100644 index 0000000..ddd482e --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java @@ -0,0 +1,10 @@ +/** + * IGeneradorPrincipalDAO: Interfaz DAO para la entidad GeneradorPrincipal. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +public interface IGeneradorPrincipalDAO { +} diff --git a/src/main/java/eu/esa/gemis/dao/IMisionDAO.java b/src/main/java/eu/esa/gemis/dao/IMisionDAO.java new file mode 100644 index 0000000..e4bdb94 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/IMisionDAO.java @@ -0,0 +1,19 @@ +/** + * IMisionDAO: Interfaz DAO para la entidad Mision. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import java.util.List; + +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.vo.Mision; + +public interface IMisionDAO { + + List obtenerMisionesIniciadasEnAnyo(int anyo) throws AgenciaEsaException; + + void actualizarMisionPorNaveCuerpoFecha(Mision mision) throws AgenciaEsaException; +} diff --git a/src/main/java/eu/esa/gemis/dao/INaveDAO.java b/src/main/java/eu/esa/gemis/dao/INaveDAO.java new file mode 100644 index 0000000..ba92799 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/INaveDAO.java @@ -0,0 +1,10 @@ +/** + * INaveDAO: Interfaz DAO para la entidad Nave. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +public interface INaveDAO { +} diff --git a/src/main/java/eu/esa/gemis/dao/ITripulanteDAO.java b/src/main/java/eu/esa/gemis/dao/ITripulanteDAO.java new file mode 100644 index 0000000..ba3c723 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/ITripulanteDAO.java @@ -0,0 +1,23 @@ +/** + * ITripulanteDAO: Interfaz DAO para la entidad Tripulante. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import java.util.List; + +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.vo.Tripulante; + +public interface ITripulanteDAO { + + List obtenerTripulantesSinMision() throws AgenciaEsaException; + + Tripulante obtenerTripulantePorIdESA(int identificadorESA) throws AgenciaEsaException; + + void actualizarTripulantePorIdESA(Tripulante tripulante) throws AgenciaEsaException; + + void insertarTripulante(Tripulante tripulante) throws AgenciaEsaException; +} diff --git a/src/main/java/eu/esa/gemis/dao/ITripulanteMisionDAO.java b/src/main/java/eu/esa/gemis/dao/ITripulanteMisionDAO.java new file mode 100644 index 0000000..d391bf7 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/ITripulanteMisionDAO.java @@ -0,0 +1,10 @@ +/** + * ITripulanteMisionDAO: Interfaz DAO para la entidad TripulanteMision. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +public interface ITripulanteMisionDAO { +} diff --git a/src/main/java/eu/esa/gemis/dao/impl/BaseDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/BaseDaoJDBC.java new file mode 100644 index 0000000..f6d3370 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/BaseDaoJDBC.java @@ -0,0 +1,16 @@ +package eu.esa.gemis.dao.impl; + +import eu.esa.gemis.dao.IBaseDAO; + +/** + * + * BaseDaoJDBC: Clase que realiza la implementaci贸n del interfaz IBaseDAO. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class BaseDaoJDBC implements IBaseDAO { + +} + diff --git a/src/main/java/eu/esa/gemis/dao/impl/CuerpoCelesteDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/CuerpoCelesteDaoJDBC.java new file mode 100644 index 0000000..dca3256 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/CuerpoCelesteDaoJDBC.java @@ -0,0 +1,16 @@ +package eu.esa.gemis.dao.impl; + +import eu.esa.gemis.dao.ICuerpoCelesteDAO; + +/** + * + * CuerpoCelesteDaoJDBC: Clase que realiza la implementaci贸n del interfaz ICuerpoCelesteDAO. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class CuerpoCelesteDaoJDBC implements ICuerpoCelesteDAO { + +} + diff --git a/src/main/java/eu/esa/gemis/dao/impl/GeneradorPrincipalDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/GeneradorPrincipalDaoJDBC.java new file mode 100644 index 0000000..cc94c2b --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/GeneradorPrincipalDaoJDBC.java @@ -0,0 +1,16 @@ +package eu.esa.gemis.dao.impl; + +import eu.esa.gemis.dao.IGeneradorPrincipalDAO; + +/** + * + * GeneradorPrincipalDaoJDBC: Clase que realiza la implementaci贸n del interfaz IGeneradorPrincipalDAO. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class GeneradorPrincipalDaoJDBC implements IGeneradorPrincipalDAO{ + +} + diff --git a/src/main/java/eu/esa/gemis/dao/impl/MisionDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/MisionDaoJDBC.java new file mode 100644 index 0000000..cbfbeab --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/MisionDaoJDBC.java @@ -0,0 +1,127 @@ +package eu.esa.gemis.dao.impl; + +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import eu.esa.gemis.dao.IMisionDAO; +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.gestor.GestorConexionJDBC; +import eu.esa.gemis.vo.CuerpoCeleste; +import eu.esa.gemis.vo.Mision; +import eu.esa.gemis.vo.Nave; + +/** + * + * MisionDaoJDBC: Clase que realiza la implementaci贸n del interfaz IMisionDAO. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class MisionDaoJDBC implements IMisionDAO { + + @Override + public List obtenerMisionesIniciadasEnAnyo(int anyo) throws AgenciaEsaException { + List listaMisiones = null; + + String sentenciaSQL = """ + select tm.nombre as nombre_mision, tm.fecha_inicio, + tn.codigo as codigo_nave, tn.capacidad_tripulacion, + tcc.nombre as nombre_cuerpo_celeste, tcc.tipo + from T_MISION tm join T_NAVE tn + on tm.cod_nave = tn.codigo + join T_CUERPO_CELESTE tcc + on tm.id_cuerpo_celeste = tcc.identificador + where year(tm.fecha_inicio) = ? + """; + // try con recursos "cerrables": Connection, PreparedStatement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + // Establecer los par谩metros de la sentencia + pstm.setInt(1, anyo); +// System.out.println(pstm); + + ResultSet resultadoSentencia = pstm.executeQuery(); + if (resultadoSentencia != null) { + listaMisiones = new ArrayList(); + } + while (resultadoSentencia.next()) { + Mision mision = new Mision(); + String nombre= resultadoSentencia.getString("nombre_mision"); + LocalDate fechaInicio= resultadoSentencia.getDate("tm.fecha_inicio").toLocalDate(); + + Nave nave = new Nave(); + nave.setCodigo(resultadoSentencia.getString("codigo_nave")); + nave.setCapacidadTripulacion(resultadoSentencia.getInt("capacidad_tripulacion")); + + CuerpoCeleste cuerpoCeleste = new CuerpoCeleste(); + cuerpoCeleste.setNombre(resultadoSentencia.getString("nombre_cuerpo_celeste")); + cuerpoCeleste.setTipo(resultadoSentencia.getString("tipo")); + + mision.setNombre(nombre); + mision.setFechaInicio(fechaInicio); + mision.setNave(nave); + mision.setCuerpoCeleste(cuerpoCeleste); + + + listaMisiones.add(mision); + } + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_CONSULTA); + } + + return listaMisiones; + } + + @Override + public void actualizarMisionPorNaveCuerpoFecha(Mision mision) throws AgenciaEsaException { + String sentenciaSQL = """ + UPDATE T_MISION + set nombre = ?, + fecha_fin_estimado=?, + fecha_fin=?, + estado=?, + objetivo_principal=?, + presupuesto_asignado=? + where cod_nave = ? + and id_cuerpo_celeste = (select tcc.identificador + from T_CUERPO_CELESTE tcc + where tcc.nombre = ?) + and fecha_inicio = ? + """; + + // try con recursos "cerrables": Connection, PreparedStatement + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + // Establecer los par谩metros de la sentencia + pstm.setString(1, mision.getNombre()); + pstm.setDate(2, Date.valueOf(mision.getFechaFinEstimado())); + Date fechaFin = mision.getFechaFin() != null ? Date.valueOf(mision.getFechaFin()) : null; + pstm.setDate(3, fechaFin); + pstm.setString(4, mision.getEstado()); + pstm.setString(5, mision.getObjetivoPrincipal()); + pstm.setInt(6, mision.getPresupuestoAsignado()); + pstm.setString(7, mision.getNave().getCodigo()); + pstm.setString(8, mision.getCuerpoCeleste().getNombre()); + pstm.setDate(9, Date.valueOf(mision.getFechaInicio())); + +// System.out.println(pstm); + + pstm.executeUpdate(); + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_CONSULTA); + } + } + +} diff --git a/src/main/java/eu/esa/gemis/dao/impl/NaveDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/NaveDaoJDBC.java new file mode 100644 index 0000000..8a254b9 --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/NaveDaoJDBC.java @@ -0,0 +1,16 @@ +package eu.esa.gemis.dao.impl; + +import eu.esa.gemis.dao.INaveDAO; + +/** + * + * NaveDaoJDBC: Clase que realiza la implementaci贸n del interfaz INaveDAO. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class NaveDaoJDBC implements INaveDAO{ + +} + diff --git a/src/main/java/eu/esa/gemis/dao/impl/TripulanteDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/TripulanteDaoJDBC.java new file mode 100644 index 0000000..40dd49a --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/TripulanteDaoJDBC.java @@ -0,0 +1,178 @@ +package eu.esa.gemis.dao.impl; + +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import eu.esa.gemis.dao.ITripulanteDAO; +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.gestor.GestorConexionJDBC; +import eu.esa.gemis.vo.Tripulante; + +/** + * + * TripulanteDaoJDBC: Clase que realiza la implementaci贸n del interfaz + * ITripulanteDAO. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class TripulanteDaoJDBC implements ITripulanteDAO { + + @Override + public List obtenerTripulantesSinMision() throws AgenciaEsaException { + List listaTripulantes = null; + + String sentenciaSQL = """ + select * + from T_TRIPULANTE tt + where tt.numero_tripulante not in (select ttm.num_tripulante + from T_TRIPULANTE_MISION ttm ) + """; + // try con recursos "cerrables": Connection, Statement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + System.out.println(pstm); + + ResultSet resultadoSentencia = pstm.executeQuery(); + if (resultadoSentencia != null) { + listaTripulantes = new ArrayList(); + } + while (resultadoSentencia.next()) { + int numeroTripulante = resultadoSentencia.getInt("tt.numero_tripulante"); + String nombre = resultadoSentencia.getString("tt.nombre"); + String apellidos = resultadoSentencia.getString("tt.apellidos"); + int identificadorEsa = resultadoSentencia.getInt("tt.identificador_esa"); + int nivelExperiencia = resultadoSentencia.getInt("tt.nivel_experiencia"); + String especialidad = resultadoSentencia.getString("tt.especialidad"); + LocalDate fechaIngresoEsa = resultadoSentencia.getDate("tt.fecha_ingreso_esa").toLocalDate(); + + Tripulante tripulante = new Tripulante(); + tripulante.setNumeroTripulante(numeroTripulante); + tripulante.setNombre(nombre); + tripulante.setApellidos(apellidos); + tripulante.setIdentificadorEsa(identificadorEsa); + tripulante.setNivelExperiencia(nivelExperiencia); + tripulante.setEspecialidad(especialidad); + tripulante.setFechaIngresoEsa(fechaIngresoEsa); + + listaTripulantes.add(tripulante); + } + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_CONSULTA); + } + + return listaTripulantes; + } + + @Override + public Tripulante obtenerTripulantePorIdESA(int identificadorESA) throws AgenciaEsaException { + Tripulante tripulante = null; + String sentenciaSQL = """ + SELECT * + from T_TRIPULANTE tt + where tt.identificador_esa = ? + """; + // try con recursos "cerrables": Connection, PreparedStatement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + // Establecer los par谩metros de la sentencia + pstm.setInt(1, identificadorESA); +// System.out.println(pstm); + + ResultSet resultadoSentencia = pstm.executeQuery(); + if (resultadoSentencia.next()) { + int numeroTripulante = resultadoSentencia.getInt("tt.numero_tripulante"); + String nombre = resultadoSentencia.getString("tt.nombre"); + String apellidos = resultadoSentencia.getString("tt.apellidos"); + int identificadorEsa = resultadoSentencia.getInt("tt.identificador_esa"); + int nivelExperiencia = resultadoSentencia.getInt("tt.nivel_experiencia"); + String especialidad = resultadoSentencia.getString("tt.especialidad"); + LocalDate fechaIngresoEsa = resultadoSentencia.getDate("tt.fecha_ingreso_esa").toLocalDate(); + + tripulante = new Tripulante(); + tripulante.setNumeroTripulante(numeroTripulante); + tripulante.setNombre(nombre); + tripulante.setApellidos(apellidos); + tripulante.setIdentificadorEsa(identificadorEsa); + tripulante.setNivelExperiencia(nivelExperiencia); + tripulante.setEspecialidad(especialidad); + tripulante.setFechaIngresoEsa(fechaIngresoEsa); + } + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_CONSULTA); + } + return tripulante; + } + + @Override + public void actualizarTripulantePorIdESA(Tripulante tripulante) throws AgenciaEsaException { + String sentenciaSQL = """ + UPDATE T_TRIPULANTE + SET nombre = ?, + apellidos = ?, + nivel_experiencia = ?, + especialidad = ?, + fecha_ingreso_esa = ? + WHERE identificador_esa = ? + """; + + // try con recursos "cerrables": Connection, PreparedStatement + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + // Establecer los par谩metros de la sentencia + pstm.setString(1, tripulante.getNombre()); + pstm.setString(2, tripulante.getApellidos()); + pstm.setInt(3, tripulante.getNivelExperiencia()); + pstm.setString(4, tripulante.getEspecialidad()); + pstm.setDate(5, Date.valueOf(tripulante.getFechaIngresoEsa())); + pstm.setInt(6, tripulante.getIdentificadorEsa()); +// System.out.println(pstm); + + pstm.executeUpdate(); + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_ACTUALIZACION); + } + } + + @Override + public void insertarTripulante(Tripulante tripulante) throws AgenciaEsaException { + String sentenciaSQL = """ + INSERT INTO T_TRIPULANTE (nombre, apellidos, identificador_esa, nivel_experiencia, especialidad, fecha_ingreso_esa) VALUES + (?, ?, ?, ?, ?, ?) + """; + + // try con recursos "cerrables": Connection, PreparedStatement + try (Connection conexion = GestorConexionJDBC.obtenerConexion(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL);) { + + // Establecer los par谩metros de la sentencia + pstm.setString(1, tripulante.getNombre()); + pstm.setString(2, tripulante.getApellidos()); + pstm.setInt(3, tripulante.getIdentificadorEsa()); + pstm.setInt(4, tripulante.getNivelExperiencia()); + pstm.setString(5, tripulante.getEspecialidad()); + pstm.setDate(6, Date.valueOf(tripulante.getFechaIngresoEsa())); +// System.out.println(pstm); + + pstm.executeUpdate(); + + } catch (SQLException e) { + throw new AgenciaEsaException(e, getClass(), AgenciaEsaException.ERROR_INSERCION); + } + } + +} diff --git a/src/main/java/eu/esa/gemis/dao/impl/TripulanteMisionDaoJDBC.java b/src/main/java/eu/esa/gemis/dao/impl/TripulanteMisionDaoJDBC.java new file mode 100644 index 0000000..f1e0b9a --- /dev/null +++ b/src/main/java/eu/esa/gemis/dao/impl/TripulanteMisionDaoJDBC.java @@ -0,0 +1,16 @@ +package eu.esa.gemis.dao.impl; + +import eu.esa.gemis.dao.ITripulanteMisionDAO; + +/** + * + * TripulanteMisionDaoJDBC: Clase que realiza la implementaci贸n del interfaz ITripulanteMisionDAO. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + */ + +public class TripulanteMisionDaoJDBC implements ITripulanteMisionDAO{ + +} + diff --git a/src/main/java/eu/esa/gemis/excepcion/AgenciaEsaException.java b/src/main/java/eu/esa/gemis/excepcion/AgenciaEsaException.java new file mode 100644 index 0000000..52d3171 --- /dev/null +++ b/src/main/java/eu/esa/gemis/excepcion/AgenciaEsaException.java @@ -0,0 +1,46 @@ +/** + * AgenciaEsaException: excepci贸n personalizada para la aplicaci贸n AgenciaESA. + * Incluye informaci贸n del origen (clase que lanz贸 la excepci贸n) y una constante + * que indica la operaci贸n que se estaba realizando. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.excepcion; + +public class AgenciaEsaException extends Exception { + private static final long serialVersionUID = 1L; + + private int codigoError; + private Class claseOrigen; + + /** Operaci贸n gen茅rica para identificar el contexto donde ocurre la excepci贸n */ + 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; + + public AgenciaEsaException(Throwable error, Class claseOrigen, int codError) { + super(error); + this.claseOrigen = claseOrigen; + this.codigoError=codError; + } + + 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/esa/gemis/gestor/GestorConexionJDBC.java b/src/main/java/eu/esa/gemis/gestor/GestorConexionJDBC.java new file mode 100644 index 0000000..738f2d2 --- /dev/null +++ b/src/main/java/eu/esa/gemis/gestor/GestorConexionJDBC.java @@ -0,0 +1,32 @@ +/** + * GestorConexionJDBC: clase utilitaria para obtener conexiones JDBC a la base de datos MySQL. + * Utiliza la configuraci贸n le铆da por {@link GestorFicheroConfiguracion}. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.gestor; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class GestorConexionJDBC { + + /** + * Obtiene una nueva conexi贸n JDBC a la base de datos configurada. + * + * @return {@link Connection} activa + * @throws SQLException si ocurre un error al conectar + */ + public static Connection obtenerConexion() throws SQLException { + String url = GestorFicheroConfiguracion.obtenerValor("jdbc.url"); + String usuario = GestorFicheroConfiguracion.obtenerValor("jdbc.usuario"); + String password = GestorFicheroConfiguracion.obtenerValor("jdbc.password"); + + if (url == null || usuario == null) { + throw new IllegalStateException("Propiedades JDBC no configuradas correctamente en application.properties"); + } + return DriverManager.getConnection(url, usuario, password); + } +} diff --git a/src/main/java/eu/esa/gemis/gestor/GestorFicheroConfiguracion.java b/src/main/java/eu/esa/gemis/gestor/GestorFicheroConfiguracion.java new file mode 100644 index 0000000..7e5172f --- /dev/null +++ b/src/main/java/eu/esa/gemis/gestor/GestorFicheroConfiguracion.java @@ -0,0 +1,40 @@ +/** + * 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.esa.gemis.gestor; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class GestorFicheroConfiguracion { + private static final String RUTA_FICHERO_CONFIGURACION = "configuracion/aplicacion.properties"; + private static final Properties PROPIEDADES; + + static { + PROPIEDADES = new Properties(); + try (FileInputStream is = new FileInputStream(RUTA_FICHERO_CONFIGURACION); + ) { + + if (is != null) { + PROPIEDADES.load(is); + } + } 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/esa/gemis/procesos/ProcesadorTripulantesCSV.java b/src/main/java/eu/esa/gemis/procesos/ProcesadorTripulantesCSV.java new file mode 100644 index 0000000..1b1133e --- /dev/null +++ b/src/main/java/eu/esa/gemis/procesos/ProcesadorTripulantesCSV.java @@ -0,0 +1,54 @@ +package eu.esa.gemis.procesos; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; + +import eu.esa.gemis.dao.ITripulanteDAO; +import eu.esa.gemis.dao.impl.TripulanteDaoJDBC; +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.gestor.GestorFicheroConfiguracion; +import eu.esa.gemis.vo.Tripulante; + +/** + * + * ProcesadorTripulantesCSV: Clase que realiza el tratamiuento de tripulantes + * para almacenarlos en ficheros CSV. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 27 nov 2025 + * + * + */ + +public class ProcesadorTripulantesCSV { + private static final String SEPARADOR_CSV = GestorFicheroConfiguracion.obtenerValor("csv.separador"); + private static final String CABECERA_CSV = GestorFicheroConfiguracion.obtenerValor("csv.cabecera"); + private String rutaFicheroCSV = GestorFicheroConfiguracion.obtenerValor("ruta.fichero.csv"); + + public void almacenarTripulantesSinMisionEnFicheroCSV() throws AgenciaEsaException { + File ficheroCSV = new File(rutaFicheroCSV); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(ficheroCSV));) { + + // Escribimos la cabecera + writer.write(CABECERA_CSV); + writer.newLine(); + + ITripulanteDAO iTripulanteDAO = new TripulanteDaoJDBC(); + List listaTripulantesSinMision = iTripulanteDAO.obtenerTripulantesSinMision(); + + // Recorremos la lista de tripulantes y los escribimos en el fichero + for (Tripulante tripulante : listaTripulantesSinMision) { + writer.write(tripulante.getNumeroTripulante() + SEPARADOR_CSV + tripulante.getNombre() + SEPARADOR_CSV + + tripulante.getApellidos() + SEPARADOR_CSV + tripulante.getIdentificadorEsa() + SEPARADOR_CSV + + tripulante.getEspecialidad() + SEPARADOR_CSV + tripulante.getFechaIngresoEsa()); + writer.newLine(); + } + } catch (IOException e) { + System.out.println("Error E/S: " + e); + } + } +} diff --git a/src/main/java/eu/esa/gemis/procesos/ProcesadorXMLMision.java b/src/main/java/eu/esa/gemis/procesos/ProcesadorXMLMision.java new file mode 100644 index 0000000..e8ea53b --- /dev/null +++ b/src/main/java/eu/esa/gemis/procesos/ProcesadorXMLMision.java @@ -0,0 +1,124 @@ +package eu.esa.gemis.procesos; + +import java.io.File; +import java.time.LocalDate; + +import eu.esa.gemis.dao.IMisionDAO; +import eu.esa.gemis.dao.ITripulanteDAO; +import eu.esa.gemis.dao.impl.MisionDaoJDBC; +import eu.esa.gemis.dao.impl.TripulanteDaoJDBC; +import eu.esa.gemis.excepcion.AgenciaEsaException; +import eu.esa.gemis.gestor.GestorFicheroConfiguracion; +import eu.esa.gemis.vo.CuerpoCeleste; +import eu.esa.gemis.vo.Mision; +import eu.esa.gemis.vo.Nave; +import eu.esa.gemis.vo.Tripulante; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.xml.XmlMapper; + +/** + * + * ProcesadorXMLMision: Clase que realiza el procesamiento de ficheros XML de + * misiones. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + * + */ + +public class ProcesadorXMLMision { + private String rutaFicheroXML = GestorFicheroConfiguracion.obtenerValor("ruta.fichero.xml"); + + public void procesarFicheroXMLMisiones() throws AgenciaEsaException { + File ficheroXML = new File(rutaFicheroXML); + ObjectMapper mapeadorXML = new XmlMapper(); + JsonNode nodoOperaciones = mapeadorXML.readTree(ficheroXML); + JsonNode listaMisiones = nodoOperaciones.get("misiones").get("mision"); + + // Tratamiento de nodos Misi贸n + for (JsonNode nodoMision : listaMisiones) { +// System.out.println("----- Misi贸n -----"); + realizarTratamientoNodoMision(nodoMision); + } + + // Tratamiento de nodos Tripulante + for (JsonNode nodoMision : listaMisiones) { + + JsonNode nodoTripulacion = nodoMision.get("tripulacion"); + JsonNode listaTripulantes = nodoTripulacion.get("tripulante"); + // Recorrer los distintos nodos Tripulante + for (JsonNode nodoTripulante : listaTripulantes) { +// System.out.println("----- tripulante -----"); + realizarTratamientoNodoTripulante(nodoTripulante); + } + } + } + + private void realizarTratamientoNodoMision(JsonNode nodoMision) throws AgenciaEsaException { + Mision mision = new Mision(); + mision.setNombre(nodoMision.get("nombre").asString()); + String fechaInicio = nodoMision.get("fecha_inicio").asString(); + mision.setFechaInicio(LocalDate.parse(fechaInicio)); + String fechaFinEstimado = nodoMision.get("fecha_fin_estimada").asString(); + mision.setFechaFinEstimado(LocalDate.parse(fechaFinEstimado)); + String objetivo = nodoMision.get("objetivo").asString(); + mision.setObjetivoPrincipal(objetivo); + String presupuesto = nodoMision.get("presupuesto").asString(); + mision.setPresupuestoAsignado(Integer.parseInt(presupuesto)); + mision.setEstado(nodoMision.get("estado").asString()); + + CuerpoCeleste cuerpoCeleste = new CuerpoCeleste(); + cuerpoCeleste.setNombre(nodoMision.get("cuerpo_celeste").asString()); + mision.setCuerpoCeleste(cuerpoCeleste); + + Nave nave = new Nave(); + nave.setCodigo(nodoMision.get("cod_nave").asString()); + mision.setNave(nave); + + IMisionDAO iMisionDAO = new MisionDaoJDBC(); + iMisionDAO.actualizarMisionPorNaveCuerpoFecha(mision); +// System.out.println(mision); + } + + private void realizarTratamientoNodoTripulante(JsonNode nodoTripulante) throws AgenciaEsaException { + + int identificadorESA = nodoTripulante.get("ident_esa").asInt(); + JsonNode nodoNuevoTripulante = nodoTripulante.get("nuevo_tripulante"); + // Si el nodo nuevo_tripulante es nulo, no se trata el tripulante + if (nodoNuevoTripulante != null) { + Tripulante tripulante = new Tripulante(); + tripulante.setNombre(nodoNuevoTripulante.get("nombre").asString()); + tripulante.setApellidos(nodoNuevoTripulante.get("apellidos").asString()); + tripulante.setIdentificadorEsa(identificadorESA); + tripulante.setNivelExperiencia(nodoNuevoTripulante.get("nivel_experiencia").asInt()); + tripulante.setEspecialidad(nodoNuevoTripulante.get("especialidad").asString()); + + + ITripulanteDAO iTripulanteDAO = new TripulanteDaoJDBC(); + Tripulante tripulanteBBDD = iTripulanteDAO.obtenerTripulantePorIdESA(identificadorESA); +// System.out.println(tripulanteBBDD); + + // Si el tripulante ya existe en la BBDD, se actualiza, si no, se inserta + if (tripulanteBBDD != null) { + tripulante.setIdentificadorEsa(tripulanteBBDD.getIdentificadorEsa()); + tripulante.setNombre(tripulanteBBDD.getNombre()); + tripulante.setApellidos(tripulanteBBDD.getApellidos()); + tripulante.setFechaIngresoEsa(tripulanteBBDD.getFechaIngresoEsa()); + tripulante.setNivelExperiencia(tripulanteBBDD.getNivelExperiencia()); + tripulante.setEspecialidad(tripulanteBBDD.getEspecialidad()); + + iTripulanteDAO.actualizarTripulantePorIdESA(tripulante); + } else { + // Asignar la fecha de ingreso a la ESA como la fecha actual + LocalDate fechaIngresoEsa = LocalDate.now(); + tripulante.setFechaIngresoEsa(fechaIngresoEsa); + + iTripulanteDAO.insertarTripulante(tripulante); + } + } + + } + +} diff --git a/src/main/java/eu/esa/gemis/util/ConversorTiposDatosYFormatos.java b/src/main/java/eu/esa/gemis/util/ConversorTiposDatosYFormatos.java new file mode 100644 index 0000000..aafc745 --- /dev/null +++ b/src/main/java/eu/esa/gemis/util/ConversorTiposDatosYFormatos.java @@ -0,0 +1,26 @@ +package eu.esa.gemis.util; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * + * ConversorTiposDatos: Clase que realiza conversiones entre tipos de datos y formatos. + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 14 nov 2025 + * + * + */ + +public class ConversorTiposDatosYFormatos { + public static String convertirAFechaConFormato(LocalDate fecha, String formato) { + String fechaFormateada = null; + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formato); + fechaFormateada = fecha.format(formatter); + + + return fechaFormateada; + } +} + diff --git a/src/main/java/eu/esa/gemis/vo/Base.java b/src/main/java/eu/esa/gemis/vo/Base.java new file mode 100644 index 0000000..8a1cd4e --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/Base.java @@ -0,0 +1,74 @@ +/** + * Base: VO que representa una base espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Base { + private int identificador; + private String nombre; + private String funcionPrincipal; + private LocalDate fechaEstablecimiento; + private String estado; + private CuerpoCeleste cuerpoCeleste; + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getFuncionPrincipal() { + return funcionPrincipal; + } + + public void setFuncionPrincipal(String funcionPrincipal) { + this.funcionPrincipal = funcionPrincipal; + } + + public LocalDate getFechaEstablecimiento() { + return fechaEstablecimiento; + } + + public void setFechaEstablecimiento(LocalDate fechaEstablecimiento) { + this.fechaEstablecimiento = fechaEstablecimiento; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public CuerpoCeleste getCuerpoCeleste() { + return cuerpoCeleste; + } + + public void setCuerpoCeleste(CuerpoCeleste cuerpoCeleste) { + this.cuerpoCeleste = cuerpoCeleste; + } + + @Override + public String toString() { + return "Base [identificador=" + identificador + ", nombre=" + nombre + ", funcionPrincipal=" + funcionPrincipal + + ", fechaEstablecimiento=" + fechaEstablecimiento + ", estado=" + estado + ", cuerpoCeleste=" + + cuerpoCeleste + "]"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/CuerpoCeleste.java b/src/main/java/eu/esa/gemis/vo/CuerpoCeleste.java new file mode 100644 index 0000000..2fd188d --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/CuerpoCeleste.java @@ -0,0 +1,53 @@ +/** + * CuerpoCeleste: VO que representa un cuerpo celeste (planeta, sat茅lite, etc.). + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class CuerpoCeleste { + private int identificador; + private String nombre; + private String tipo; + private double gravedadSuperficieMs2; + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public double getGravedadSuperficieMs2() { + return gravedadSuperficieMs2; + } + + public void setGravedadSuperficieMs2(double gravedadSuperficieMs2) { + this.gravedadSuperficieMs2 = gravedadSuperficieMs2; + } + + @Override + public String toString() { + return "CuerpoCeleste [identificador=" + identificador + ", nombre=" + nombre + ", tipo=" + tipo + + ", gravedadSuperficieMs2=" + gravedadSuperficieMs2 + "]"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java b/src/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java new file mode 100644 index 0000000..611faa8 --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java @@ -0,0 +1,62 @@ +/** + * GeneradorPrincipal: VO que representa un generador de energ铆a principal. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class GeneradorPrincipal { + private int identificador; + private String nombre; + private String tipo; + private double potenciaMw; + private Base base; + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public double getPotenciaMw() { + return potenciaMw; + } + + public void setPotenciaMw(double potenciaMw) { + this.potenciaMw = potenciaMw; + } + + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + } + + @Override + public String toString() { + return "GeneradorPrincipal [identificador=" + identificador + ", nombre=" + nombre + ", tipo=" + tipo + + ", potenciaMw=" + potenciaMw + ", base=" + base + "]"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/Mision.java b/src/main/java/eu/esa/gemis/vo/Mision.java new file mode 100644 index 0000000..a908866 --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/Mision.java @@ -0,0 +1,111 @@ +/** + * Mision: VO que representa una misi贸n espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Mision { + private int identificador; + private String nombre; + private Nave nave; + private CuerpoCeleste cuerpoCeleste; + private LocalDate fechaInicio; + private LocalDate fechaFinEstimado; + private LocalDate fechaFin; + private String estado; + private String objetivoPrincipal; + private int presupuestoAsignado; + + public Nave getNave() { + return nave; + } + + public void setNave(Nave nave) { + this.nave = nave; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public CuerpoCeleste getCuerpoCeleste() { + return cuerpoCeleste; + } + + public void setCuerpoCeleste(CuerpoCeleste cuerpoCeleste) { + this.cuerpoCeleste = cuerpoCeleste; + } + + public LocalDate getFechaInicio() { + return fechaInicio; + } + + public void setFechaInicio(LocalDate fechaInicio) { + this.fechaInicio = fechaInicio; + } + + public LocalDate getFechaFinEstimado() { + return fechaFinEstimado; + } + + public void setFechaFinEstimado(LocalDate fechaFinEstimado) { + this.fechaFinEstimado = fechaFinEstimado; + } + + public LocalDate getFechaFin() { + return fechaFin; + } + + public void setFechaFin(LocalDate fechaFin) { + this.fechaFin = fechaFin; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public String getObjetivoPrincipal() { + return objetivoPrincipal; + } + + public void setObjetivoPrincipal(String objetivoPrincipal) { + this.objetivoPrincipal = objetivoPrincipal; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public int getPresupuestoAsignado() { + return presupuestoAsignado; + } + + public void setPresupuestoAsignado(int presupuestoAsignado) { + this.presupuestoAsignado = presupuestoAsignado; + } + + @Override + public String toString() { + return "Mision [identificador=" + identificador + ", nombre=" + nombre + ", nave=" + nave + ", cuerpoCeleste=" + + cuerpoCeleste + ", fechaInicio=" + fechaInicio + ", fechaFinEstimado=" + fechaFinEstimado + + ", fechaFin=" + fechaFin + ", estado=" + estado + ", objetivoPrincipal=" + objetivoPrincipal + + ", presupuestoAsignado=" + presupuestoAsignado + "]\n"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/Nave.java b/src/main/java/eu/esa/gemis/vo/Nave.java new file mode 100644 index 0000000..e9b29bc --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/Nave.java @@ -0,0 +1,62 @@ +/** + * Nave: VO que representa una nave espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class Nave { + private String codigo; + private String nombre; + private String tipo; + private int capacidadTripulacion; + private short autonomiaDias; + + 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 String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public int getCapacidadTripulacion() { + return capacidadTripulacion; + } + + public void setCapacidadTripulacion(int capacidadTripulacion) { + this.capacidadTripulacion = capacidadTripulacion; + } + + public short getAutonomiaDias() { + return autonomiaDias; + } + + public void setAutonomiaDias(short autonomiaDias) { + this.autonomiaDias = autonomiaDias; + } + + @Override + public String toString() { + return "Nave [codigo=" + codigo + ", nombre=" + nombre + ", tipo=" + tipo + ", capacidadTripulacion=" + + capacidadTripulacion + ", autonomiaDias=" + autonomiaDias + "]"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/Tripulante.java b/src/main/java/eu/esa/gemis/vo/Tripulante.java new file mode 100644 index 0000000..20870db --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/Tripulante.java @@ -0,0 +1,83 @@ +/** + * Tripulante: VO que representa a un miembro del personal de la ESA. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Tripulante { + private int numeroTripulante; + private String nombre; + private String apellidos; + private int identificadorEsa; + private int nivelExperiencia; + private String especialidad; + private LocalDate fechaIngresoEsa; + + public int getNumeroTripulante() { + return numeroTripulante; + } + + public void setNumeroTripulante(int numeroTripulante) { + this.numeroTripulante = numeroTripulante; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getApellidos() { + return apellidos; + } + + public void setApellidos(String apellidos) { + this.apellidos = apellidos; + } + + public int getIdentificadorEsa() { + return identificadorEsa; + } + + public void setIdentificadorEsa(int identificadorEsa) { + this.identificadorEsa = identificadorEsa; + } + + public int getNivelExperiencia() { + return nivelExperiencia; + } + + public void setNivelExperiencia(int nivelExperiencia) { + this.nivelExperiencia = nivelExperiencia; + } + + public String getEspecialidad() { + return especialidad; + } + + public void setEspecialidad(String especialidad) { + this.especialidad = especialidad; + } + + public LocalDate getFechaIngresoEsa() { + return fechaIngresoEsa; + } + + public void setFechaIngresoEsa(LocalDate fechaIngresoEsa) { + this.fechaIngresoEsa = fechaIngresoEsa; + } + + @Override + public String toString() { + return "Tripulante [numeroTripulante=" + numeroTripulante + ", nombre=" + nombre + ", apellidos=" + apellidos + + ", identificadorEsa=" + identificadorEsa + ", nivelExperiencia=" + nivelExperiencia + + ", especialidad=" + especialidad + ", fechaIngresoEsa=" + fechaIngresoEsa + "]\n"; + } + +} diff --git a/src/main/java/eu/esa/gemis/vo/TripulanteMision.java b/src/main/java/eu/esa/gemis/vo/TripulanteMision.java new file mode 100644 index 0000000..ca628e2 --- /dev/null +++ b/src/main/java/eu/esa/gemis/vo/TripulanteMision.java @@ -0,0 +1,46 @@ +/** + * TripulanteMision: VO que representa la asignaci贸n de un tripulante a una misi贸n. + * + * Se modelan las claves for谩neas como referencias a los objetos + * {@link Mision} y {@link Tripulante} en lugar de simples identificadores. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class TripulanteMision { + private Mision mision; + private Tripulante tripulante; + private String rol; + + public Mision getMision() { + return mision; + } + + public void setMision(Mision mision) { + this.mision = mision; + } + + public Tripulante getTripulante() { + return tripulante; + } + + public void setTripulante(Tripulante tripulante) { + this.tripulante = tripulante; + } + + public String getRol() { + return rol; + } + + public void setRol(String rol) { + this.rol = rol; + } + + @Override + public String toString() { + return "TripulanteMision [mision=" + mision + ", tripulante=" + tripulante + ", rol=" + rol + "]"; + } + +} diff --git a/src/main/main/java/eu/esa/gemis/dao/IBaseDAO.java b/src/main/main/java/eu/esa/gemis/dao/IBaseDAO.java new file mode 100644 index 0000000..bfd7b9c --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/dao/IBaseDAO.java @@ -0,0 +1,23 @@ +/** + * IBaseDAO: Interfaz DAO para la entidad Base. + * Define operaciones CRUD b谩sicas. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import eu.esa.gemis.vo.Base; +import java.util.List; + +public interface IBaseDAO { + void crear(Base base) throws Exception; + + Base obtenerPorId(int identificador) throws Exception; + + List obtenerTodas() throws Exception; + + void actualizar(Base base) throws Exception; + + void eliminar(int identificador) throws Exception; +} diff --git a/src/main/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java b/src/main/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java new file mode 100644 index 0000000..0d849cc --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/dao/ICuerpoCelesteDAO.java @@ -0,0 +1,23 @@ +/** + * ICuerpoCelesteDAO: Interfaz DAO para la entidad CuerpoCeleste. + * Define operaciones CRUD b谩sicas. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import eu.esa.gemis.vo.CuerpoCeleste; +import java.util.List; + +public interface ICuerpoCelesteDAO { + void crear(CuerpoCeleste cuerpoCeleste) throws Exception; + + CuerpoCeleste obtenerPorId(int identificador) throws Exception; + + List obtenerTodas() throws Exception; + + void actualizar(CuerpoCeleste cuerpoCeleste) throws Exception; + + void eliminar(int identificador) throws Exception; +} diff --git a/src/main/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java b/src/main/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java new file mode 100644 index 0000000..6ea317f --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/dao/IGeneradorPrincipalDAO.java @@ -0,0 +1,23 @@ +/** + * IGeneradorPrincipalDAO: Interfaz DAO para la entidad GeneradorPrincipal. + * Define operaciones CRUD b谩sicas. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import eu.esa.gemis.vo.GeneradorPrincipal; +import java.util.List; + +public interface IGeneradorPrincipalDAO { + void crear(GeneradorPrincipal generador) throws Exception; + + GeneradorPrincipal obtenerPorId(int identificador) throws Exception; + + List obtenerTodas() throws Exception; + + void actualizar(GeneradorPrincipal generador) throws Exception; + + void eliminar(int identificador) throws Exception; +} diff --git a/src/main/main/java/eu/esa/gemis/dao/INaveDAO.java b/src/main/main/java/eu/esa/gemis/dao/INaveDAO.java new file mode 100644 index 0000000..ad18f0e --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/dao/INaveDAO.java @@ -0,0 +1,23 @@ +/** + * INaveDAO: Interfaz DAO para la entidad Nave. + * Define operaciones CRUD b谩sicas. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import eu.esa.gemis.vo.Nave; +import java.util.List; + +public interface INaveDAO { + void crear(Nave nave) throws Exception; + + Nave obtenerPorCodigo(String codigo) throws Exception; + + List obtenerTodas() throws Exception; + + void actualizar(Nave nave) throws Exception; + + void eliminar(String codigo) throws Exception; +} diff --git a/src/main/main/java/eu/esa/gemis/dao/ITripulanteDAO.java b/src/main/main/java/eu/esa/gemis/dao/ITripulanteDAO.java new file mode 100644 index 0000000..08224d3 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/dao/ITripulanteDAO.java @@ -0,0 +1,23 @@ +/** + * ITripulanteDAO: Interfaz DAO para la entidad Tripulante. + * Define operaciones CRUD b谩sicas. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.dao; + +import eu.esa.gemis.vo.Tripulante; +import java.util.List; + +public interface ITripulanteDAO { + void crear(Tripulante tripulante) throws Exception; + + Tripulante obtenerPorId(int numeroTripulante) throws Exception; + + List obtenerTodas() throws Exception; + + void actualizar(Tripulante tripulante) throws Exception; + + void eliminar(int numeroTripulante) throws Exception; +} diff --git a/src/main/main/java/eu/esa/gemis/exception/AgenciaEsaException.java b/src/main/main/java/eu/esa/gemis/exception/AgenciaEsaException.java new file mode 100644 index 0000000..b299d78 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/exception/AgenciaEsaException.java @@ -0,0 +1,32 @@ +/** + * AgenciaEsaException: excepci贸n personalizada para la aplicaci贸n AgenciaESA. + * Incluye informaci贸n del origen (clase que lanz贸 la excepci贸n) y una constante + * que indica la operaci贸n que se estaba realizando. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.exception; + +public class AgenciaEsaException extends Exception { + private static final long serialVersionUID = 1L; + + /** Operaci贸n gen茅rica para identificar el contexto donde ocurre la excepci贸n */ + public static final String OPERACION_DAO = "DAO_OPERATION"; + + private final String claseOrigen; + + public AgenciaEsaException(Throwable cause, String claseOrigen) { + super(cause); + this.claseOrigen = claseOrigen; + } + + public String getClaseOrigen() { + return claseOrigen; + } + + @Override + public String getMessage() { + return "Error en " + claseOrigen + ": " + super.getMessage(); + } +} diff --git a/src/main/main/java/eu/esa/gemis/util/GestorConexionJDBC.java b/src/main/main/java/eu/esa/gemis/util/GestorConexionJDBC.java new file mode 100644 index 0000000..92184e6 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/util/GestorConexionJDBC.java @@ -0,0 +1,31 @@ +/** + * GestorConexionJDBC: clase utilitaria para obtener conexiones JDBC a la base de datos MySQL. + * Utiliza la configuraci贸n le铆da por {@link GestorFicheroConfiguracion}. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class GestorConexionJDBC { + + /** + * Obtiene una nueva conexi贸n JDBC a la base de datos configurada. + * + * @return {@link Connection} activa + * @throws SQLException si ocurre un error al conectar + */ + public static Connection obtenerConexion() throws SQLException { + String url = GestorFicheroConfiguracion.obtenerValor("jdbc.url"); + String usuario = GestorFicheroConfiguracion.obtenerValor("jdbc.usuario"); + String password = GestorFicheroConfiguracion.obtenerValor("jdbc.password"); + if (url == null || usuario == null) { + throw new IllegalStateException("Propiedades JDBC no configuradas correctamente en application.properties"); + } + return DriverManager.getConnection(url, usuario, password); + } +} diff --git a/src/main/main/java/eu/esa/gemis/util/GestorFicheroConfiguracion.java b/src/main/main/java/eu/esa/gemis/util/GestorFicheroConfiguracion.java new file mode 100644 index 0000000..d9d2922 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/util/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.esa.gemis.util; + +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("application.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/main/java/eu/esa/gemis/vo/Base.java b/src/main/main/java/eu/esa/gemis/vo/Base.java new file mode 100644 index 0000000..a70da7e --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/Base.java @@ -0,0 +1,91 @@ +/** + * Base: VO que representa una base espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Base { + private int identificador; // AUTO_INCREMENT + private String nombre; + private String funcionPrincipal; // Investigaci贸n, Log铆stica, Control + private LocalDate fechaEstablecimiento; + private String estado; // Operativa, Mantenimiento, Expandible + private CuerpoCeleste cuerpoCeleste; // FK a CuerpoCeleste + + public Base() { + } + + public Base(int identificador, String nombre, String funcionPrincipal, + LocalDate fechaEstablecimiento, String estado, CuerpoCeleste cuerpoCeleste) { + this.identificador = identificador; + this.nombre = nombre; + this.funcionPrincipal = funcionPrincipal; + this.fechaEstablecimiento = fechaEstablecimiento; + this.estado = estado; + this.cuerpoCeleste = cuerpoCeleste; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getFuncionPrincipal() { + return funcionPrincipal; + } + + public void setFuncionPrincipal(String funcionPrincipal) { + this.funcionPrincipal = funcionPrincipal; + } + + public LocalDate getFechaEstablecimiento() { + return fechaEstablecimiento; + } + + public void setFechaEstablecimiento(LocalDate fechaEstablecimiento) { + this.fechaEstablecimiento = fechaEstablecimiento; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public CuerpoCeleste getCuerpoCeleste() { + return cuerpoCeleste; + } + + public void setCuerpoCeleste(CuerpoCeleste cuerpoCeleste) { + this.cuerpoCeleste = cuerpoCeleste; + } + + @Override + public String toString() { + return "Base{" + + "identificador=" + identificador + + ", nombre='" + nombre + '\'' + + ", funcionPrincipal='" + funcionPrincipal + '\'' + + ", fechaEstablecimiento=" + fechaEstablecimiento + + ", estado='" + estado + '\'' + + ", cuerpoCeleste=" + cuerpoCeleste + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/CuerpoCeleste.java b/src/main/main/java/eu/esa/gemis/vo/CuerpoCeleste.java new file mode 100644 index 0000000..73d8060 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/CuerpoCeleste.java @@ -0,0 +1,66 @@ +/** + * CuerpoCeleste: VO que representa un cuerpo celeste (planeta, sat茅lite, etc.). + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class CuerpoCeleste { + private int identificador; // AUTO_INCREMENT + private String nombre; + private String tipo; // Planeta, Sat茅lite, Asteroide, Planetoide + private double gravedadSuperficieMs2; + + public CuerpoCeleste() { + } + + public CuerpoCeleste(int identificador, String nombre, String tipo, double gravedadSuperficieMs2) { + this.identificador = identificador; + this.nombre = nombre; + this.tipo = tipo; + this.gravedadSuperficieMs2 = gravedadSuperficieMs2; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public double getGravedadSuperficieMs2() { + return gravedadSuperficieMs2; + } + + public void setGravedadSuperficieMs2(double gravedadSuperficieMs2) { + this.gravedadSuperficieMs2 = gravedadSuperficieMs2; + } + + @Override + public String toString() { + return "CuerpoCeleste{" + + "identificador=" + identificador + + ", nombre='" + nombre + '\'' + + ", tipo='" + tipo + '\'' + + ", gravedadSuperficieMs2=" + gravedadSuperficieMs2 + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java b/src/main/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java new file mode 100644 index 0000000..0db09a5 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/GeneradorPrincipal.java @@ -0,0 +1,77 @@ +/** + * GeneradorPrincipal: VO que representa un generador de energ铆a principal. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class GeneradorPrincipal { + private int identificador; // AUTO_INCREMENT + private String nombre; + private String tipo; // Nuclear, Solar, Geot茅rmica + private double potenciaMw; + private Base base; // FK opcional a Base (puede ser null) + + public GeneradorPrincipal() { + } + + public GeneradorPrincipal(int identificador, String nombre, String tipo, double potenciaMw, Base base) { + this.identificador = identificador; + this.nombre = nombre; + this.tipo = tipo; + this.potenciaMw = potenciaMw; + this.base = base; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public double getPotenciaMw() { + return potenciaMw; + } + + public void setPotenciaMw(double potenciaMw) { + this.potenciaMw = potenciaMw; + } + + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + } + + @Override + public String toString() { + return "GeneradorPrincipal{" + + "identificador=" + identificador + + ", nombre='" + nombre + '\'' + + ", tipo='" + tipo + '\'' + + ", potenciaMw=" + potenciaMw + + ", base=" + base + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/Mision.java b/src/main/main/java/eu/esa/gemis/vo/Mision.java new file mode 100644 index 0000000..1ea847f --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/Mision.java @@ -0,0 +1,125 @@ +/** + * Mision: VO que representa una misi贸n espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Mision { + private int identificador; // AUTO_INCREMENT + private String codNave; // FK a Nave (codigo) + private CuerpoCeleste cuerpoCeleste; // FK a CuerpoCeleste (identificador) + private LocalDate fechaInicio; + private LocalDate fechaFinEstimado; + private LocalDate fechaFin; // nullable + private String estado; // Planificada, En curso, Completada, Cancelada + private String objetivoPrincipal; + private double presupuestoAsignado; + + public Mision() { + } + + public Mision(int identificador, String codNave, CuerpoCeleste cuerpoCeleste, + LocalDate fechaInicio, LocalDate fechaFinEstimado, LocalDate fechaFin, + String estado, String objetivoPrincipal, double presupuestoAsignado) { + this.identificador = identificador; + this.codNave = codNave; + this.cuerpoCeleste = cuerpoCeleste; + this.fechaInicio = fechaInicio; + this.fechaFinEstimado = fechaFinEstimado; + this.fechaFin = fechaFin; + this.estado = estado; + this.objetivoPrincipal = objetivoPrincipal; + this.presupuestoAsignado = presupuestoAsignado; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getCodNave() { + return codNave; + } + + public void setCodNave(String codNave) { + this.codNave = codNave; + } + + public CuerpoCeleste getCuerpoCeleste() { + return cuerpoCeleste; + } + + public void setCuerpoCeleste(CuerpoCeleste cuerpoCeleste) { + this.cuerpoCeleste = cuerpoCeleste; + } + + public LocalDate getFechaInicio() { + return fechaInicio; + } + + public void setFechaInicio(LocalDate fechaInicio) { + this.fechaInicio = fechaInicio; + } + + public LocalDate getFechaFinEstimado() { + return fechaFinEstimado; + } + + public void setFechaFinEstimado(LocalDate fechaFinEstimado) { + this.fechaFinEstimado = fechaFinEstimado; + } + + public LocalDate getFechaFin() { + return fechaFin; + } + + public void setFechaFin(LocalDate fechaFin) { + this.fechaFin = fechaFin; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public String getObjetivoPrincipal() { + return objetivoPrincipal; + } + + public void setObjetivoPrincipal(String objetivoPrincipal) { + this.objetivoPrincipal = objetivoPrincipal; + } + + public double getPresupuestoAsignado() { + return presupuestoAsignado; + } + + public void setPresupuestoAsignado(double presupuestoAsignado) { + this.presupuestoAsignado = presupuestoAsignado; + } + + @Override + public String toString() { + return "Mision{" + + "identificador=" + identificador + + ", codNave='" + codNave + '\'' + + ", cuerpoCeleste=" + cuerpoCeleste + + ", fechaInicio=" + fechaInicio + + ", fechaFinEstimado=" + fechaFinEstimado + + ", fechaFin=" + fechaFin + + ", estado='" + estado + '\'' + + ", objetivoPrincipal='" + objetivoPrincipal + '\'' + + ", presupuestoAsignado=" + presupuestoAsignado + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/Modulo.java b/src/main/main/java/eu/esa/gemis/vo/Modulo.java new file mode 100644 index 0000000..645efbd --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/Modulo.java @@ -0,0 +1,91 @@ +/** + * Modulo: VO que representa un m贸dulo instalado en una base espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Modulo { + private int identificador; // AUTO_INCREMENT + private String nombre; + private String tipo; // Laboratorio, Alojamiento, Comunicaciones, Perforaci贸n, S铆smico + private LocalDate fechaInstalacion; + private double consumoEnergia; + private Base base; // FK a Base (identificador) + + public Modulo() { + } + + public Modulo(int identificador, String nombre, String tipo, LocalDate fechaInstalacion, + double consumoEnergia, Base base) { + this.identificador = identificador; + this.nombre = nombre; + this.tipo = tipo; + this.fechaInstalacion = fechaInstalacion; + this.consumoEnergia = consumoEnergia; + this.base = base; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public LocalDate getFechaInstalacion() { + return fechaInstalacion; + } + + public void setFechaInstalacion(LocalDate fechaInstalacion) { + this.fechaInstalacion = fechaInstalacion; + } + + public double getConsumoEnergia() { + return consumoEnergia; + } + + public void setConsumoEnergia(double consumoEnergia) { + this.consumoEnergia = consumoEnergia; + } + + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + } + + @Override + public String toString() { + return "Modulo{" + + "identificador=" + identificador + + ", nombre='" + nombre + '\'' + + ", tipo='" + tipo + '\'' + + ", fechaInstalacion=" + fechaInstalacion + + ", consumoEnergia=" + consumoEnergia + + ", base=" + base + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/Nave.java b/src/main/main/java/eu/esa/gemis/vo/Nave.java new file mode 100644 index 0000000..cc5a5ee --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/Nave.java @@ -0,0 +1,77 @@ +/** + * Nave: VO que representa una nave espacial. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +public class Nave { + private String codigo; + private String nombre; + private String tipo; // Transporte, Reconocimiento, Cient铆fica, Mantenimiento + private int capacidadTripulacion; + private short autonomiaDias; + + public Nave() { + } + + public Nave(String codigo, String nombre, String tipo, int capacidadTripulacion, short autonomiaDias) { + this.codigo = codigo; + this.nombre = nombre; + this.tipo = tipo; + this.capacidadTripulacion = capacidadTripulacion; + this.autonomiaDias = autonomiaDias; + } + + 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 String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public int getCapacidadTripulacion() { + return capacidadTripulacion; + } + + public void setCapacidadTripulacion(int capacidadTripulacion) { + this.capacidadTripulacion = capacidadTripulacion; + } + + public short getAutonomiaDias() { + return autonomiaDias; + } + + public void setAutonomiaDias(short autonomiaDias) { + this.autonomiaDias = autonomiaDias; + } + + @Override + public String toString() { + return "Nave{" + + "codigo='" + codigo + '\'' + + ", nombre='" + nombre + '\'' + + ", tipo='" + tipo + '\'' + + ", capacidadTripulacion=" + capacidadTripulacion + + ", autonomiaDias=" + autonomiaDias + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/Tripulante.java b/src/main/main/java/eu/esa/gemis/vo/Tripulante.java new file mode 100644 index 0000000..c2763e5 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/Tripulante.java @@ -0,0 +1,102 @@ +/** + * Tripulante: VO que representa a un miembro del personal de la ESA. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.time.LocalDate; + +public class Tripulante { + private int numeroTripulante; // AUTO_INCREMENT + private String nombre; + private String apellidos; + private int identificadorEsa; // 煤nico + private int nivelExperiencia; // 1-5 + private String especialidad; // Pilotaje, Ingenier铆a, Medicina, Geolog铆a, Comunicaciones + private LocalDate fechaIngresoEsa; + + public Tripulante() { + } + + public Tripulante(int numeroTripulante, String nombre, String apellidos, int identificadorEsa, + int nivelExperiencia, String especialidad, LocalDate fechaIngresoEsa) { + this.numeroTripulante = numeroTripulante; + this.nombre = nombre; + this.apellidos = apellidos; + this.identificadorEsa = identificadorEsa; + this.nivelExperiencia = nivelExperiencia; + this.especialidad = especialidad; + this.fechaIngresoEsa = fechaIngresoEsa; + } + + public int getNumeroTripulante() { + return numeroTripulante; + } + + public void setNumeroTripulante(int numeroTripulante) { + this.numeroTripulante = numeroTripulante; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getApellidos() { + return apellidos; + } + + public void setApellidos(String apellidos) { + this.apellidos = apellidos; + } + + public int getIdentificadorEsa() { + return identificadorEsa; + } + + public void setIdentificadorEsa(int identificadorEsa) { + this.identificadorEsa = identificadorEsa; + } + + public int getNivelExperiencia() { + return nivelExperiencia; + } + + public void setNivelExperiencia(int nivelExperiencia) { + this.nivelExperiencia = nivelExperiencia; + } + + public String getEspecialidad() { + return especialidad; + } + + public void setEspecialidad(String especialidad) { + this.especialidad = especialidad; + } + + public LocalDate getFechaIngresoEsa() { + return fechaIngresoEsa; + } + + public void setFechaIngresoEsa(LocalDate fechaIngresoEsa) { + this.fechaIngresoEsa = fechaIngresoEsa; + } + + @Override + public String toString() { + return "Tripulante{" + + "numeroTripulante=" + numeroTripulante + + ", nombre='" + nombre + '\'' + + ", apellidos='" + apellidos + '\'' + + ", identificadorEsa=" + identificadorEsa + + ", nivelExperiencia=" + nivelExperiencia + + ", especialidad='" + especialidad + '\'' + + ", fechaIngresoEsa=" + fechaIngresoEsa + + '}'; + } +} diff --git a/src/main/main/java/eu/esa/gemis/vo/TripulanteMision.java b/src/main/main/java/eu/esa/gemis/vo/TripulanteMision.java new file mode 100644 index 0000000..1c8aff7 --- /dev/null +++ b/src/main/main/java/eu/esa/gemis/vo/TripulanteMision.java @@ -0,0 +1,89 @@ +/** + * TripulanteMision: VO que representa la asignaci贸n de un tripulante a una misi贸n. + * + * Se modelan las claves for谩neas como referencias a los objetos + * {@link Mision} y {@link Tripulante} en lugar de simples identificadores. + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 25 nov 2025 + */ +package eu.esa.gemis.vo; + +import java.util.Objects; + +public class TripulanteMision { + private Mision mision; // FK a Mision + private Tripulante tripulante; // FK a Tripulante + private String rol; // descripci贸n del rol en la misi贸n + private int nivelEstres; // 1-5 + + public TripulanteMision() { + } + + public TripulanteMision(Mision mision, Tripulante tripulante, String rol, int nivelEstres) { + this.mision = mision; + this.tripulante = tripulante; + this.rol = rol; + this.nivelEstres = nivelEstres; + } + + public Mision getMision() { + return mision; + } + + public void setMision(Mision mision) { + this.mision = mision; + } + + public Tripulante getTripulante() { + return tripulante; + } + + public void setTripulante(Tripulante tripulante) { + this.tripulante = tripulante; + } + + public String getRol() { + return rol; + } + + public void setRol(String rol) { + this.rol = rol; + } + + public int getNivelEstres() { + return nivelEstres; + } + + public void setNivelEstres(int nivelEstres) { + this.nivelEstres = nivelEstres; + } + + @Override + public String toString() { + return "TripulanteMision{" + + "mision=" + (mision != null ? mision.getIdentificador() : "null") + + ", tripulante=" + (tripulante != null ? tripulante.getNumeroTripulante() : "null") + + ", rol='" + rol + '\'' + + ", nivelEstres=" + nivelEstres + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + TripulanteMision that = (TripulanteMision) o; + return nivelEstres == that.nivelEstres && + Objects.equals(mision, that.mision) && + Objects.equals(tripulante, that.tripulante) && + Objects.equals(rol, that.rol); + } + + @Override + public int hashCode() { + return Objects.hash(mision, tripulante, rol, nivelEstres); + } +} diff --git a/src/main/main/resources/application.properties b/src/main/main/resources/application.properties new file mode 100644 index 0000000..1b366e7 --- /dev/null +++ b/src/main/main/resources/application.properties @@ -0,0 +1,5 @@ +# Configuraci贸n de la aplicaci贸n AgenciaESA +# JDBC MySQL +jdbc.url=jdbc:mysql://localhost:3306/agenciaesa?useSSL=false&serverTimezone=UTC +jdbc.usuario=usuario +jdbc.password=clave