commit d12b970af3d55df2cc64df0943f7aa55080be75b Author: Isidoro Nevares Mart铆n Date: Wed Nov 26 11:10:43 2025 +0100 commit inicial diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..46fcc12 --- /dev/null +++ b/.classpath @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + 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..0a38c37 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + aadd_act2_9 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..a2ccbdd --- /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=enabled +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/config/config.properties b/config/config.properties new file mode 100644 index 0000000..5abecf6 --- /dev/null +++ b/config/config.properties @@ -0,0 +1,5 @@ +# Par醡etros de conexi髇 a la base de datos 'Cine' en SGDB MySQL +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql://192.168.1.36:3306/Cine +jdbc.usuario = root +jdbc.password = mysql_123 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..97aa563 --- /dev/null +++ b/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + aadd_act2_7 + aadd_act2_7 + 0.0.1-SNAPSHOT + + + + com.mysql + mysql-connector-j + 9.5.0 + + + + org.postgresql + postgresql + 42.7.8 + + + + src + + + maven-compiler-plugin + 3.13.0 + + 24 + + + + + \ No newline at end of file diff --git a/sql/procedimiento-y-funcion.sql b/sql/procedimiento-y-funcion.sql new file mode 100644 index 0000000..8873c76 --- /dev/null +++ b/sql/procedimiento-y-funcion.sql @@ -0,0 +1,45 @@ + + +DELIMITER // + +CREATE PROCEDURE obtenerRepartoPeliculasPorActor(IN p_patron_nombre_actor VARCHAR(100)) +BEGIN + SELECT + a.nombre AS nombre_actor, + a.id_pais AS id_pais_actor, + p.titulo AS titulo_pelicula, + p.id_pais AS id_pais_pelicula, + d.nombre AS nombre_director, + d.id_pais AS id_pais_director, + d.fecha_nacimiento AS fecha_nacimiento_director + FROM reparto r + JOIN actor a ON r.id_actor = a.identificador + JOIN pelicula p ON p.identificador = r.id_pelicula + JOIN director d ON p.id_director = d.identificador + WHERE p.identificador IN ( + SELECT re.id_pelicula + FROM reparto re + JOIN actor ac ON re.id_actor = ac.identificador + JOIN pelicula pe ON re.id_pelicula = pe.identificador + WHERE ac.nombre LIKE p_patron_nombre_actor + ); +END; +// + +CREATE FUNCTION obtenerNumeroActoresPelicula(p_id_pelicula INT) +RETURNS INT +DETERMINISTIC +READS SQL DATA +BEGIN + DECLARE total_actores_pelicula INT; + + SELECT COUNT(*) INTO total_actores_pelicula + FROM reparto + WHERE id_pelicula = p_id_pelicula; + + RETURN total_actores_pelicula; +END; +// + +DELIMITER ; + diff --git a/src/es/palomafp/aadd/inm/GestorCine.java b/src/es/palomafp/aadd/inm/GestorCine.java new file mode 100644 index 0000000..fbfdf87 --- /dev/null +++ b/src/es/palomafp/aadd/inm/GestorCine.java @@ -0,0 +1,141 @@ +package es.palomafp.aadd.inm; + +import java.util.List; + +import es.palomafp.aadd.inm.dao.IActorDAO; +import es.palomafp.aadd.inm.dao.IContinenteDAO; +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.dao.IRepartoDAO; +import es.palomafp.aadd.inm.dao.impl.ActorDaoJDBC; +import es.palomafp.aadd.inm.dao.impl.ContinenteDaoJAR; +import es.palomafp.aadd.inm.dao.impl.PaisDaoJAR; +import es.palomafp.aadd.inm.dao.impl.RepartoDaoJDBC; +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.util.ConversorTiposDatosYFormatos; +import es.palomafp.aadd.inm.vo.Continente; +import es.palomafp.aadd.inm.vo.Pais; +import es.palomafp.aadd.inm.vo.Reparto; + +/** + * + * GestorCine: Clase que se encarga de gestionar (Continente, Pais, Actor, + * Director, Pelicula, Reparto) + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class GestorCine { + public static void main(String[] args) { + GestorCine gc = new GestorCine(); + try { + gc.imprimirRepartoPeliculasActorTerminaEnT(); + + gc.imprimirNumeroActoresPelicula(); + + gc.realizarTratamientoContinente(); + + gc.realizarTratamientoPais(); + } catch (CineException 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 CineException.ERROR_GESTION_CONEXION: + operacion = "Gesti贸n de Conexi贸n"; + break; + case CineException.ERROR_CONSULTA: + operacion = "Consulta"; + break; + case CineException.ERROR_INSERCION: + operacion = "Inserci贸n"; + break; + case CineException.ERROR_BORRADO: + operacion = "Borrado"; + break; + case CineException.ERROR_ACTUALIZACION: + operacion = "Actualizaci贸n"; + break; + } + mensajeError = String.format(mensajeError, e.getClaseOrigen().getName(), operacion); + System.out.println(mensajeError); + e.printStackTrace(); + } + + } + + private void imprimirNumeroActoresPelicula() throws CineException { + IActorDAO iActorDAO = new ActorDaoJDBC(); + int idPelicula = 1; // Ejemplo: pel铆cula con id 1 + System.out.println("Imprimir el n煤mero de actores en la pel铆cula con id " + idPelicula); + int numeroActores = iActorDAO.obtenerNumeroActoresPelicula(idPelicula); + System.out.println("N煤mero de actores en la pel铆cula con id " + idPelicula + ": " + numeroActores); + } + + private void imprimirRepartoPeliculasActorTerminaEnT() throws CineException { + IRepartoDAO iRepartoDAO = new RepartoDaoJDBC(); + + System.out.println("----- FIJO -----"); + List listaReparto = iRepartoDAO.obtenerListaRepartoPeliculasNombreActorTerminaT(); + imprimirReparto(listaReparto); + + System.out.println("----- Con patr贸n -----"); + + List listaRepartoConPatron = iRepartoDAO.obtenerListaRepartoPeliculasNombreActorConPatron("%t"); + imprimirReparto(listaRepartoConPatron); + + } + + private void imprimirReparto(List listaReparto) throws CineException { + for (Reparto reparto : listaReparto) { +// System.out.println(reparto); + String textoImprimir = """ + %s, que naci贸 en %s (%s), particip贸 en la pel铆cula + '%s', rodada en %s (%s) y dirigida por + %s que naci贸 en %s (%s) el %s. + """; + String fechaNacimientoFormateada = null; + if (reparto.getPelicula().getDirector().getFechaNacimiento() != null) { + fechaNacimientoFormateada = ConversorTiposDatosYFormatos + .convertirDateAString(reparto.getPelicula().getDirector().getFechaNacimiento(), "dd/MM/yyyy"); + } + textoImprimir = String.format(textoImprimir, reparto.getActor().getNombre(), + reparto.getActor().getPaisNacimiento().getNombre(), + reparto.getActor().getPaisNacimiento().getContinente().getNombre(), + reparto.getPelicula().getTitulo(), reparto.getPelicula().getPaisLocalizacion().getNombre(), + reparto.getPelicula().getPaisLocalizacion().getContinente().getNombre(), + reparto.getPelicula().getDirector().getNombre(), + reparto.getPelicula().getDirector().getPaisNacimiento().getNombre(), + reparto.getPelicula().getDirector().getPaisNacimiento().getContinente().getNombre(), + fechaNacimientoFormateada); + System.out.println(textoImprimir); + } + } + private void realizarTratamientoContinente() throws CineException { + IContinenteDAO iContinenteDAO = new ContinenteDaoJAR(); + // Crear continente + String codigoContinente = "06"; + Continente continente = new Continente(); + continente.setCodigo(codigoContinente); + continente.setNombre("Ant谩rtida"); + iContinenteDAO.crearContinente(continente); + System.out.println("Se ha creado el continente: " + continente); + + // Borrar continente + iContinenteDAO.borrarContinente(codigoContinente); + System.out.println("Se ha eliminado el continente con codigo: " + codigoContinente); + + } + private void realizarTratamientoPais() throws CineException { + IPaisDAO iPaisDAO = new PaisDaoJAR(); + // Consutar pa铆ses americanos que empiezan por "Sa" + List listaPaises = iPaisDAO.obtenerListaPaisesAmericanosEmpiezanSa(); + System.out.println(listaPaises); + + // Actualizar pa铆s + Pais pais = iPaisDAO.obtenerPaisPorId(52); // Ejemplo: pa铆s con id 52 + System.out.println("Pais con id 52: " + pais); + pais.setCapital("Capital City II"); + iPaisDAO.actualizarPais(pais); + + } +} diff --git a/src/es/palomafp/aadd/inm/dao/IActorDAO.java b/src/es/palomafp/aadd/inm/dao/IActorDAO.java new file mode 100644 index 0000000..41268d8 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IActorDAO.java @@ -0,0 +1,15 @@ +package es.palomafp.aadd.inm.dao; + +import es.palomafp.aadd.inm.excepcion.CineException; + +/** +* +* IActrorDAO: Interfaz que representa las operaciones a realizar sobre Actor +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public interface IActorDAO { + int obtenerNumeroActoresPelicula(int idPelicula) throws CineException; +} diff --git a/src/es/palomafp/aadd/inm/dao/IContinenteDAO.java b/src/es/palomafp/aadd/inm/dao/IContinenteDAO.java new file mode 100644 index 0000000..4f9b6fb --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IContinenteDAO.java @@ -0,0 +1,20 @@ +package es.palomafp.aadd.inm.dao; + +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.vo.Continente; + +/** + * + * IContinenteDAO: Interfaz que representa las operaciones a realizar sobre + * Continente + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ + +public interface IContinenteDAO { + + public void crearContinente(Continente continente) throws CineException; + + public void borrarContinente(String codigoContinente) throws CineException; +} diff --git a/src/es/palomafp/aadd/inm/dao/IDirectorDAO.java b/src/es/palomafp/aadd/inm/dao/IDirectorDAO.java new file mode 100644 index 0000000..50acf5f --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IDirectorDAO.java @@ -0,0 +1,13 @@ +package es.palomafp.aadd.inm.dao; + +/** +* +* IDirectorDAO: Interfaz que representa las operaciones a realizar sobre Director +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public interface IDirectorDAO { + +} diff --git a/src/es/palomafp/aadd/inm/dao/IPaisDAO.java b/src/es/palomafp/aadd/inm/dao/IPaisDAO.java new file mode 100644 index 0000000..fcf23c8 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IPaisDAO.java @@ -0,0 +1,19 @@ +package es.palomafp.aadd.inm.dao; + +import java.util.List; + +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.vo.Pais; + +/** +* +* IPaisDAO: Interfaz que representa las operaciones a realizar sobre Pais +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ +public interface IPaisDAO { + Pais obtenerPaisPorId(int identificadorPais) throws CineException; + void actualizarPais(Pais pais) throws CineException; + List obtenerListaPaisesAmericanosEmpiezanSa()throws CineException; +} diff --git a/src/es/palomafp/aadd/inm/dao/IPeliculaDAO.java b/src/es/palomafp/aadd/inm/dao/IPeliculaDAO.java new file mode 100644 index 0000000..9c79682 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IPeliculaDAO.java @@ -0,0 +1,13 @@ +package es.palomafp.aadd.inm.dao; + +/** +* +* IDirectorDAO: Interfaz que representa las operaciones a realizar sobre Director +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public interface IPeliculaDAO { + +} diff --git a/src/es/palomafp/aadd/inm/dao/IRepartoDAO.java b/src/es/palomafp/aadd/inm/dao/IRepartoDAO.java new file mode 100644 index 0000000..ad39df4 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/IRepartoDAO.java @@ -0,0 +1,19 @@ +package es.palomafp.aadd.inm.dao; + +import java.util.List; + +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.vo.Reparto; + +/** +* +* IRepartoDAO: Interfaz que representa las operaciones a realizar sobre Reparto +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public interface IRepartoDAO { + List obtenerListaRepartoPeliculasNombreActorTerminaT() throws CineException; + List obtenerListaRepartoPeliculasNombreActorConPatron(String patron) throws CineException; +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/ActorDaoJDBC.java b/src/es/palomafp/aadd/inm/dao/impl/ActorDaoJDBC.java new file mode 100644 index 0000000..4aaa553 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/ActorDaoJDBC.java @@ -0,0 +1,42 @@ +package es.palomafp.aadd.inm.dao.impl; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.Types; + +import es.palomafp.aadd.inm.dao.IActorDAO; +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.gestor.GestorConexionJDBC; + +/** + * + * ActorDaoGeneral: Clase que representa la implementaci贸n de un Actor + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ + +public class ActorDaoJDBC implements IActorDAO { + + @Override + public int obtenerNumeroActoresPelicula(int idPelicula) throws CineException{ + int numeroActores = 0; + // try con recursos "cerrables": Connection, Statement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC(); + CallableStatement cstmt = conexion.prepareCall("{? = call obtenerNumeroActoresPelicula(?)}");) { + + // El par谩metro de salida y el de entrada + cstmt.registerOutParameter(1, Types.INTEGER); + cstmt.setInt(2, idPelicula); + + cstmt.execute(); + // Obtener el valor del par谩metro de salida + numeroActores= cstmt.getInt(1); + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_CONSULTA); + } + + return numeroActores; + } + +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/ContinenteDaoJAR.java b/src/es/palomafp/aadd/inm/dao/impl/ContinenteDaoJAR.java new file mode 100644 index 0000000..5b4fc6d --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/ContinenteDaoJAR.java @@ -0,0 +1,43 @@ +package es.palomafp.aadd.inm.dao.impl; + +import es.palomafp.aadd.inm.dao.IContinenteDAO; +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.vo.Continente; +import inm.mapamundi.inm.dao.IContinenteINMDAO; + +/** +* +* ContinenteDaoGeneral: Clase que representa la implementaci贸n de un Continente +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public class ContinenteDaoJAR implements IContinenteDAO { + + + @Override + public void crearContinente(Continente continente) throws CineException { + IContinenteINMDAO continenteINMDAO = new inm.mapamundi.dao.impl.ContinenteINMDaoJDBC(); + try { + // Informaci贸n del Continente + inm.mapamundi.vo.Continente continenteINM = new inm.mapamundi.vo.Continente(); + continenteINM.setCodigo(continente.getCodigo()); + continenteINM.setNombre(continente.getNombre()); + continenteINMDAO.anyadirContinente(continenteINM); + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_INSERCION); + } + } + + @Override + public void borrarContinente(String codigoContinente) throws CineException { + IContinenteINMDAO continenteINMDAO = new inm.mapamundi.dao.impl.ContinenteINMDaoJDBC(); + try { + continenteINMDAO.eliminarContinentePorCodigo(codigoContinente); + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_BORRADO); + } + } + +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/DirectorDaoGeneral.java b/src/es/palomafp/aadd/inm/dao/impl/DirectorDaoGeneral.java new file mode 100644 index 0000000..f87f8ad --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/DirectorDaoGeneral.java @@ -0,0 +1,15 @@ +package es.palomafp.aadd.inm.dao.impl; + +import es.palomafp.aadd.inm.dao.IDirectorDAO; + +/** +* +* DirectorDaoGeneral: Clase que representa la implementaci贸n de un Director +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public class DirectorDaoGeneral implements IDirectorDAO { + +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/PaisDaoJAR.java b/src/es/palomafp/aadd/inm/dao/impl/PaisDaoJAR.java new file mode 100644 index 0000000..b6fe091 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/PaisDaoJAR.java @@ -0,0 +1,100 @@ +package es.palomafp.aadd.inm.dao.impl; + +import java.util.List; + +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.vo.Continente; +import es.palomafp.aadd.inm.vo.Pais; +import inm.mapamundi.dao.impl.PaisINMDaoJDBC; +import inm.mapamundi.inm.dao.IPaisINMDAO; + +/** + * + * PaisDaoGeneral: Clase que representa la implementaci贸n de un Pais + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ + +public class PaisDaoJAR implements IPaisDAO { + + @Override + public Pais obtenerPaisPorId(int identificadorPais) throws CineException { + Pais pais = null; + IPaisINMDAO paisINMDAO = new PaisINMDaoJDBC(); + try { + inm.mapamundi.vo.Pais paisINM = paisINMDAO.obtenerPaisPorID(identificadorPais); + + if (paisINM != null) { + // Informaci贸n del Continente + Continente continente = new Continente(); + continente.setCodigo(paisINM.getContinente().getCodigo()); + continente.setNombre(paisINM.getContinente().getNombre()); + + // Informaci贸n del Pa铆s + pais = new Pais(); + pais.setIdentificador(identificadorPais); + pais.setNombre(paisINM.getNombre()); + pais.setCapital(paisINM.getCapital()); + + pais.setContinente(continente); + } + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_CONSULTA); + } + return pais; + } + + @Override + public void actualizarPais(Pais pais) throws CineException { + IPaisINMDAO paisINMDAO = new PaisINMDaoJDBC(); + try { + // Informaci贸n del Pa铆s + inm.mapamundi.vo.Pais paisINM = new inm.mapamundi.vo.Pais(); + paisINM.setIdentificador(pais.getIdentificador()); + paisINM.setNombre(pais.getNombre()); + paisINM.setCapital(pais.getCapital()); + // Informaci贸n del Continente + inm.mapamundi.vo.Continente continenteINM = new inm.mapamundi.vo.Continente(); + continenteINM.setCodigo(pais.getContinente().getCodigo()); + continenteINM.setNombre(pais.getContinente().getNombre()); + paisINM.setContinente(continenteINM); + + paisINMDAO.actualizarPais(paisINM); + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_ACTUALIZACION); + } + } + + @Override + public List obtenerListaPaisesAmericanosEmpiezanSa() throws CineException { + List listaPaises = null; + IPaisINMDAO paisINMDAO = new PaisINMDaoJDBC(); + try { + List listaPaisesINM = paisINMDAO.obtenerListaPaisesAmericanosEmpiezanSa(); + if (listaPaisesINM != null) { + listaPaises = new java.util.ArrayList(); + for (inm.mapamundi.vo.Pais paisINM : listaPaisesINM) { + // Informaci贸n del Continente + Continente continente = new Continente(); + continente.setCodigo(paisINM.getContinente().getCodigo()); + continente.setNombre(paisINM.getContinente().getNombre()); + + // Informaci贸n del Pa铆s + Pais pais = new Pais(); + pais.setIdentificador(paisINM.getIdentificador()); + pais.setNombre(paisINM.getNombre()); + pais.setCapital(paisINM.getCapital()); + pais.setContinente(continente); + + listaPaises.add(pais); + } + } + } catch (Exception e) { + throw new CineException(e, getClass(), CineException.ERROR_CONSULTA); + } + return listaPaises; + } + +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/PeliculaDaoGeneral.java b/src/es/palomafp/aadd/inm/dao/impl/PeliculaDaoGeneral.java new file mode 100644 index 0000000..b76e84c --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/PeliculaDaoGeneral.java @@ -0,0 +1,15 @@ +package es.palomafp.aadd.inm.dao.impl; + +import es.palomafp.aadd.inm.dao.IPeliculaDAO; + +/** +* +* PeliculaDaoGeneral: Clase que representa la implementaci贸n de un Pelicula +* +* @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma +* @date 2 oct 2025 +*/ + +public class PeliculaDaoGeneral implements IPeliculaDAO{ + +} diff --git a/src/es/palomafp/aadd/inm/dao/impl/RepartoDaoJDBC.java b/src/es/palomafp/aadd/inm/dao/impl/RepartoDaoJDBC.java new file mode 100644 index 0000000..5399637 --- /dev/null +++ b/src/es/palomafp/aadd/inm/dao/impl/RepartoDaoJDBC.java @@ -0,0 +1,155 @@ +package es.palomafp.aadd.inm.dao.impl; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.dao.IRepartoDAO; +import es.palomafp.aadd.inm.excepcion.CineException; +import es.palomafp.aadd.inm.gestor.GestorConexionJDBC; +import es.palomafp.aadd.inm.vo.Actor; +import es.palomafp.aadd.inm.vo.Director; +import es.palomafp.aadd.inm.vo.Pais; +import es.palomafp.aadd.inm.vo.Pelicula; +import es.palomafp.aadd.inm.vo.Reparto; + +/** + * + * RepartoDaoGeneral: Clase que representa la implementaci贸n de un Reparto con + * JDBC + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ + +public class RepartoDaoJDBC implements IRepartoDAO { + + @Override + public List obtenerListaRepartoPeliculasNombreActorTerminaT() throws CineException { + List listaReparto = null; + String sentenciaSQL = """ + select a.nombre as nombre_actor, a.id_pais as id_pais_actor, + p.titulo as titulo_pelicula, p.id_pais as id_pais_pelicula, + d.nombre as nombre_director, d.id_pais as id_pais_director, d.fecha_nacimiento as fecha_nacimiento_director + from reparto r join actor a + on r.id_actor =a.identificador + join pelicula p + on p.identificador =r.id_pelicula + join director d + on p.id_director = d.identificador + where p.identificador IN (SELECT re.id_pelicula + from reparto re join actor ac + on re.id_actor = ac.identificador + join pelicula pe + on re.id_pelicula = pe.identificador + where ac.nombre like '%t'); + """; + + // try con recursos "cerrables": Connection, Statement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC(); + PreparedStatement pstm = conexion.prepareStatement(sentenciaSQL); + ResultSet resultado = pstm.executeQuery();) { + listaReparto = new ArrayList(); + while (resultado.next()) { + IPaisDAO paisDAO = new PaisDaoJAR(); + // Informaci贸n del Actor + String nombreActor = resultado.getString("nombre_actor"); + int idPaisNacimientoActor = resultado.getInt("id_pais_actor"); + Pais paisNacimientoActor = paisDAO.obtenerPaisPorId(idPaisNacimientoActor); + Actor actor = new Actor(); + actor.setNombre(nombreActor); + actor.setPaisNacimiento(paisNacimientoActor); + + // Informaci贸n del Director + String nombreDirector = resultado.getString("nombre_director"); + int idPaisNacimientoDirector = resultado.getInt("id_pais_director"); + Pais paisNacimientoDirector = paisDAO.obtenerPaisPorId(idPaisNacimientoDirector); + Date fechaNacimientoDirector = resultado.getDate("fecha_nacimiento_director"); + Director director = new Director(); + director.setNombre(nombreDirector); + director.setPaisNacimiento(paisNacimientoDirector); + director.setFechaNacimiento(fechaNacimientoDirector); + + // Informaci贸n de la Pel铆cula + String tituloPelicula = resultado.getString("titulo_pelicula"); + int idPaisLocalizacionPelicula = resultado.getInt("id_pais_pelicula"); + Pais paisLocalizacionPelicula = paisDAO.obtenerPaisPorId(idPaisLocalizacionPelicula); + Pelicula pelicula = new Pelicula(); + pelicula.setTitulo(tituloPelicula); + pelicula.setPaisLocalizacion(paisLocalizacionPelicula); + pelicula.setDirector(director); + + // Completar los atributos de Reparto + Reparto reparto = new Reparto(); + reparto.setActor(actor); + reparto.setPelicula(pelicula); + + listaReparto.add(reparto); + } + } catch (SQLException e) { + throw new CineException(e, getClass(), CineException.ERROR_CONSULTA); + } + return listaReparto; + } + + @Override + public List obtenerListaRepartoPeliculasNombreActorConPatron(String patron) throws CineException{ + List listaReparto = null; + // try con recursos "cerrables": Connection, Statement, ResultSet + try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC(); + CallableStatement cstmt = conexion.prepareCall("{call obtenerRepartoPeliculasPorActor(?)}");) { + + // El par谩metro es el patr贸n por el que se va a buscar + cstmt.setString(1, patron); + ResultSet resultado = cstmt.executeQuery(); + + listaReparto = new ArrayList(); + while (resultado.next()) { + IPaisDAO paisDAO = new PaisDaoJAR(); + // Informaci贸n del Actor + String nombreActor = resultado.getString("nombre_actor"); + int idPaisNacimientoActor = resultado.getInt("id_pais_actor"); + Pais paisNacimientoActor = paisDAO.obtenerPaisPorId(idPaisNacimientoActor); + Actor actor = new Actor(); + actor.setNombre(nombreActor); + actor.setPaisNacimiento(paisNacimientoActor); + + // Informaci贸n del Director + String nombreDirector = resultado.getString("nombre_director"); + int idPaisNacimientoDirector = resultado.getInt("id_pais_director"); + Pais paisNacimientoDirector = paisDAO.obtenerPaisPorId(idPaisNacimientoDirector); + Date fechaNacimientoDirector = resultado.getDate("fecha_nacimiento_director"); + Director director = new Director(); + director.setNombre(nombreDirector); + director.setPaisNacimiento(paisNacimientoDirector); + director.setFechaNacimiento(fechaNacimientoDirector); + + // Informaci贸n de la Pel铆cula + String tituloPelicula = resultado.getString("titulo_pelicula"); + int idPaisLocalizacionPelicula = resultado.getInt("id_pais_pelicula"); + Pais paisLocalizacionPelicula = paisDAO.obtenerPaisPorId(idPaisLocalizacionPelicula); + Pelicula pelicula = new Pelicula(); + pelicula.setTitulo(tituloPelicula); + pelicula.setPaisLocalizacion(paisLocalizacionPelicula); + pelicula.setDirector(director); + + // Completar los atributos de Reparto + Reparto reparto = new Reparto(); + reparto.setActor(actor); + reparto.setPelicula(pelicula); + + listaReparto.add(reparto); + } + } catch (SQLException e) { + throw new CineException(e, getClass(), CineException.ERROR_CONSULTA); + } + return listaReparto; + } + +} diff --git a/src/es/palomafp/aadd/inm/excepcion/CineException.java b/src/es/palomafp/aadd/inm/excepcion/CineException.java new file mode 100644 index 0000000..102e6a6 --- /dev/null +++ b/src/es/palomafp/aadd/inm/excepcion/CineException.java @@ -0,0 +1,57 @@ +package es.palomafp.aadd.inm.excepcion; + +/** + * + * CineException: Clase que representa una excepci贸n gen茅rica del proyeto Cine + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 26 nov 2025 + * + * + */ + +public class CineException extends Exception { + /** + * + */ + private static final long serialVersionUID = -7090518753638026268L; + + private int codigoError; + private Class claseOrigen; + + 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 CineException() { + super(); + } + /** + * + */ + public CineException(Exception e, Class clase, int codError) { + super(e); + claseOrigen=clase; + codigoError=codError; + } + + + public Class getClaseOrigen() { + return claseOrigen; + } + public void setClaseOrigen(Class claseOrigen) { + this.claseOrigen = claseOrigen; + } + public int getCodigoError() { + return codigoError; + } + public void setCodigoError(int codigoError) { + this.codigoError = codigoError; + } + +} + diff --git a/src/es/palomafp/aadd/inm/gestor/GestorConexionJDBC.java b/src/es/palomafp/aadd/inm/gestor/GestorConexionJDBC.java new file mode 100644 index 0000000..46d2c5a --- /dev/null +++ b/src/es/palomafp/aadd/inm/gestor/GestorConexionJDBC.java @@ -0,0 +1,41 @@ +package es.palomafp.aadd.inm.gestor; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import es.palomafp.aadd.inm.excepcion.CineException; + +/** + * + * GestorConexionJDBC: Clase que realiza .... + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 6 nov 2025 + * + * + */ + +public class GestorConexionJDBC { + + // Constructor privado para evitar instanciaci贸n + private GestorConexionJDBC() { + } + + public static Connection obtenerConexionJDBC() throws CineException { + Connection conexion = null; + String driverJDBC= GestorFicheroConfiguracion.getValorDeConfiguracion("jdbc.driver"); + try { + Class.forName(driverJDBC); + + String urlJDBC= GestorFicheroConfiguracion.getValorDeConfiguracion("jdbc.url"); + String usuario= GestorFicheroConfiguracion.getValorDeConfiguracion("jdbc.usuario"); + String password= GestorFicheroConfiguracion.getValorDeConfiguracion("jdbc.password"); + + conexion=DriverManager.getConnection(urlJDBC, usuario, password); + } catch (ClassNotFoundException | SQLException e) { + throw new CineException(e, GestorConexionJDBC.class, CineException.ERROR_GESTION_CONEXION); + } + return conexion; + } +} + diff --git a/src/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java b/src/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java new file mode 100644 index 0000000..3a92bc9 --- /dev/null +++ b/src/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java @@ -0,0 +1,38 @@ +package es.palomafp.aadd.inm.gestor; + +import java.io.FileInputStream; +import java.util.Properties; + +/** + * + * GestorFicheroConfiguracion: Clase que se encarga de gestionar el fichero de configuraci贸n. + * + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class GestorFicheroConfiguracion { + private static final String RUTA_FICHERO_CONFIGURACION = "config/config.properties"; + private static Properties propiedades; + + private GestorFicheroConfiguracion() { + // Constructor privado para evitar instanciaci贸n + } + static { + propiedades= new Properties(); + try { + // Fichero que est谩 en el classpath + //propiedades.load(GestorFicheroConfiguracion.class.getClassLoader().getResourceAsStream(RUTA_FICHERO_CONFIGURACION)); + + // Fichero con ruta relativa al proyecto + propiedades.load(new FileInputStream(RUTA_FICHERO_CONFIGURACION)); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static String getValorDeConfiguracion(String clave) { + String valor = null; + valor = propiedades.getProperty(clave); + return valor; + } +} diff --git a/src/es/palomafp/aadd/inm/util/ConversorTiposDatosYFormatos.java b/src/es/palomafp/aadd/inm/util/ConversorTiposDatosYFormatos.java new file mode 100644 index 0000000..b6488a3 --- /dev/null +++ b/src/es/palomafp/aadd/inm/util/ConversorTiposDatosYFormatos.java @@ -0,0 +1,25 @@ +package es.palomafp.aadd.inm.util; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * + * 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 convertirDateAString(Date fecha, String formato) { + String fechaFormateada = null; + fechaFormateada= LocalDate.parse(fecha.toString()) + .format(DateTimeFormatter.ofPattern(formato)); + + return fechaFormateada; + } +} + diff --git a/src/es/palomafp/aadd/inm/vo/Actor.java b/src/es/palomafp/aadd/inm/vo/Actor.java new file mode 100644 index 0000000..59b2ae7 --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Actor.java @@ -0,0 +1,47 @@ +package es.palomafp.aadd.inm.vo; + +import java.util.Date; + +/** + * + * Actor: Clase que representa el contenido de un Actor + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Actor { + private int identificador; + private String nombre; + private Date fechaNacimiento; + private Pais paisNacimiento; + +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 Date getFechaNacimiento() { + return fechaNacimiento; + } + public void setFechaNacimiento(Date fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + } + public Pais getPaisNacimiento() { + return paisNacimiento; + } + public void setPaisNacimiento(Pais paisNacimiento) { + this.paisNacimiento = paisNacimiento; + } + @Override + public String toString() { + return "Actor [identificador=" + identificador + ", nombre=" + nombre + ", fechaNacimiento=" + fechaNacimiento + + ", paisNacimiento=" + paisNacimiento + "]"; + } +} diff --git a/src/es/palomafp/aadd/inm/vo/Continente.java b/src/es/palomafp/aadd/inm/vo/Continente.java new file mode 100644 index 0000000..121dedf --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Continente.java @@ -0,0 +1,31 @@ +package es.palomafp.aadd.inm.vo; + +/** + * + * Continente: Clase que representa el contenido de un Continente + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Continente { + private String codigo; + private String nombre; + + 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; + } + @Override + public String toString() { + return "Continente [codigo=" + codigo + ", nombre=" + nombre + "]"; + } + +} diff --git a/src/es/palomafp/aadd/inm/vo/Director.java b/src/es/palomafp/aadd/inm/vo/Director.java new file mode 100644 index 0000000..5b2d3d7 --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Director.java @@ -0,0 +1,47 @@ +package es.palomafp.aadd.inm.vo; + +import java.util.Date; + +/** + * + * Director: Clase que representa el contenido de un Director + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Director { + private int identificador; + private String nombre; + private Date fechaNacimiento; + private Pais paisNacimiento; + +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 Date getFechaNacimiento() { + return fechaNacimiento; + } + public void setFechaNacimiento(Date fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + } + public Pais getPaisNacimiento() { + return paisNacimiento; + } + public void setPaisNacimiento(Pais paisNacimiento) { + this.paisNacimiento = paisNacimiento; + } + @Override + public String toString() { + return "Actor [identificador=" + identificador + ", nombre=" + nombre + ", fechaNacimiento=" + fechaNacimiento + + ", paisNacimiento=" + paisNacimiento + "]"; + } +} diff --git a/src/es/palomafp/aadd/inm/vo/Pais.java b/src/es/palomafp/aadd/inm/vo/Pais.java new file mode 100644 index 0000000..cc91d86 --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Pais.java @@ -0,0 +1,44 @@ +package es.palomafp.aadd.inm.vo; + +/** + * + * Pais: Clase que representa el contenido de un Pais + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Pais { + private int identificador; + private String nombre; + private String capital; + private Continente continente; + 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 getCapital() { + return capital; + } + public void setCapital(String capital) { + this.capital = capital; + } + public Continente getContinente() { + return continente; + } + public void setContinente(Continente continente) { + this.continente = continente; + } + @Override + public String toString() { + return "Pais [identificador=" + identificador + ", nombre=" + nombre + ", capital=" + capital + ", continente=" + + continente + "]\n"; + } +} diff --git a/src/es/palomafp/aadd/inm/vo/Pelicula.java b/src/es/palomafp/aadd/inm/vo/Pelicula.java new file mode 100644 index 0000000..e00c6fd --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Pelicula.java @@ -0,0 +1,90 @@ +package es.palomafp.aadd.inm.vo; + +/** + * + * Pelicula: Clase que representa el contenido de un Pelicula + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Pelicula { + private int identificador; + private String titulo; + private int anyo; + private String idioma; + private boolean color; + private String observaciones; + private Director director; + private Pais paisLocalizacion; + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getTitulo() { + return titulo; + } + + public void setTitulo(String titulo) { + this.titulo = titulo; + } + + public int getAnyo() { + return anyo; + } + + public void setAnyo(int anyo) { + this.anyo = anyo; + } + + public String getIdioma() { + return idioma; + } + + public void setIdioma(String idioma) { + this.idioma = idioma; + } + + public boolean isColor() { + return color; + } + + public void setColor(boolean color) { + this.color = color; + } + + public String getObservaciones() { + return observaciones; + } + + public void setObservaciones(String observaciones) { + this.observaciones = observaciones; + } + + public Director getDirector() { + return director; + } + + public void setDirector(Director director) { + this.director = director; + } + + public Pais getPaisLocalizacion() { + return paisLocalizacion; + } + + public void setPaisLocalizacion(Pais paisLocalizacion) { + this.paisLocalizacion = paisLocalizacion; + } + + @Override + public String toString() { + return "Pelicula [identificador=" + identificador + ", titulo=" + titulo + ", anyo=" + anyo + ", idioma=" + + idioma + ", color=" + color + ", observaciones=" + observaciones + ", director=" + director + + ", paisLocalizacion=" + paisLocalizacion + "]"; + } +} diff --git a/src/es/palomafp/aadd/inm/vo/Reparto.java b/src/es/palomafp/aadd/inm/vo/Reparto.java new file mode 100644 index 0000000..f4b864f --- /dev/null +++ b/src/es/palomafp/aadd/inm/vo/Reparto.java @@ -0,0 +1,36 @@ +package es.palomafp.aadd.inm.vo; + +/** + * + * Reparto: Clase que representa el contenido de un Reparto + * + * @author Isidoro Nevares Mart铆n - IES Virgen de la Paloma + * @date 2 oct 2025 + */ +public class Reparto { + private String personaje; + private Actor actor; + private Pelicula pelicula; + public String getPersonaje() { + return personaje; + } + public void setPersonaje(String personaje) { + this.personaje = personaje; + } + public Actor getActor() { + return actor; + } + public void setActor(Actor actor) { + this.actor = actor; + } + public Pelicula getPelicula() { + return pelicula; + } + public void setPelicula(Pelicula pelicula) { + this.pelicula = pelicula; + } + @Override + public String toString() { + return "Reparto [personaje=" + personaje + ", actor=" + actor + ", pelicula=" + pelicula + "]"; + } +}