En el centro hay un pequeño “almacén” de material (portátiles, proyectores, etc.) que se presta a profesores. Se pide una aplicación Java de consola para registrar material, gestionar préstamos y trabajar con un CSV de materiales.
Importante: este repositorio no trae implementaciones de modelo/repos/servicios. Debes crearlas tú siguiendo el diagrama de clases y los requisitos.
- Haz FORK de este repositorio a tu cuenta.
- Crea un GitHub Project (tablero) en tu fork con columnas:
- Pendiente (To do)
- En proceso (In progress)
- En revisión (In review)
- Hecho (Done)
- Crea al menos 3 Issues (tareas) y colócalos en el Project. Ejemplos:
- Modelo (POO)
- Repositorios genéricos
- Servicios + reglas
- Excepciones
- Maven (dependencias + plugin exec)
- Tests (JUnit + Mockito)
- Integración CSV
- Debes trabajar con ramas
feature/*. - Cualquier cambio que quieras integrar en
maindebe entrar mediante una Pull Request (PR) (no se permite merge directo). - Cada PR debe quedar aprobada por ti (self-review) antes de hacer el merge.
- Cada PR debe:
- tener descripción breve de lo hecho
- enlazar un Issue (por ejemplo:
Closes #3)
El proyecto debe compilar con Java 21.
Debes añadir exactamente estas dependencias y versiones:
-
Apache Commons CSV
- groupId:
org.apache.commons - artifactId:
commons-csv - version:
1.14.1
- groupId:
-
JUnit Jupiter (JUnit 5)
- groupId:
org.junit.jupiter - artifactId:
junit-jupiter - version:
5.14.1 - scope:
test
- groupId:
-
Mockito JUnit Jupiter
- groupId:
org.mockito - artifactId:
mockito-junit-jupiter - version:
5.21.0 - scope:
test
- groupId:
-
El plugin
maven-surefire-plugin(tests) ya está configurado en este repositorio y no tienes que tocarlo. -
Debes configurar el plugin
exec-maven-pluginpara poder ejecutar conmvn exec:java:- groupId:
org.codehaus.mojo - artifactId:
exec-maven-plugin - version:
3.6.3 - configuración obligatoria:
<mainClass>es.fplumara.dam1.prestamos.app.Main</mainClass>
- groupId:
✅ Debe poder ejecutarse:
mvn clean testmvn exec:java
Debes organizar el código por capas usando estos paquetes:
es.fplumara.dam1.prestamos.appes.fplumara.dam1.prestamos.modeles.fplumara.dam1.prestamos.repositoryes.fplumara.dam1.prestamos.servicees.fplumara.dam1.prestamos.csves.fplumara.dam1.prestamos.exception
No se permite “todo en Main”.
Debes crear las clases/interfaces/enums indicadas en el diagrama de docs/diagrama-clases.md.
Requisitos mínimos:
- Una interface
IdentificableconString getId(). - Un enum
EstadoMaterial:DISPONIBLE,PRESTADO,BAJA. - Una clase abstracta
Material(congetTipo()abstracto). - Clases hijas:
Portatil(incluyeramGB)Proyector(incluyelumens)
Materialdebe tener unSet<String>deetiquetas(sin repetidos).- Clase
Prestamocon:id,idMaterial,profesor,fecha (LocalDate)
(El diagrama completo está en docs/diagrama-clases.md.)
Crea un repositorio genérico:
Repository<T extends Identificable>con:save(T)findById(String)→Optional<T>listAll()→List<T>delete(String)
Implementación:
BaseRepository<T extends Identificable>- debe usar internamente un
Map<String, T>
- debe usar internamente un
MaterialRepositoryImpl extends BaseRepository<Material>PrestamoRepositoryImpl extends BaseRepository<Prestamo>
En todos los métodos, cuando se indique “→ excepción”, debes lanzar una de las excepciones propias del apartado 3.5 (no vale
RuntimeExceptiongenérica).
Debes crear MaterialService con, al menos:
-
registrarMaterial(Material m)- Si ya existe un material con el mismo
id→DuplicadoException - Si
mesnulloidesnull/vacío →IllegalArgumentException
- Si ya existe un material con el mismo
-
darDeBaja(String idMaterial)- Si no existe el material →
NoEncontradoException - Si ya está en
BAJA→MaterialNoDisponibleException - Si existe y no está en BAJA: cambia estado a
BAJAy guarda el cambio
- Si no existe el material →
-
listar()- Devuelve
List<Material>con todos los materiales
- Devuelve
Debes crear PrestamoService con, al menos:
-
crearPrestamo(String idMaterial, String profesor, LocalDate fecha)- Si algún parámetro es
null/vacío (o fechanull) →IllegalArgumentException - Si no existe material con ese id →
NoEncontradoException - Si existe pero su estado no es
DISPONIBLE→MaterialNoDisponibleException - Si OK:
- crea un
Prestamo(id por ejemplo conUUID) - guarda el préstamo con
PrestamoRepository - cambia el estado del material a
PRESTADOy guarda el material actualizado
- crea un
- Si algún parámetro es
-
devolverMaterial(String idMaterial)- Si
idMaterialesnull/vacío →IllegalArgumentException - Si no existe material →
NoEncontradoException - Si existe pero su estado no es
PRESTADO→MaterialNoDisponibleException - Si OK: cambia estado a
DISPONIBLEy guarda el material actualizado
- Si
-
listarPrestamos()- Devuelve
List<Prestamo>con todos los préstamos
- Devuelve
Crea y usa estas excepciones (paquete ...exception):
DuplicadoExceptionNoEncontradoExceptionMaterialNoDisponibleExceptionCsvInvalidoException
Existe un archivo de ejemplo data/materiales.csv con formato:
tipo,id,nombre,estado,extra,etiquetas
PORTATIL,M001,Portátil Aula 1,DISPONIBLE,16,ofimatica|aula1
PROYECTOR,M010,Proyector Epson,DISPONIBLE,3200,video|salonEn el repositorio se proporcionan clases de utilidad en el paquete:
es.fplumara.dam1.prestamos.csv
Por ejemplo:
CsvMaterialImporterCsvMaterialExporterRegistroMaterialCsv(record/DTO)
Norma: estas clases están para usarlas, no para reescribir el parser.
- No debes modificar su lógica interna.
- Sí debes integrarlas en tu aplicación y entender qué devuelven.
Crea tests para PrestamoService usando Mockito con repositorios mockeados.
Mínimo 4 tests:
crearPrestamo_ok_cambiaEstado_y_guardacrearPrestamo_materialNoExiste_lanzaNoEncontradocrearPrestamo_materialNoDisponible_lanzaMaterialNoDisponibledevolverMaterial_ok_cambiaADisponible
Requisitos:
- usar
@ExtendWith(MockitoExtension.class) - mocks de repositorio(s)
- verificar interacciones con
verify(...)al menos en el caso OK
En app.Main demuestra un flujo simple (sin menú complejo):
- Importar materiales desde
data/materiales.csv(importer proporcionado) - Convertir/registrar materiales en el repositorio (usando
MaterialService) - Crear un préstamo
- Listar materiales y préstamos por consola
- Devolver material
- Exportar materiales a
data/salida_materiales.csv(exporter proporcionado)
- Fork + Project + Issues bien usados
- Ramas feature/* y trazabilidad con PRs
- Manejo y configuración de Maven
- Tests JUnit+Mockito con verify
- Modelo POO correcto (interface/abstract/enum/herencia/polimorfismo)
- Repositorios + Map + Optional + List/Set
- Servicios con reglas + excepciones bien aplicadas
- Creación y manejo de excepciones propias
- CSV integrado (lectura + conversión + exportación)