primer commit

This commit is contained in:
Isidoro Nevares Martín 2025-11-07 13:24:27 +01:00
commit 393a6ba394
20 changed files with 959 additions and 0 deletions

22
.classpath Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="config"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target/
*.class

23
.project Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>aadd_act2_4</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,12 @@
eclipse.preferences.version=1
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

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

14
config/conf.properties Normal file
View File

@ -0,0 +1,14 @@
# Información sobre Grado
grado.fichero.ruta=C:\\Users\\ineva\\INM\\tmp\\dam2\\aadd\\act17\\niveltitulacion.csv
grado.fichero.separador=#
# Parámetros de conexión a la base de datos 'formacion' en SGDB MySQL (tabla de familias profesionales)
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://192.168.1.36:3306/formacion
jdbc.usuario = root
jdbc.password = mysql_123
# Información sobre Ciclo Formativo
ciclo.fichero.ruta=C:\\Users\\ineva\\INM\\tmp\\dam2\\aadd\\act17\\informacion_titulaciones.txt
ciclo.fichero.separador=,

26
pom.xml Normal file
View File

@ -0,0 +1,26 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>aadd_act2_4</groupId>
<artifactId>aadd_act2_4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.5.0</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<release>24</release>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,82 @@
package es.palomafp.aadd.inm;
import java.util.List;
import es.palomafp.aadd.inm.dao.ICicloDAO;
import es.palomafp.aadd.inm.dao.IFamiliaProfesionalDAO;
import es.palomafp.aadd.inm.dao.impl.CicloDaoTXT;
import es.palomafp.aadd.inm.dao.impl.FamiliaProfesionalDaoJDBC;
import es.palomafp.aadd.inm.vo.Ciclo;
import es.palomafp.aadd.inm.vo.FamiliaProfesional;
/**
*
* GestorFormacion: Clase que se encarga de gestionar Formación (Familias,
* Grados y Ciclos)
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 2 oct 2025
*/
public class GestorFormacion {
public static void main(String[] args) {
String operacion = args[0]; // L: Listar, C: Consultar, I: Insertar, B: Borrar, M: Modificar
String parametro1 = args[1];
String parametro2 = args[2];
// Se declaran las variables como Interfaces y se construyen como
// implementaciones.
IFamiliaProfesionalDAO iFamiliaProfesionalDAO = new FamiliaProfesionalDaoJDBC();
switch (operacion) {
case "L":
List<FamiliaProfesional> listaFamilias = iFamiliaProfesionalDAO.obtenerListaFamiliasProfesionales();
System.out.println(listaFamilias);
break;
case "C": {
FamiliaProfesional familiaProfesional = iFamiliaProfesionalDAO.obtenerFamiliaProfesional(parametro1);
System.out.println(familiaProfesional);
break;
}
case "I": {
FamiliaProfesional familiaProfesional = iFamiliaProfesionalDAO.obtenerFamiliaProfesional(parametro1);
// Si el código existe en el fichero se lanza mensaje
if (familiaProfesional != null) {
System.out.println("El código de familia profesional ya existe.");
} else { // Inserción
familiaProfesional = new FamiliaProfesional();
familiaProfesional.setCodigo(parametro1);
familiaProfesional.setNombre(parametro2);
iFamiliaProfesionalDAO.insertarFamiliaProfesional(familiaProfesional);
}
break;
}
case "B": {
iFamiliaProfesionalDAO.eliminarFamiliaProfesional(parametro1);
break;
}
case "M": {
FamiliaProfesional familiaProfesional = iFamiliaProfesionalDAO.obtenerFamiliaProfesional(parametro1);
familiaProfesional.setCodigo(parametro1);
familiaProfesional.setNombre(parametro2);
iFamiliaProfesionalDAO.actualizarFamiliaProfesional(familiaProfesional);
break;
}
case "1": {
ICicloDAO iCicloDAO = new CicloDaoTXT();
List<Ciclo> listaCiclos = iCicloDAO.obtenerListaCiclosPorFamiliaGrado(parametro1, parametro2);
for (Ciclo ciclo : listaCiclos) {
String textoImprimir = "El ciclo %s incluido en la familia de %s es un %s de la categoría %s";
textoImprimir = String.format(textoImprimir, ciclo.getDescripcion(), ciclo.getFamilia().getNombre(),
ciclo.getGrado().getNombre(), ciclo.getGrado().getCategoria());
System.out.println(textoImprimir);
}
break;
}
}
}
}

View File

@ -0,0 +1,22 @@
package es.palomafp.aadd.inm.dao;
import java.util.List;
import es.palomafp.aadd.inm.vo.Ciclo;
/**
*
* ICicloDAO: Interfaz que contiene las operaciones a realizar sobre un Ciclo
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public interface ICicloDAO {
Ciclo obtenerCiclo(String codigoCiclo);
List<Ciclo> obtenerListaCiclosPorFamiliaGrado(String codigoFamilia, String codigoGrado);
}

View File

@ -0,0 +1,24 @@
package es.palomafp.aadd.inm.dao;
import java.util.List;
import es.palomafp.aadd.inm.vo.FamiliaProfesional;
/**
*
* IFamiliaProfesionalDAO: Interfaz que contiene las operaciones a realizar
* sobre una Familia Profesional.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public interface IFamiliaProfesionalDAO {
FamiliaProfesional obtenerFamiliaProfesional(String codigoFamilia);
List<FamiliaProfesional> obtenerListaFamiliasProfesionales();
void insertarFamiliaProfesional(FamiliaProfesional familiaProfesional);
void eliminarFamiliaProfesional(String codigoFamiliia);
void actualizarFamiliaProfesional(FamiliaProfesional familiaProfesional);
}

View File

@ -0,0 +1,17 @@
package es.palomafp.aadd.inm.dao;
import es.palomafp.aadd.inm.vo.Grado;
/**
*
* IGradoDAO: Interfaz que contiene las operaciones a realizar sobre un Grado.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public interface IGradoDAO {
Grado obtenerGrado(String codigoGrado);
}

View File

@ -0,0 +1,87 @@
package es.palomafp.aadd.inm.dao.impl;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import es.palomafp.aadd.inm.dao.ICicloDAO;
import es.palomafp.aadd.inm.dao.IFamiliaProfesionalDAO;
import es.palomafp.aadd.inm.dao.IGradoDAO;
import es.palomafp.aadd.inm.gestor.GestorFicheroConfiguracion;
import es.palomafp.aadd.inm.vo.Ciclo;
import es.palomafp.aadd.inm.vo.FamiliaProfesional;
import es.palomafp.aadd.inm.vo.Grado;
/**
*
* Ciclo: Clase que implementa las operaciones del interfaz ICicloDAO.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public class CicloDaoTXT implements ICicloDAO {
private final static String RUTA_FICHERO_CICLOS = GestorFicheroConfiguracion.getValorfromClave("ciclo.fichero.ruta");
private static final String DELIMITADOR = GestorFicheroConfiguracion.getValorfromClave("ciclo.fichero.separador");;
private Path pathFichero = Paths.get(RUTA_FICHERO_CICLOS);
@Override
public Ciclo obtenerCiclo(String codigoCiclo) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Ciclo> obtenerListaCiclosPorFamiliaGrado(String codigoFamilia, String codigoGrado) {
List<Ciclo> listaCiclos = null;
List<String> lineas;
try {
lineas = Files.readAllLines(pathFichero, StandardCharsets.UTF_8);
List<String> lineasSinCabecera = lineas.subList(1, lineas.size());
if (!lineasSinCabecera.isEmpty()) {
listaCiclos = new ArrayList<Ciclo>();
IGradoDAO iGradoDAO = new GradoDaoCSV();
IFamiliaProfesionalDAO iFamiliaProfesionalDAO = new FamiliaProfesionalDaoJDBC();
for (String linea : lineasSinCabecera) {
// Procesar información de Ciclo
String[] camposCiclo = linea.split(DELIMITADOR);
String codCiclo = camposCiclo[0].strip();
String nombreCiclo = camposCiclo[1].strip();
String numeroHoras = camposCiclo[2].strip();
String codFamilia = camposCiclo[3].strip();
String codGrado = camposCiclo[4].strip();
if ((codigoFamilia != null && codigoFamilia.equals(codFamilia))
&& (codigoGrado != null && codigoGrado.equals(codGrado))) {
Ciclo ciclo = new Ciclo();
FamiliaProfesional familiaProfesional = iFamiliaProfesionalDAO
.obtenerFamiliaProfesional(codigoFamilia);
Grado grado = iGradoDAO.obtenerGrado(codGrado);
ciclo.setCodigo(codCiclo);
ciclo.setDescripcion(nombreCiclo);
ciclo.setNumeroHoras(Integer.parseInt(numeroHoras));
ciclo.setFamilia(familiaProfesional);
ciclo.setGrado(grado);
listaCiclos.add(ciclo);
}
}
}
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_CICLOS);
e.printStackTrace();
}
return listaCiclos;
}
}

View File

@ -0,0 +1,197 @@
package es.palomafp.aadd.inm.dao.impl;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import es.palomafp.aadd.inm.dao.IFamiliaProfesionalDAO;
import es.palomafp.aadd.inm.gestor.GestorFicheroConfiguracion;
import es.palomafp.aadd.inm.vo.FamiliaProfesional;
/**
*
* FamiliaProfesionalDao: Clase que implementa las operaciones del interfaz
* IFamiliaProfesionalDAO.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public class FamiliaProfesionalDaoCSV implements IFamiliaProfesionalDAO {
private final static String RUTA_FICHERO_FAMILIAS_PROFESIONALES =GestorFicheroConfiguracion.getValorfromClave("familiaprofesional.fichero.ruta");
private final static String RUTA_FICHERO_TMP_FAMILIAS_PROFESIONALES = GestorFicheroConfiguracion.getValorfromClave("familiaprofesional.ficherotmp.ruta");
private static final String DELIMITADOR = GestorFicheroConfiguracion.getValorfromClave("familiaprofesional.fichero.separador");;
private Path pathFichero = Paths.get(RUTA_FICHERO_FAMILIAS_PROFESIONALES);
private Path pathFicheroTMP = Paths.get(RUTA_FICHERO_TMP_FAMILIAS_PROFESIONALES);
@Override
public FamiliaProfesional obtenerFamiliaProfesional(String codigoFamilia) {
FamiliaProfesional familiaProfesional = null;
List<String> lineas;
try {
lineas = Files.readAllLines(pathFichero, StandardCharsets.UTF_8);
List<String> lineasSinCabecera = lineas.subList(1, lineas.size());
for (String linea : lineasSinCabecera) {
// Procesar información de la Familia Profesional
String[] camposFamilia = linea.split(DELIMITADOR);
String codFamilia = camposFamilia[0].trim();
String nombreFamilia = camposFamilia[1].trim();
if (codigoFamilia != null && codigoFamilia.equals(codFamilia)) {
familiaProfesional = new FamiliaProfesional();
familiaProfesional.setCodigo(codFamilia);
familiaProfesional.setNombre(nombreFamilia);
break;
}
}
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_FAMILIAS_PROFESIONALES);
e.printStackTrace();
}
return familiaProfesional;
}
@Override
public List<FamiliaProfesional> obtenerListaFamiliasProfesionales() {
List<FamiliaProfesional> listaFamilias = null;
List<String> lineas;
try {
lineas = Files.readAllLines(pathFichero, StandardCharsets.UTF_8);
List<String> lineasSinCabecera = lineas.subList(1, lineas.size());
if (!lineasSinCabecera.isEmpty()) {
listaFamilias = new ArrayList<>();
for (String linea : lineasSinCabecera) {
// Procesar información de la Familia Profesional
String[] camposFamilia = linea.split(DELIMITADOR);
String codFamilia = camposFamilia[0].trim();
String nombreFamilia = camposFamilia[1].trim();
FamiliaProfesional familiaProfesional = new FamiliaProfesional();
familiaProfesional.setCodigo(codFamilia);
familiaProfesional.setNombre(nombreFamilia);
// System.out.println("familiaProfesional: " + familiaProfesional);
listaFamilias.add(familiaProfesional);
}
}
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_FAMILIAS_PROFESIONALES);
e.printStackTrace();
}
return listaFamilias;
}
/**
* Inserta una nueva familia profesional en el fichero CSV.
*
* @param familiaProfesional Familia profesional a insertar.
*/
public void insertarFamiliaProfesional(FamiliaProfesional familiaProfesional) {
String nuevaFamilia = String.format("%s%s%s\n", familiaProfesional.getCodigo(),DELIMITADOR, familiaProfesional.getNombre());
try {
Files.writeString(pathFichero, nuevaFamilia, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_FAMILIAS_PROFESIONALES);
e.printStackTrace();
}
}
/**
* Elimina una familia profesional del fichero CSV.
*
* @param codigoFamilia Código de la familia profesional a eliminar.
*/
public void eliminarFamiliaProfesional(String codigoFamilia) {
List<FamiliaProfesional> listaFamilias = obtenerListaFamiliasProfesionales();
if (listaFamilias != null) {
listaFamilias.removeIf(familiaProfesional -> familiaProfesional.getCodigo().equals(codigoFamilia));
insertarFamiliasProfesionalesFichero(listaFamilias);
}
}
/**
* Actualiza el nombre de una familia profesional.
*
* @param familiaProfesional Familia profesional con el código y el nuevo
* nombre.
*/
public void actualizarFamiliaProfesional(FamiliaProfesional familiaProfesional) {
List<FamiliaProfesional> listaFamilias = obtenerListaFamiliasProfesionales();
// Se cambia el valor del nombre de la familia.
for (FamiliaProfesional familiaProf : listaFamilias) {
if (familiaProf.getCodigo().equals(familiaProfesional.getCodigo())) {
familiaProf.setNombre(familiaProfesional.getNombre());
}
}
insertarFamiliasProfesionalesFichero(listaFamilias);
}
/**
* Inserta la lista de familias profesionales en el fichero CSV. Para ello
* primero crea un fichero temporal y luego renombra el fichero temporal al
* original.
*
* @param listaFamilias Lista de familias profesionales a insertar.
*/
private void insertarFamiliasProfesionalesFichero(List<FamiliaProfesional> listaFamilias) {
try {
String cabecera = String.format("codigo_familia|nombre_familia\n");
Files.writeString(pathFicheroTMP, cabecera, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
for (FamiliaProfesional familiaProfesional : listaFamilias) {
String nuevaFamilia = String.format("%s%s%s\n", familiaProfesional.getCodigo(), DELIMITADOR,
familiaProfesional.getNombre());
Files.writeString(pathFicheroTMP, nuevaFamilia, StandardOpenOption.APPEND);
}
// Se elimina el fichero original y se renombra el temporal
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_TMP_FAMILIAS_PROFESIONALES);
e.printStackTrace();
}
// Se elimina el fichero original y se renombra el temporal
organizarFicheros();
}
private void organizarFicheros() {
try {
// Borrado del fichero original
Files.deleteIfExists(pathFichero);
// Renombrado del fichero temporal
Files.move(pathFicheroTMP, pathFichero, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("Error al renombrar el fichero: " + RUTA_FICHERO_TMP_FAMILIAS_PROFESIONALES);
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,130 @@
package es.palomafp.aadd.inm.dao.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import es.palomafp.aadd.inm.dao.IFamiliaProfesionalDAO;
import es.palomafp.aadd.inm.gestor.GestorConexionJDBC;
import es.palomafp.aadd.inm.vo.FamiliaProfesional;
/**
*
* FamiliaProfesionalDaoJDBC: Clase que implementa las operaciones del interfaz
* IFamiliaProfesionalDAO usando JDBC.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 7 nov 2025
*
*
*/
public class FamiliaProfesionalDaoJDBC implements IFamiliaProfesionalDAO {
@Override
public FamiliaProfesional obtenerFamiliaProfesional(String codigoFamilia) {
FamiliaProfesional familiaProfesional = null;
String sentenciaSQL = "SELECT * FROM T_FAMILIA_PROFESIONAL WHERE codigo = '%s'";
sentenciaSQL = String.format(sentenciaSQL, codigoFamilia);
try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC();
Statement statement = conexion.createStatement();
ResultSet resultado = statement.executeQuery(sentenciaSQL);) {
if (resultado.next()) {
String codigo = resultado.getString("codigo");
String nombre = resultado.getString("nombre");
String urlImagenLogo = resultado.getString("url_img_logo");
familiaProfesional = new FamiliaProfesional();
familiaProfesional.setCodigo(codigo);
familiaProfesional.setNombre(nombre);
familiaProfesional.setUrlImageLogo(urlImagenLogo);
}
} catch (SQLException e) {
e.printStackTrace();
}
return familiaProfesional;
}
@Override
public List<FamiliaProfesional> obtenerListaFamiliasProfesionales() {
List<FamiliaProfesional> listaFamiliasProfesionales = null;
String sentenciaSQL = "SELECT * FROM T_FAMILIA_PROFESIONAL";
try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC();
Statement statement = conexion.createStatement();
ResultSet resultado = statement.executeQuery(sentenciaSQL);) {
listaFamiliasProfesionales = new java.util.ArrayList<FamiliaProfesional>();
while (resultado.next()) {
String codigo = resultado.getString("codigo");
String nombre = resultado.getString("nombre");
String urlImagenLogo = resultado.getString("url_img_logo");
FamiliaProfesional familiaProfesional = new FamiliaProfesional();
familiaProfesional.setCodigo(codigo);
familiaProfesional.setNombre(nombre);
familiaProfesional.setUrlImageLogo(urlImagenLogo);
listaFamiliasProfesionales.add(familiaProfesional);
}
} catch (SQLException e) {
e.printStackTrace();
}
return listaFamiliasProfesionales;
}
@Override
public void insertarFamiliaProfesional(FamiliaProfesional familiaProfesional) {
String sentenciaSQL = "INSERT INTO T_FAMILIA_PROFESIONAL values ('%s', '%s', %s)";
String urlImageLogo = (familiaProfesional.getUrlImageLogo()!=null)?("'" + familiaProfesional.getUrlImageLogo() + "'"):"NULL";
sentenciaSQL = String.format(sentenciaSQL, familiaProfesional.getCodigo(), familiaProfesional.getNombre(), urlImageLogo);
// System.out.println(sentenciaSQL);
// try con recursos "cerrables": Connection, Statement
try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC();
Statement stm = conexion.createStatement();) {
stm.executeUpdate(sentenciaSQL);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void eliminarFamiliaProfesional(String codigoFamilia) {
String sentenciaSQL = "DELETE FROM T_FAMILIA_PROFESIONAL WHERE codigo='%s'";
sentenciaSQL = String.format(sentenciaSQL, codigoFamilia);
// System.out.println(sentenciaSQL);
// try con recursos "cerrables": Connection, Statement
try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC();
Statement stm = conexion.createStatement();) {
stm.executeUpdate(sentenciaSQL);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void actualizarFamiliaProfesional(FamiliaProfesional familiaProfesional) {
String sentenciaSQL = "UPDATE T_FAMILIA_PROFESIONAL set nombre= '%s', url_img_logo='%s' WHERE codigo='%s'";
sentenciaSQL = String.format(sentenciaSQL, familiaProfesional.getNombre(), familiaProfesional.getUrlImageLogo(),
familiaProfesional.getCodigo());
// System.out.println(sentenciaSQL);
// try con recursos "cerrables": Connection, Statement
try (Connection conexion = GestorConexionJDBC.obtenerConexionJDBC();
Statement stm = conexion.createStatement();) {
stm.executeUpdate(sentenciaSQL);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,63 @@
package es.palomafp.aadd.inm.dao.impl;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import es.palomafp.aadd.inm.dao.IGradoDAO;
import es.palomafp.aadd.inm.gestor.GestorFicheroConfiguracion;
import es.palomafp.aadd.inm.vo.Grado;
/**
*
* GradoDao: Clase que implementa las operaciones del interfaz IGradoDAO.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public class GradoDaoCSV implements IGradoDAO {
private final static String RUTA_FICHERO_GRADOS = GestorFicheroConfiguracion.getValorfromClave("grado.fichero.ruta");
private static final String DELIMITADOR = GestorFicheroConfiguracion.getValorfromClave("grado.fichero.separador");;
private Path pathFichero = Paths.get(RUTA_FICHERO_GRADOS);
@Override
public Grado obtenerGrado(String codigoGrado) {
Grado grado = null;
List<String> lineas;
try {
lineas = Files.readAllLines(pathFichero, StandardCharsets.UTF_8);
List<String> lineasSinCabecera = lineas.subList(1, lineas.size());
for (String linea : lineasSinCabecera) {
// Procesar información de un Grado
String[] camposGrado = linea.split(DELIMITADOR);
String codGrado = camposGrado[0].strip();
String descripcionGrado = camposGrado[1].strip();
String categoriaGrado = camposGrado[2].strip();
if (codigoGrado != null && codigoGrado.equals(codGrado)) {
grado = new Grado();
grado.setCodigo(codGrado);
grado.setNombre(descripcionGrado);
grado.setCategoria(categoriaGrado);
break;
}
}
} catch (IOException e) {
System.err.println("Error al leer el fichero: " + RUTA_FICHERO_GRADOS);
e.printStackTrace();
}
return grado;
}
}

View File

@ -0,0 +1,39 @@
package es.palomafp.aadd.inm.gestor;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
*
* GestorConexionJDBC: Clase que realiza la gestión de la conexión JDBC.
* @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() {
Connection conexion = null;
String driverJDBC= GestorFicheroConfiguracion.getValorfromClave("jdbc.driver");
try {
Class.forName(driverJDBC);
String urlJDBC= GestorFicheroConfiguracion.getValorfromClave("jdbc.url");
String usuario= GestorFicheroConfiguracion.getValorfromClave("jdbc.usuario");
String password= GestorFicheroConfiguracion.getValorfromClave("jdbc.password");
conexion=DriverManager.getConnection(urlJDBC, usuario, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return conexion;
}
}

View File

@ -0,0 +1,44 @@
package es.palomafp.aadd.inm.gestor;
import java.io.IOException;
import java.util.Properties;
/**
*
* GestorConfiguracion: Clase que se encarga de gestionar la configuración de
* los ficheros.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 10 oct 2025
*
*
*/
public class GestorFicheroConfiguracion {
private final static String RUTA_FICHERO_CONFIGURACION = "conf.properties";
private static Properties propiedades = null;
private GestorFicheroConfiguracion() {
// Constructor privado para evitar instanciación
}
// Bloque estático que se ejecuta una única vez al cargar la clase
static {
cargarPropiedadesFichero();
}
private static void cargarPropiedadesFichero() {
propiedades = new Properties();
try {
propiedades
.load(GestorFicheroConfiguracion.class.getClassLoader().getResourceAsStream(RUTA_FICHERO_CONFIGURACION));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String getValorfromClave(String clave) {
return propiedades.getProperty(clave);
}
}

View File

@ -0,0 +1,66 @@
package es.palomafp.aadd.inm.vo;
/**
*
* Ciclo: Clase que representa el contenido de un Ciclo Formativo
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public class Ciclo {
private String codigo;
private String descripcion;
private int numeroHoras;
private FamiliaProfesional familia;
private Grado grado;
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public int getNumeroHoras() {
return numeroHoras;
}
public void setNumeroHoras(int numeroHoras) {
this.numeroHoras = numeroHoras;
}
public FamiliaProfesional getFamilia() {
return familia;
}
public void setFamilia(FamiliaProfesional familia) {
this.familia = familia;
}
public Grado getGrado() {
return grado;
}
public void setGrado(Grado grado) {
this.grado = grado;
}
@Override
public String toString() {
return "Ciclo [codigo=" + codigo + ", descripcion=" + descripcion + ", numeroHoras=" + numeroHoras
+ ", familia=" + familia + ", grado=" + grado + "]";
}
}

View File

@ -0,0 +1,47 @@
package es.palomafp.aadd.inm.vo;
/**
*
* FamiliaProfesional: Clase que representa el contenido de una Familia
* Profesional
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 3 oct 2025
*
*
*/
public class FamiliaProfesional {
private String codigo;
private String nombre;
private String urlImageLogo;
public String getUrlImageLogo() {
return urlImageLogo;
}
public void setUrlImageLogo(String urlImageLogo) {
this.urlImageLogo = urlImageLogo;
}
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 "FamiliaProfesional [codigo=" + codigo + ", nombre=" + nombre + ", urlImageLogo=" + urlImageLogo + "]\n";
}
}

View File

@ -0,0 +1,38 @@
package es.palomafp.aadd.inm.vo;
/**
*
* Grado: Clase que representa el contenido de un Grado
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 2 oct 2025
*/
public class Grado {
private String codigo;
private String nombre;
private String categoria;
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 getCategoria() {
return categoria;
}
public void setCategoria(String categoria) {
this.categoria = categoria;
}
@Override
public String toString() {
return "Grado [codigo=" + codigo + ", nombre=" + nombre + ", categoria=" + categoria + "]";
}
}