From bf30647d9c3eef4ef9241742514f27a437ace79a Mon Sep 17 00:00:00 2001 From: Saamu844 Date: Wed, 17 Jun 2026 09:14:15 +0200 Subject: [PATCH 1/2] Desacoplar e inyecciones --- pom.xml | 11 ++ .../biblioteca/interfaz/MenuPrincipal.java | 14 ++- .../org/biblioteca/negocio/GestionLibros.java | 39 +----- .../biblioteca/negocio/GestionLibrosImpl.java | 53 ++++++++ .../biblioteca/negocio/GestionPrestamos.java | 80 +----------- .../negocio/GestionPrestamosImpl.java | 90 +++++++++++++ .../org/biblioteca/negocio/GestionSocios.java | 35 +----- .../biblioteca/negocio/GestionSociosImpl.java | 48 +++++++ .../biblioteca/repositorio/AlmacenLibros.java | 103 ++------------- .../repositorio/AlmacenLibrosImpl.java | 118 ++++++++++++++++++ .../repositorio/AlmacenPrestamos.java | 103 ++------------- .../repositorio/AlmacenPrestamosImpl.java | 118 ++++++++++++++++++ .../biblioteca/repositorio/AlmacenSocios.java | 92 ++------------ .../repositorio/AlmacenSociosImpl.java | 106 ++++++++++++++++ 14 files changed, 591 insertions(+), 419 deletions(-) create mode 100644 src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java create mode 100644 src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java create mode 100644 src/main/java/org/biblioteca/negocio/GestionSociosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java diff --git a/pom.xml b/pom.xml index 1d9a8cf..b02af09 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,17 @@ gson 2.10.1 + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.jboss.weld.se + weld-se-core + 5.1.6.Final + diff --git a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java index c5fa648..84980de 100644 --- a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java +++ b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java @@ -3,9 +3,8 @@ import org.biblioteca.entidades.Libro; import org.biblioteca.entidades.Prestamo; import org.biblioteca.entidades.Socio; -import org.biblioteca.negocio.GestionLibros; -import org.biblioteca.negocio.GestionPrestamos; -import org.biblioteca.negocio.GestionSocios; +import org.biblioteca.negocio.*; +import org.biblioteca.repositorio.*; import java.time.LocalDate; import java.util.List; @@ -17,12 +16,15 @@ public class MenuPrincipal { private final GestionLibros gestionLibros; private final GestionSocios gestionSocios; private final GestionPrestamos gestionPrestamos; + private final AlmacenLibros almacenLibros = new AlmacenLibrosImpl(); + private final AlmacenPrestamos almacenPrestamos = new AlmacenPrestamosImpl(); + private final AlmacenSocios almacenSocios = new AlmacenSociosImpl(); public MenuPrincipal(Scanner lector) { this.lector = lector; - this.gestionLibros = new GestionLibros(); - this.gestionSocios = new GestionSocios(); - this.gestionPrestamos = new GestionPrestamos(); + this.gestionLibros = new GestionLibrosImpl(almacenLibros); + this.gestionSocios = new GestionSociosImpl(almacenSocios); + this.gestionPrestamos = new GestionPrestamosImpl(almacenPrestamos, almacenLibros, almacenSocios); } public void mostrarMenuLibros() { diff --git a/src/main/java/org/biblioteca/negocio/GestionLibros.java b/src/main/java/org/biblioteca/negocio/GestionLibros.java index a45419f..823be30 100644 --- a/src/main/java/org/biblioteca/negocio/GestionLibros.java +++ b/src/main/java/org/biblioteca/negocio/GestionLibros.java @@ -1,45 +1,18 @@ package org.biblioteca.negocio; import org.biblioteca.entidades.Libro; -import org.biblioteca.repositorio.AlmacenLibros; import java.util.List; import java.util.Optional; -public class GestionLibros { - private final AlmacenLibros almacen; +public interface GestionLibros { + List listarLibros(); - public GestionLibros() { - this.almacen = new AlmacenLibros(); - } + Optional buscarLibro(String isbn); - public List listarLibros() { - return almacen.consultarTodos(); - } + boolean añadirLibro(Libro libro); - public Optional buscarLibro(String isbn) { - return almacen.consultarPorIsbn(isbn); - } + boolean eliminarLibro(String isbn); - public boolean añadirLibro(Libro libro) { - if (libro.getIsbn() == null || libro.getIsbn().isBlank()) { - return false; - } - if (libro.getTitulo() == null || libro.getTitulo().isBlank()) { - return false; - } - if (libro.getEjemplaresTotales() <= 0) { - return false; - } - return almacen.guardar(libro); - } - - public boolean eliminarLibro(String isbn) { - return almacen.borrar(isbn); - } - - public void modificarLibro(Libro libro) { - almacen.actualizar(libro); - } + void modificarLibro(Libro libro); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java b/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java new file mode 100644 index 0000000..84f0bd1 --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java @@ -0,0 +1,53 @@ +package org.biblioteca.negocio; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Libro; +import org.biblioteca.repositorio.AlmacenLibros; +import org.biblioteca.repositorio.AlmacenLibrosImpl; + +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class GestionLibrosImpl implements GestionLibros { + private final AlmacenLibros almacen; + @Inject + public GestionLibrosImpl(AlmacenLibros almacen) { + this.almacen = almacen; + } + + @Override + public List listarLibros() { + return almacen.consultarTodos(); + } + + @Override + public Optional buscarLibro(String isbn) { + return almacen.consultarPorIsbn(isbn); + } + + @Override + public boolean añadirLibro(Libro libro) { + if (libro.getIsbn() == null || libro.getIsbn().isBlank()) { + return false; + } + if (libro.getTitulo() == null || libro.getTitulo().isBlank()) { + return false; + } + if (libro.getEjemplaresTotales() <= 0) { + return false; + } + return almacen.guardar(libro); + } + + @Override + public boolean eliminarLibro(String isbn) { + return almacen.borrar(isbn); + } + + @Override + public void modificarLibro(Libro libro) { + almacen.actualizar(libro); + } +} + diff --git a/src/main/java/org/biblioteca/negocio/GestionPrestamos.java b/src/main/java/org/biblioteca/negocio/GestionPrestamos.java index 45dd943..8259c12 100644 --- a/src/main/java/org/biblioteca/negocio/GestionPrestamos.java +++ b/src/main/java/org/biblioteca/negocio/GestionPrestamos.java @@ -1,86 +1,16 @@ package org.biblioteca.negocio; -import org.biblioteca.entidades.Libro; import org.biblioteca.entidades.Prestamo; -import org.biblioteca.entidades.Socio; -import org.biblioteca.repositorio.AlmacenLibros; -import org.biblioteca.repositorio.AlmacenPrestamos; -import org.biblioteca.repositorio.AlmacenSocios; -import java.time.LocalDate; import java.util.List; import java.util.Optional; -public class GestionPrestamos { - private final AlmacenPrestamos almacenPrestamos; - private final AlmacenLibros almacenLibros; - private final AlmacenSocios almacenSocios; +public interface GestionPrestamos { + List listarPrestamos(); - public GestionPrestamos() { - this.almacenPrestamos = new AlmacenPrestamos(); - this.almacenLibros = new AlmacenLibros(); - this.almacenSocios = new AlmacenSocios(); - } + Optional buscarPrestamo(String identificador); - public List listarPrestamos() { - return almacenPrestamos.consultarTodos(); - } + boolean realizarPrestamo(Prestamo prestamo); - public Optional buscarPrestamo(String identificador) { - return almacenPrestamos.consultarPorId(identificador); - } - - public boolean realizarPrestamo(Prestamo prestamo) { - if (prestamo.getIdentificador() == null || prestamo.getIdentificador().isBlank()) { - return false; - } - - Optional socioOpt = almacenSocios.consultarPorNumero(prestamo.getNumeroSocio()); - if (socioOpt.isEmpty()) { - return false; - } - - Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); - if (libroOpt.isEmpty()) { - return false; - } - - Libro libro = libroOpt.get(); - if (!libro.hayDisponibilidad()) { - return false; - } - - int disponibles = libro.getEjemplaresDisponibles() - 1; - libro.setEjemplaresDisponibles(disponibles); - almacenLibros.actualizar(libro); - - return almacenPrestamos.guardar(prestamo); - } - - public boolean devolverLibro(String identificador) { - Optional prestamoOpt = almacenPrestamos.consultarPorId(identificador); - if (prestamoOpt.isEmpty()) { - return false; - } - - Prestamo prestamo = prestamoOpt.get(); - if (!prestamo.isActivo()) { - return false; - } - - prestamo.setActivo(false); - prestamo.setFechaDevolucionReal(LocalDate.now()); - almacenPrestamos.actualizar(prestamo); - - Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); - if (libroOpt.isPresent()) { - Libro libro = libroOpt.get(); - int disponibles = libro.getEjemplaresDisponibles() + 1; - libro.setEjemplaresDisponibles(disponibles); - almacenLibros.actualizar(libro); - } - - return true; - } + boolean devolverLibro(String identificador); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java b/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java new file mode 100644 index 0000000..f951d9e --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java @@ -0,0 +1,90 @@ +package org.biblioteca.negocio; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Libro; +import org.biblioteca.entidades.Prestamo; +import org.biblioteca.entidades.Socio; +import org.biblioteca.repositorio.*; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class GestionPrestamosImpl implements GestionPrestamos { + private final AlmacenPrestamos almacenPrestamos; + private final AlmacenLibros almacenLibros; + private final AlmacenSocios almacenSocios; + @Inject + public GestionPrestamosImpl(AlmacenPrestamos almacenPrestamos, AlmacenLibros almacenLibros, AlmacenSocios almacenSocios) { + this.almacenPrestamos = almacenPrestamos; + this.almacenLibros = almacenLibros; + this.almacenSocios = almacenSocios; + } + + @Override + public List listarPrestamos() { + return almacenPrestamos.consultarTodos(); + } + + @Override + public Optional buscarPrestamo(String identificador) { + return almacenPrestamos.consultarPorId(identificador); + } + + @Override + public boolean realizarPrestamo(Prestamo prestamo) { + if (prestamo.getIdentificador() == null || prestamo.getIdentificador().isBlank()) { + return false; + } + + Optional socioOpt = almacenSocios.consultarPorNumero(prestamo.getNumeroSocio()); + if (socioOpt.isEmpty()) { + return false; + } + + Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); + if (libroOpt.isEmpty()) { + return false; + } + + Libro libro = libroOpt.get(); + if (!libro.hayDisponibilidad()) { + return false; + } + + int disponibles = libro.getEjemplaresDisponibles() - 1; + libro.setEjemplaresDisponibles(disponibles); + almacenLibros.actualizar(libro); + + return almacenPrestamos.guardar(prestamo); + } + + @Override + public boolean devolverLibro(String identificador) { + Optional prestamoOpt = almacenPrestamos.consultarPorId(identificador); + if (prestamoOpt.isEmpty()) { + return false; + } + + Prestamo prestamo = prestamoOpt.get(); + if (!prestamo.isActivo()) { + return false; + } + + prestamo.setActivo(false); + prestamo.setFechaDevolucionReal(LocalDate.now()); + almacenPrestamos.actualizar(prestamo); + + Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); + if (libroOpt.isPresent()) { + Libro libro = libroOpt.get(); + int disponibles = libro.getEjemplaresDisponibles() + 1; + libro.setEjemplaresDisponibles(disponibles); + almacenLibros.actualizar(libro); + } + + return true; + } +} + diff --git a/src/main/java/org/biblioteca/negocio/GestionSocios.java b/src/main/java/org/biblioteca/negocio/GestionSocios.java index ec9431e..e3cad99 100644 --- a/src/main/java/org/biblioteca/negocio/GestionSocios.java +++ b/src/main/java/org/biblioteca/negocio/GestionSocios.java @@ -1,41 +1,16 @@ package org.biblioteca.negocio; import org.biblioteca.entidades.Socio; -import org.biblioteca.repositorio.AlmacenSocios; import java.util.List; import java.util.Optional; -public class GestionSocios { - private final AlmacenSocios almacen; +public interface GestionSocios { + List listarSocios(); - public GestionSocios() { - this.almacen = new AlmacenSocios(); - } + Optional buscarSocio(String numeroSocio); - public List listarSocios() { - return almacen.consultarTodos(); - } + boolean registrarSocio(Socio socio); - public Optional buscarSocio(String numeroSocio) { - return almacen.consultarPorNumero(numeroSocio); - } - - public boolean registrarSocio(Socio socio) { - if (socio.getNumeroSocio() == null || socio.getNumeroSocio().isBlank()) { - return false; - } - if (socio.getApellidos() == null || socio.getApellidos().isBlank()) { - return false; - } - if (socio.getNombre() == null || socio.getNombre().isBlank()) { - return false; - } - return almacen.guardar(socio); - } - - public boolean darDeBajaSocio(String numeroSocio) { - return almacen.borrar(numeroSocio); - } + boolean darDeBajaSocio(String numeroSocio); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java b/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java new file mode 100644 index 0000000..1de71e4 --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java @@ -0,0 +1,48 @@ +package org.biblioteca.negocio; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Socio; +import org.biblioteca.repositorio.AlmacenSocios; +import org.biblioteca.repositorio.AlmacenSociosImpl; + +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class GestionSociosImpl implements GestionSocios { + private final AlmacenSocios almacen; + + public GestionSociosImpl(AlmacenSocios almacen) { + this.almacen = almacen; + } + @Inject + @Override + public List listarSocios() { + return almacen.consultarTodos(); + } + + @Override + public Optional buscarSocio(String numeroSocio) { + return almacen.consultarPorNumero(numeroSocio); + } + + @Override + public boolean registrarSocio(Socio socio) { + if (socio.getNumeroSocio() == null || socio.getNumeroSocio().isBlank()) { + return false; + } + if (socio.getApellidos() == null || socio.getApellidos().isBlank()) { + return false; + } + if (socio.getNombre() == null || socio.getNombre().isBlank()) { + return false; + } + return almacen.guardar(socio); + } + + @Override + public boolean darDeBajaSocio(String numeroSocio) { + return almacen.borrar(numeroSocio); + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java b/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java index 2097951..267d855 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java @@ -1,109 +1,22 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Libro; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenLibros { - private final Path rutaArchivo; - private final Type tipoListaLibros = new TypeToken>(){}.getType(); - private List listaLibros = new ArrayList<>(); +public interface AlmacenLibros { + void leerDesdeArchivo(); - public AlmacenLibros() { - this.rutaArchivo = Path.of("datos", "libros.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaLibros); - if (temporal != null) { - listaLibros = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer libros: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaLibros, tipoListaLibros); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir libros: " + excepcion.getMessage()); - } - } + Optional consultarPorIsbn(String isbn); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Libro l : listaLibros) { - copia.add(l); - } - return copia; - } + boolean guardar(Libro libro); - public Optional consultarPorIsbn(String isbn) { - leerDesdeArchivo(); - for (Libro l : listaLibros) { - if (l.getIsbn().equals(isbn)) { - return Optional.of(l); - } - } - return Optional.empty(); - } + boolean borrar(String isbn); - public boolean guardar(Libro libro) { - leerDesdeArchivo(); - Optional existente = consultarPorIsbn(libro.getIsbn()); - if (existente.isPresent()) { - return false; - } - listaLibros.add(libro); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String isbn) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaLibros.size(); i++) { - if (listaLibros.get(i).getIsbn().equals(isbn)) { - listaLibros.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } - - public void actualizar(Libro libro) { - leerDesdeArchivo(); - for (int indice = 0; indice < listaLibros.size(); indice++) { - if (listaLibros.get(indice).getIsbn().equals(libro.getIsbn())) { - listaLibros.set(indice, libro); - escribirEnArchivo(); - break; - } - } - } + void actualizar(Libro libro); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java new file mode 100644 index 0000000..dfba8d6 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java @@ -0,0 +1,118 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Libro; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class AlmacenLibrosImpl implements AlmacenLibros { + private final Path rutaArchivo; + private final Type tipoListaLibros = new TypeToken>(){}.getType(); + private List listaLibros = new ArrayList<>(); + + public AlmacenLibrosImpl() { + this.rutaArchivo = Path.of("datos", "libros.json"); + leerDesdeArchivo(); + } + @Inject + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaLibros); + if (temporal != null) { + listaLibros = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer libros: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaLibros, tipoListaLibros); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir libros: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Libro l : listaLibros) { + copia.add(l); + } + return copia; + } + + @Override + public Optional consultarPorIsbn(String isbn) { + leerDesdeArchivo(); + for (Libro l : listaLibros) { + if (l.getIsbn().equals(isbn)) { + return Optional.of(l); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Libro libro) { + leerDesdeArchivo(); + Optional existente = consultarPorIsbn(libro.getIsbn()); + if (existente.isPresent()) { + return false; + } + listaLibros.add(libro); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String isbn) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaLibros.size(); i++) { + if (listaLibros.get(i).getIsbn().equals(isbn)) { + listaLibros.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } + + @Override + public void actualizar(Libro libro) { + leerDesdeArchivo(); + for (int indice = 0; indice < listaLibros.size(); indice++) { + if (listaLibros.get(indice).getIsbn().equals(libro.getIsbn())) { + listaLibros.set(indice, libro); + escribirEnArchivo(); + break; + } + } + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java index 05efd77..c604e22 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java @@ -1,109 +1,22 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Prestamo; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenPrestamos { - private final Path rutaArchivo; - private final Type tipoListaPrestamos = new TypeToken>(){}.getType(); - private List listaPrestamos = new ArrayList<>(); +public interface AlmacenPrestamos { + void leerDesdeArchivo(); - public AlmacenPrestamos() { - this.rutaArchivo = Path.of("datos", "prestamos.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaPrestamos); - if (temporal != null) { - listaPrestamos = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer préstamos: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaPrestamos, tipoListaPrestamos); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir préstamos: " + excepcion.getMessage()); - } - } + Optional consultarPorId(String identificador); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Prestamo p : listaPrestamos) { - copia.add(p); - } - return copia; - } + boolean guardar(Prestamo prestamo); - public Optional consultarPorId(String identificador) { - leerDesdeArchivo(); - for (Prestamo p : listaPrestamos) { - if (p.getIdentificador().equals(identificador)) { - return Optional.of(p); - } - } - return Optional.empty(); - } + boolean borrar(String identificador); - public boolean guardar(Prestamo prestamo) { - leerDesdeArchivo(); - Optional existente = consultarPorId(prestamo.getIdentificador()); - if (existente.isPresent()) { - return false; - } - listaPrestamos.add(prestamo); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String identificador) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaPrestamos.size(); i++) { - if (listaPrestamos.get(i).getIdentificador().equals(identificador)) { - listaPrestamos.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } - - public void actualizar(Prestamo prestamo) { - leerDesdeArchivo(); - for (int indice = 0; indice < listaPrestamos.size(); indice++) { - if (listaPrestamos.get(indice).getIdentificador().equals(prestamo.getIdentificador())) { - listaPrestamos.set(indice, prestamo); - escribirEnArchivo(); - break; - } - } - } + void actualizar(Prestamo prestamo); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java new file mode 100644 index 0000000..6347909 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java @@ -0,0 +1,118 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Prestamo; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class AlmacenPrestamosImpl implements AlmacenPrestamos { + private final Path rutaArchivo; + private final Type tipoListaPrestamos = new TypeToken>(){}.getType(); + private List listaPrestamos = new ArrayList<>(); + + public AlmacenPrestamosImpl() { + this.rutaArchivo = Path.of("datos", "prestamos.json"); + leerDesdeArchivo(); + } + @Inject + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaPrestamos); + if (temporal != null) { + listaPrestamos = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer préstamos: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaPrestamos, tipoListaPrestamos); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir préstamos: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Prestamo p : listaPrestamos) { + copia.add(p); + } + return copia; + } + + @Override + public Optional consultarPorId(String identificador) { + leerDesdeArchivo(); + for (Prestamo p : listaPrestamos) { + if (p.getIdentificador().equals(identificador)) { + return Optional.of(p); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Prestamo prestamo) { + leerDesdeArchivo(); + Optional existente = consultarPorId(prestamo.getIdentificador()); + if (existente.isPresent()) { + return false; + } + listaPrestamos.add(prestamo); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String identificador) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaPrestamos.size(); i++) { + if (listaPrestamos.get(i).getIdentificador().equals(identificador)) { + listaPrestamos.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } + + @Override + public void actualizar(Prestamo prestamo) { + leerDesdeArchivo(); + for (int indice = 0; indice < listaPrestamos.size(); indice++) { + if (listaPrestamos.get(indice).getIdentificador().equals(prestamo.getIdentificador())) { + listaPrestamos.set(indice, prestamo); + escribirEnArchivo(); + break; + } + } + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java b/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java index 0ebeaca..66ceed9 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java @@ -1,98 +1,20 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Socio; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenSocios { - private final Path rutaArchivo; - private final Type tipoListaSocios = new TypeToken>(){}.getType(); - private List listaSocios = new ArrayList<>(); +public interface AlmacenSocios { + void leerDesdeArchivo(); - public AlmacenSocios() { - this.rutaArchivo = Path.of("datos", "socios.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaSocios); - if (temporal != null) { - listaSocios = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer socios: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaSocios, tipoListaSocios); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir socios: " + excepcion.getMessage()); - } - } + Optional consultarPorNumero(String numeroSocio); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Socio s : listaSocios) { - copia.add(s); - } - return copia; - } + boolean guardar(Socio socio); - public Optional consultarPorNumero(String numeroSocio) { - leerDesdeArchivo(); - for (Socio s : listaSocios) { - if (s.getNumeroSocio().equals(numeroSocio)) { - return Optional.of(s); - } - } - return Optional.empty(); - } - - public boolean guardar(Socio socio) { - leerDesdeArchivo(); - Optional existente = consultarPorNumero(socio.getNumeroSocio()); - if (existente.isPresent()) { - return false; - } - listaSocios.add(socio); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String numeroSocio) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaSocios.size(); i++) { - if (listaSocios.get(i).getNumeroSocio().equals(numeroSocio)) { - listaSocios.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } + boolean borrar(String numeroSocio); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java new file mode 100644 index 0000000..5f4e673 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java @@ -0,0 +1,106 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.biblioteca.entidades.Socio; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +@ApplicationScoped +public class AlmacenSociosImpl implements AlmacenSocios { + private final Path rutaArchivo; + private final Type tipoListaSocios = new TypeToken>(){}.getType(); + private List listaSocios = new ArrayList<>(); + + public AlmacenSociosImpl() { + this.rutaArchivo = Path.of("datos", "socios.json"); + leerDesdeArchivo(); + } + @Inject + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaSocios); + if (temporal != null) { + listaSocios = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer socios: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaSocios, tipoListaSocios); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir socios: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Socio s : listaSocios) { + copia.add(s); + } + return copia; + } + + @Override + public Optional consultarPorNumero(String numeroSocio) { + leerDesdeArchivo(); + for (Socio s : listaSocios) { + if (s.getNumeroSocio().equals(numeroSocio)) { + return Optional.of(s); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Socio socio) { + leerDesdeArchivo(); + Optional existente = consultarPorNumero(socio.getNumeroSocio()); + if (existente.isPresent()) { + return false; + } + listaSocios.add(socio); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String numeroSocio) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaSocios.size(); i++) { + if (listaSocios.get(i).getNumeroSocio().equals(numeroSocio)) { + listaSocios.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } +} + From 38280e33f9c3fa12784408a4e2fa9dc51f681689 Mon Sep 17 00:00:00 2001 From: Saamu844 Date: Wed, 17 Jun 2026 09:24:56 +0200 Subject: [PATCH 2/2] weld --- .../org/biblioteca/config/ConfigProducer.java | 14 ++++++++ .../biblioteca/interfaz/MenuPrincipal.java | 3 ++ src/main/resources/META-INF/beans.xml | 7 ++++ .../biblioteca/interfaz/MenuPrincipal.class | Bin 8963 -> 10069 bytes .../biblioteca/negocio/GestionLibros.class | Bin 1699 -> 571 bytes .../biblioteca/negocio/GestionPrestamos.class | Bin 3241 -> 533 bytes .../biblioteca/negocio/GestionSocios.class | Bin 1558 -> 511 bytes .../repositorio/AlmacenLibros$1.class | Bin 715 -> 0 bytes .../repositorio/AlmacenLibros.class | Bin 5274 -> 627 bytes .../repositorio/AlmacenPrestamos$1.class | Bin 736 -> 0 bytes .../repositorio/AlmacenPrestamos.class | Bin 5349 -> 643 bytes .../repositorio/AlmacenSocios$1.class | Bin 715 -> 0 bytes .../repositorio/AlmacenSocios.class | Bin 4981 -> 570 bytes .../compile/default-compile/createdFiles.lst | 3 -- .../compile/default-compile/inputFiles.lst | 30 +++++++++++------- 15 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/biblioteca/config/ConfigProducer.java create mode 100644 src/main/resources/META-INF/beans.xml delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenPrestamos$1.class delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenSocios$1.class diff --git a/src/main/java/org/biblioteca/config/ConfigProducer.java b/src/main/java/org/biblioteca/config/ConfigProducer.java new file mode 100644 index 0000000..ed57b52 --- /dev/null +++ b/src/main/java/org/biblioteca/config/ConfigProducer.java @@ -0,0 +1,14 @@ +package org.biblioteca.config; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; + +import java.util.Scanner; + +@ApplicationScoped +public class ConfigProducer { + @Produces + public Scanner produceScanner(){ + return new Scanner(System.in); + } +} diff --git a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java index 84980de..6a4a29f 100644 --- a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java +++ b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java @@ -5,6 +5,8 @@ import org.biblioteca.entidades.Socio; import org.biblioteca.negocio.*; import org.biblioteca.repositorio.*; +import org.jboss.weld.environment.se.Weld; +import org.jboss.weld.environment.se.WeldContainer; import java.time.LocalDate; import java.util.List; @@ -19,6 +21,7 @@ public class MenuPrincipal { private final AlmacenLibros almacenLibros = new AlmacenLibrosImpl(); private final AlmacenPrestamos almacenPrestamos = new AlmacenPrestamosImpl(); private final AlmacenSocios almacenSocios = new AlmacenSociosImpl(); + WeldContainer container = new Weld().initialize(); public MenuPrincipal(Scanner lector) { this.lector = lector; diff --git a/src/main/resources/META-INF/beans.xml b/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..3e8774e --- /dev/null +++ b/src/main/resources/META-INF/beans.xml @@ -0,0 +1,7 @@ + + + diff --git a/target/classes/org/biblioteca/interfaz/MenuPrincipal.class b/target/classes/org/biblioteca/interfaz/MenuPrincipal.class index d80296423aa5e70a9a71bfc7751c9c4a0dd6d191..53163d812270b9bbbfd841a54968ae6f24205191 100644 GIT binary patch literal 10069 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 literal 8963 zcmd5>d3+T2b$?GbNO8Y&AQvl${u|jx_h$vGk6F6AL?W zD+(G>ka81DRXvJ9I^{&02f|h?W+&P-n#r`hh*HcRcEgU_e7l`YIc}`S8BDmz5LHmA zh%m>XN~&V27|tJNx}oP<$bjSAt8yF=_TX6Uaa>?f4K1AH=nY?;qc;y67c;HAvT!>R z*o-wQOc!}fml|Z!b+C%R&D;#8`m5|TH?^&tmeF#JRv2^xtt_zcz~N-d9))4uH0(Ur zGYxbuhD!~k61Fwkrc*uBqR^^Ut4w8ziRWWx#5O&9nCK2sBQi6ihhH1%~db54vv=wm@W>oBLT2V7>r6!(=y2GwcYnkS> z)SF#VXVi&V{v4gwGu5oEH}}|y$;oEe9gRor6jt5DRK6O+Zgk8}=(Lf^7_i}vux`w5 zHAVb3gKiPo%aoKM+Dx}h8Q!f**ks194?VvjmL-vDdE1E1)p%LSd zc10X~IaX9U01VY#2W(i%g6o?p7o6;**d#`-Msb54Bw&VT0p&2=z?WegeR|wVByD^a zsUz!A-5O!2wkY82Sjvf55j)xJZ#79{0(@^_>Yc_fryBNJdb+#o_XtoO7QG)~T2@ya zszqYJc$EO-hYWffy`5?PsCCfpaAWZNyPOn!A_i25rC|6Qrjc-26&)s;wyfnyWrM{NWx(7~QGYL28%?*Wi_jB|omX4dz_>J{|s;*v+- zz@~8V-vCM|(`DB|_z0-wp~U-{7Gv-BAqU{*?>FqmOdHw|?!x9b4f-HGhLDJ2l9f;t zq2J1EEUWa?gR!<5^kMplMjtikx9DR`Gbh17hT+{#vTHP+I;^4=0*(WWy7J@!Ti};D zW`!qCxkBvY27Q8_fCD?olu$Z+d0qkAZoeO_kJFPHJ!R0RgmvX4>+BS;2Ws>Ii)8N8 z2K_dD2GAnlR18c$ObFV2R*?FcA{}R81W0^xI=uJNnBcumrGZroUl7chnaI*rJY^_j&{;JU zu@as37Ld#hyAQ z^A$|lWk)BT8FFL5t`L2dzNXRF4f+QCeu3e4@9yqo3MH&q#2xiM3LQuK+GPDV4f>Yg zzn*eET+-+dt^`W{u3n+<2q=A*Y5z02JLXr4!*G)rN;YI{p1*g_4_`G_7#T8Ixj9r++l)pTvu2 zqvTRVv(=jn{)<8XDuWdfpKLBo|GPo|AtP1bm0gi+_sHt>U!YeAx8mmi1HBg8LHb`u zG2c0H%1TO9=A<<1;;tBINXmC}&ANIqQYT$B=>G(hfPPz$mk);MGCr6MF5%K_4VZF9 z?dBdgY(+b*l$13w7kPGm7VHX#5iggy%-|qvlH8-|WT$l)ki4L7yPx5T=4)Kebln@~ z_pCZXtn&;+6GWr%|0|k`_YbX|Bg#c4lR7VgKXrG)Me>-4lPuyT;;VyZ2b9{eJY$Fy}J#0)seK^*sj zDM!u%SZm2K0H*^xdje2-5fwkAL=zR9I%WX0^7JYx9mM7pYVL46tG$+@xwl+x6Pt@P z=p_co8B?_aD60@^r0ictRyUj$32R#fgt%b6G6;6%i>L#p-{-N*fl2b2MCtiLQv zNTLZ#Ww!F{Qb-U&R`rt)JZm4*`fE2%j<{?zG~lKaVSB5if~Mdm=|*vGxX2dQO-U5Q zd+pSS8%gRMMr3#>Cc~s*V&TkC&SUwqmz)AO@-R#9-hdR=2McQ{0 zFxBJv*~p*h?PeP)OPqt3_qguCbi6Gu*gQh{Jp~JQAu#d>{pt7QQJ5x)_#`^4XmkLF z5*WbfmV3F5sFh6GNsZwmE2iveI#D&2GxwFJA_}~H(RHY8N^tHC;3^N7iD*^IrJj1@ zs!hFd`-OJ}AFSy>^)1f&d_W$tI?cyhUTNW2+bvD zsP;6bm+%_=E~FrS=Yr`xDyR9V6c^A^-0U^rZm$I+^E}eLme=76Oq6KwXI_t$N&vnG za{?H9^*Oq}vMxgn@?Pz~Tm1Jr|GmL~-<+Y=hA)top-ma;=xOXN+1!+&ZO?+vPCT-) zwRmpFvjk5go{deFJsIj7r{>blC#a#Ra;N&bE`YDaO_jUUS5+ClW;RvsQD0@j%}azN zZIB=QE5%cbX9b=nJZl>=bT^jcbnSAA8s(J|h@H$jCrgX#jB zafu$#s1tu&QBe`94F-cHzaR~k#$}bS=ud&Sj@c(gxNxBYrOPhp>XokHg04R4atgXy z1JZY}u&=D9>>Q152wtG%-o~a?HG#RoxxurPZq;D2*)=fQp>e9j!p8ITRwAg$*Vx0V zScw2yLSG;2QFybQ@@Og4z~b0(8)`)TLB=FMM|d7oQus70Nn7%eakif%2d*-o%@g zkDv4vUqz4et)h5veS~jAs|0)#+>TZ$IN!%x&og0w_ti)iDK0u}d&A{#UG-f@~Kqwky4;iF1zS+DZ~bQ{#w z4RvjY@7)2v>V@L^^Sr7hx4EU>=9JLoRC1AUa|K~pE--zuUh?C$U1Z462YMP`pbs(m zl02>?S&6=5xCLx_fj%ii^U?S;(@T^TA6k{66DKbJTw)`jVxtzymcYfOE6t%@w3zn5 zjCa9ocf(}+l%yuqy8)*nF^z;_yDzicL3eT&gxiW<1EP98x1&d5V-A&Gq{SM2_#y>0 zI{rF{GjGf8rVxFeh47-z&-w4q`|scN-@k(B^PGo1XFT*dcV+b158d1c^tqoFz@R3a zw2lT5NMQs@1n6S}eTINO!$2Pg=yL$*6V3CJH;+EJgYw*lyJ2Io^7}-=7Ye;ux_+;q zOQFw~3c3{fe7T^jHE@n5GW2q5*#&xKZ%tWKBf#b?eY-UX-<)3)%+UA7sS4C<%Fbge zc}VjrELx1sF0>OzlspJfNg%wF0F@MiI}K17L(Ciks2qllj$p=H0Z4B{gg&gav(4LC zE{fiQlYj>i5#ElLK*XJV2U-FVo45z90I03!UbMG zem+Qu*j{)QfW-NnSot6^KSO_72ogV2lDr{EymAGQcob5;A3^;A#PJ6K2#*0IJ_L~X zNC8NQGK)cC#}ts*!FT$*m=+{65{}gV*rVd10+5Hkaz+h@kxNhae%~=0Ewpn5}$@cK8?uwOrD>-d62+m zoevVP!Mn>50%t|R|5@nG()Hg3T?!%7TBO5=5|BiefRoWRK zaR!)kjvl5L=uzCmAEz&Z)=OCRB366}qhD5P9-#&n|JYUpvXSz<2`5v zL1`=Bg%Fk6Vm;r@d%^z{m8)V#O6{{bq&D5G70BBV z*mUCZ%ZrcsJ@8GHbiAUcMIF+<4SjtF2K_Ed|L@T%`aWvd9{|&SNL%Sgw2giYQ@=+2 z^b?dqKUKSGfYDc=MisM)G56*Qp*#5=!8lOs=X-fS&S;Y*k&NBv@4be~F3}v6M6liQ yi?j}gd!6`oDluU7`$4jVA7Bgbg{aRCV9}uZji}!t^*h3GjKiw@ASXFZHNON~RMdF@ diff --git a/target/classes/org/biblioteca/negocio/GestionLibros.class b/target/classes/org/biblioteca/negocio/GestionLibros.class index 57497779dd112619869af468898a6dfee404927f..d63bad8fcfc16a171d0e3f206e406ee6d464cfee 100644 GIT binary patch delta 225 zcmZ3?yPJjg)W2Q(7#J8F8AR9_m?l=LE3-4OFfs^aC6*=X=OpH(>-#5Vr6!j!GVtVN z7MCOz`D7*)P5dA}S&BKBQDbr!v-;#V=J?5qOe&U)47{m1nYo#H5JmZn45Au72y=o< ziZb)ktu><<8TfMZQ!>*slc5SH%QLAmhE29-QSxJBWME`q2D*oVffeWsRt7d8pB>0! mV&DMsIT^U%d~P70hk=&?f7+t|DU#stU6GFZHEB4e<5#Y8-+>~a;{W>HhlbZ@NeS{`bdU09Nr^8AB*I7faZ$y7hS^+jC_2igz`G(cQe}Y*4o`s?>aASFSJO3ZzHt{5 zIKWW#RT#yA;d)cGRm3n+n{Or6#YP5=mW)i|Kjq>e4pHTO|3^x%M_x#E*3y7Pjt!$_ z*l7-8JlwI2c|bTvaMZyME{@?i!*q_Y2#sv>wumSz$wI|-gh^9O_DBupDB}cX9GrCV zBTjvGCn*U6kkJ}NJWnp=iB12Li#eOSM9`bk#DTKbnu~eV879ekds}pO0dDU}8H0LR;gL5v<;{r8_r?j?#Q+sKaxL$H`8CMv} z+&3`~Y4@3N*gTU|++4nbJv*(* z;0DwST&FEd3U0_w$W5#X|5ERI`aQFpN6qW9LWujkIPx<@VlR_!n)tGr81C&Q*Fc;0 zTI{>hy8Q3=ye-p87)FA$+h)E+nW3^_xc~e<-^nDbh(LB_*e{{lRc-lHeyXXwprr@rZmN|w#n?Mqr#LnvFg_4p%;K*l zJ}Y#79fvZUYxHY*mn_c0E++FpQwh+))F}fZcif=Ylp%#&qt#6;($`XZl|e2M+~I#v zu|K<*evOgBTUyVirr810={NQ)W3cd+Fbatz(=>6Qu^z`!D*PB`ah#_91P$*D8uVCL ziBe`ueP&Czh1 diff --git a/target/classes/org/biblioteca/negocio/GestionPrestamos.class b/target/classes/org/biblioteca/negocio/GestionPrestamos.class index 39a7724d9399718d7ead2485e9f8a9b4a8163cd1..a22282aca7329317ef5323dbd2f89d9e21fefe67 100644 GIT binary patch delta 165 zcmZ1}IhBR?)W2Q(7#J8F8HCswm?qX}iLo=VFfs^aC6*=X=OpH(>-#5Vr6!k57Gx6< z7Sho40ZWvYWajAmWEPiLPgZ7&oUFy9Ie9)?>f~ZpHO8pP793iW*KjDiu`x0*GB5+p vW?*0e8p+DQ2IR8?c}xr(Kt3k}7o5)xSs}bkwTi_kEs9`jcvL7BY^#%Ggu##rlL;34en0HH zpX_h&L%UXuUF}+3{nQWrO|Gu)dnZF66^kotW$xU2&fe$jbMC$K_dmb=0bm$Egi!}y z5Pl5-)C)wG^i@5c)AI}Q$@G$uaRlm5n|ae267a>kXM<=E=(X&Hc-lncb5fvwn6UNl6lXzn5SjxWZvyE zKcV4CJXK|Om$%34+9ssr`!wvw0fC(vD_<<-9NnI=vQ|+b8tYD}8kZb17f+c*N7*0J z@H7r@w4bu-=)TS(7Y78lIOd zn#`n_&a2wXE*jQwR&qo(a!3owFrwi+Mj0!;YEyQ19lPg(z}_u2tniHCMGY5aq)m(Z z+K5>!Sa~yT=A_bLjA2~E1SSRckm&r9v0TXM+?SqR&R{=qQzxbAOBya=nx@4qP5rTC z_pD6rWeu~qED+W+PD#(1w{%wSP^@-uR72_9nc0R(>YnDW} zs_JVRUYF@Mn8o3YW3F1V2-h^|NDG7*x;rc2kIhTEEQ}zoYgoXdK(nf*V=f!9{%)G%~O&j)%p3ZS5s&bjtZBxEiCjHK$$>Mg` zmSn4wHbLYZ&jQ`{1gCds+FZ!%PRS})rRh|NmLM)hK24;3nR6nl3YxzM2~k7^zS+_M|bQ14`5t_?YPjVOzN z8Vc;+8rt0z0z0ymjjJ}KNV3y5*L1Dm)pg(@ypNDT9eJt>kLl=!Cd=12?dX{s<9eae zS&doQ{HunoOaxjVR;YO<<*BRG7<|0Ay&|d5!_!vD&KRSn?Dp2$Z-gUqQ{wEQdZGER*5mGPW6+04l^WxO!a?@e-W?oW)J z^0)iTNd73D7GUjJu!^^f8xud`#A!U@b_fJHnBlgFhLZ^+GJJ!c#5;eF<~57YPnA2Q41wE2i5 zA94EdF+L&t9NO_IK4VcoCx+C`wf|z>{xFJbP2egf zah<|iluOEafr-pg94S+Ps}UuWY?PICiB~FZ6~ZFEQ4)9HvXb3L?0zM-e_dGD>RU?W fuHB~mQrH&w9)MC()<_Ut4{(uV3i=(_>hS%)r_n=> diff --git a/target/classes/org/biblioteca/negocio/GestionSocios.class b/target/classes/org/biblioteca/negocio/GestionSocios.class index ee17e345f2a4d132de4e5dc6ea97e5d3f6a09a04..f40629f6611ba5e4422652b812139db34043ab08 100644 GIT binary patch delta 202 zcmbQn^Pidb)W2Q(7#J8F8HCswm?l=LE3-4OFfs^aC6*=X=OpH(>-#5Vr6!j!GVtVN z7MCOz1?MMcPW&J~`36%kqsC-^X7$P5%!$m(8a|T~8Rc}WHKQ0A_)-#!TvDA9vl2my z^BEaLHGB}}1(y_M=A{D_PX5NMWa~9vO9C<-gD1Ackcf9`Q;mcDjw%CfQ*Gf8$%do7~A1*xZ`oZ z?QAr6gc~vpuSj2ps|=aa(w2oRLrLkj)09n5s!+Jx(W0XQ87eK6Q}y<^EBuCXr3&(} zkjY^LwuMm}1sr3TPX+s;ZG4@lA_%2Q0vRkG12L5AsffR(tC)P_Hi|gTP;iwWbiI)4 zP1RBXL$S0}kE-j2(sSxE2qXUq8e3ffb5rO|-t@>)tSgs$TU<-C zPmF`%Yf0T&NRv47o>Zt#k2=Y9eBr3NhHU#h>}tZl+0*o}<11;@bZM)EIMVC}Zh}ZV zKe`J^n~Hzl2Zm=y72bE(dbi}ivKO>yQ$?g`l5!|8^T9ClFYXMZjgY&$&v_@&vOo=8 z7d5`a6Rdngb+s#=$VmR*M(&E44b0N84$z;0nq$V5RztL=Ujx0b)2@aLt$?xeXRz{D zSg$@K_X+tAWE;Q@dKbt8urY{HiZ9@1w2NYJ3%6;vKO%pCvG=r& zaZE;Fye~eR#NUm4?$P;uOeHuE=xccA49@ZaPNab*BB06GDFGsPRIoxoG2{bUt>QAh z4YhX(WR2iXe#fZ!9ANq_hBEuKo{vrQeWu0OwAeExT*~`|mWjlfrnv#l;y6x|1ZOdi zb2P2zNst-bqain9#T;vg9BX)pN5rX0XITu7voU&TU&FP8X}b6;CSkvd3w^-3L*QQV J3~Q19`Y%*rXPf{4 diff --git a/target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class b/target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class deleted file mode 100644 index 6de083a3f229138536d1df6f1eac8a68ef2173a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcma)4O-~y!5PiEhP0BioDATmMo| zl{oMN`lBjl0~fe7Uae=|^E{9JcK`mny#sKD{U$1?MyRz=M?>IUX6JEkZLTTKy*06; zZL;s~4-cjSwXvO%z(%4BT^93{+(f3Dna#vzQctB*C4MAp;aYit_bd144TgNB zQq?=*o2;y3Rr@oAYdiZQot#r3$9>nYRBmJ_9G~xN@?SGY$#;1p<02>>C(4J>^Y&zd zn#mb?USqTmH<{*dVDg7EM%WeTuj;$N+9mn$$@(DB zx-f>^SWEB8<1HfoW6B};tz(^0ld}(uOTK>i2jVv;6};fNu`KJL#re)d0bb%2qf)$q nHm`TeoOk=xW@?i`1+THSjN2>%YUuL(X32E1$Fa$>h$D}C>>0p` diff --git a/target/classes/org/biblioteca/repositorio/AlmacenLibros.class b/target/classes/org/biblioteca/repositorio/AlmacenLibros.class index 6c2b47223b4a19b0c9dc7c244c1c2d4aa3821964..70589133f0abc793c4352c3d22d98e05cbc4f0d2 100644 GIT binary patch delta 223 zcmbQG`I&|H)W2Q(7#J8F8N}Hcm?l2dc4lW_VPp`Tn*Y{7#N=+^S3gx7x z7P+Jrr=&U-C1+%oH%gi_5_xs-W{axSZ z3;(_T41gy5CyW9V$_Oc#h9U{&r_|GGG_4w`=>G0gTEdY~v_&^`XPbn=n%YA$iY3&U zRw~-9cc*pJ(GqIZ(lVy4JEo+RQHll=I9wSuG^04 z!Im)hcALnUBcZ}Y(C_H!Xp?2BXT{PmDp4pP%vZ1gRT4_mL4)O+ut}(cGh29oqfkcGOtn6p5v1DDeawf0%s=Lh+3jeCX0;ehUn8Nb)Q0huF#Dn@ z(@ZflQk)yz!=G3f2f+%~so*{wW<*amNkZ{S%j^>yNZ96Mck7`KGay)A`3W-eN@q;Q z5eYNKiiJpg8OO5G%hYYzzw1mwa|65t$8kc2s-PQ*{CaTKcCL2gBE@yBDOco46Z@j3+$;q}=Xn>U42dQ`hjJHtZ8 zhS()myiviM@UVoC;ST3Zo{NPyOIS26rWwq7QcY@h)NMQh>suAP4R5DyHJKbImT#%H zD~$7ahk|zsXN%U@Vt2DXF2=hRyhp4pViK!qJB$l>pN#j5hVg+sGG3`rnLgR<40QZ# ze!H}@GZ|nP@Th{vFu=B@^<|v1<3$Wiorw=CcpM*L7$+D{{b@(F+D%K~9Ji(KDnG0y zZuv0<9~Yh|(d~9ivniNpIZr6~q-Z%aH9NuTtXsQ`T+ivkrxkn#gLH?jpJN8lOD#g# z&nfskzQA`XCX{Un#y&+@XXHVgc2YZ1Ir*2j4MF8rGhSX^CJd(L}LIup0-okB(c7wKvS7uThUGCAAP3B(N%WCy!OAH`s}gsw9#3n$U<}NJnGqde z{RA6RQ(Jcfbl+qZD&W0rpijxBoa$Gtq{@=BY{Kz(Jb~ISQb>!Fv#T|Ogfr-D|LB#U z9TFPsNmL%xb<4zw$@_~uJMb)?YIes zF~YwE;xgg^kRpU!$T6qx3Tj8NmIeF<)(@j`0JDNaTZXZ%Qw-!j&lGQw9em$8jNR_H zVeE?!qphA_%7<`Z6kV;WpF?roYEl?PMf@qex_$`B>*xW7kiP7qI)MZaW+4uM_aKG8 z3&^307o$adU(EZ%5+2o;q7%z-grg@=!xbx$WXrZu>+-AP`n{No>v)uvZd6CvUkD3)1 z``C1?OC}+ti zIPQX!@O3;(XaeMu{2SumMiCW$)Ch$0M(}`y*3~0;jf4Tr<-;2!(mmf+-!Ou=6rgkP z)=Tx5xYCo~3!@EuYotVXQQVCLx`|=5IR~+p5&R8&(+!$NADDtVJm*GvR$Oo73Pl{H z^%*F51(h;*dwlRF7W%pHEq>(z$mj65&taqBFcEw881{xCJi;(~*8qwehVkA@gSTEB z#s>w9pwQdM;%dTeiL?KwozI~hRtF?bGR3&(aa4|d}i*&cWKiHt2~Sp673aYc;h zn8tl46mkAf@iU*7g3v4ccQxtGo0uk()z9$@pW9`w7jD?&ajOb2YZT8_`ON4fMoy*s zh3@%MAvy&e!LNY)o)tyaqqUR(!BP`q8L5DV23{REA%(3hU)wph8@)MK6>;R3q#{bi zo*b1uzSBlI8W!%V0p)RnUxkBd7<%VP)oRyxg z4P{aGf8A5x-H{cj_q5gVKwze`Ge|Hi@Xh&L4)xGz7b#OLx_3cG=e3iErcfE#OHU!H z!iDypz-}jUhy<2WZRuiM49WM^&@i)-x=fjY^18(T$!fgOK|oG(Ona}( zcPoYMUB1#ZQWmz(Dc-ozrShtvNS;rhyVAK;aqPLuAL+Zs_R?GRQ^|4EMy5K%-rEYu zMmY8~Dhv!Lo!SkAE?{$>RV3 diff --git a/target/classes/org/biblioteca/repositorio/AlmacenPrestamos.class b/target/classes/org/biblioteca/repositorio/AlmacenPrestamos.class index 87f8483dc08e0ee9ac7126e9fc0b03955a2ee56c..6fcd2576c4671cc1126974486b4d2984f3886d47 100644 GIT binary patch delta 215 zcmaE=*~}_%>ff$?3=9m84C3qzOpFZL6YaJ2*%??E83eKt%M$f-67$ma{gbj%lS_a? zIjN~dE~&*Ssg6a-8JT7Ij10^gnqiY4a)?Y`#ihZ|8JwA(msnC-l*-6puAw=30;l=p zb`Gn_KHRO7t$7qDm++WP-pr#M$HvG2)Cshefq@-p6DtE71IR{pD9ypZ36$po$}%x< j1I2k5c;S3LAfKN>0IXh+K?qC>Gl&4yGBSvQb%+4~Qz9gw literal 5349 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 n`My=Tn*Y{7#N=+^S3gx7x z7P+Jrr=&U-C1+%ocD?R98Q^?I9R)jclUDwzZ4$(HIt>L_%1iVkwphRAj>rt9*yvGtxX+h7|&{GMZ~S z3Tldk?{aO!>?^}+I&nN5H=c7WvjVkPt6-gq^{5kwdmv0oe%8q9iB8S!7l>GA1(J0k z^uDv?iK$D0kVPIm5gSxAVgom~hg_}2PWKz32#)9@KPtM>-Ij~$>_l| z67XgfTX2g&IV0Gq*}BPuT9A)nu`dPND10%ilwl4W&bfwV#&9ckD7a052QlY#Kg~f>tlJz|bb_=X6MxeQjM(>cTC*&S2`Ck&w?JD-5 zMPP2))-_k(XV}a|7J)=^*Nk?59p}kuLsN!U2KdA&1^cJybU3G*6FS|Y;vm`>z@Yn#Daf5FQfL>5QIAZ1+q!AD4OelHqA?ss zr-C=AxC>nZwUg?%UuUTe8q6TgNgQH59A*8nZmeEcH+8$sWciwDL!&m#ue3Fo=(DUo zRz@Ff6L;_<8N*SqgLSL88^@W^(-{erowcn&xq(1)fZgkd0nCtKMeQfd$ZwrV1t$dN zOf(Bw_zF(tvzMjYc6k4VwC*K%IZoq@0!>9P(#8GYqT}j=?7vh%V7?E44|lRnxJ0FE zgQRv6x{9;tqx`J3cHMEbJ~qsG`CS02p$B;#xh+^vR^WcTS;1RWycKWD_t+v6Qt8*64*dcf83$sI zeBvD{-iZeUqNcZ8EO{Xp-X*YNQcg3Ojf|GjorE`dB-Zz+crV^Z-&!U!NvyzAeNPMz z;{7T$3OooF=QX&{aY$iT)N81LHX>05`kK)zSm)S}qS( z9#NQ%g+L#%G8WOt^Zlow6uk=GsF_S_vS3WGw3U+$ed`n-Gg7<4oTv+dL(}!0P!RKZ zJ0sUh-;ic!G&YhoQx3J0dDQoiiFc0kBxkPBf-w&cRK=+-u>JqVRN8BCLdpp-9aDl3 z2LJO|P_Ac%dXL~HS!!-;~!ji)`&9vQDAA|X1-7-3@S_U=NSHimlga~&ZNI_ z_IoqaYet57-Wt#oe*SVeaZDZ1m7)i| zH;K^Apl-s)=X@IuSp_aywQRPFGlm(iwwXMXv}QHO(RslCXZ~Cn<}@8t1^?!lm_onE zlpV?Eg;i{U5zg`w#O0BlS8@6B!|#ZE3E}+vrgwdX?@~-cl=AZlt~lNmu&v=~h=ymN z9Op&(DAcQ{;?D)gpT?rASlkd_9=(p0$4la?y2h~PD(V|X(Ig#2@FYK%&<(g@lrXBf z^$KpiiSI#Mu@K+l9hKX06Fh~h{Eo=i1RsEi6LJaH+=i!6KaNdo#@DfR4BLk>FTAvC z49(qgp>TVy{1xBJ-}}aJz`HkwL#Z)zH1bZ>D2_abp7ssTqpV>ADU6^x^(5ZdIEu_Q z^aG>FKH;G{gEWs!QIE$KA_WDjrew8bv4ul)55+x*)#%0=oZ#vi)bWXR$Z(1}sQ36a z@cDySM5mOImgN|uhX`#dF^+5AK5oGN8SWtU@U5=U>f2n2VOH(Zm3tMOtmFzu87-u~ z4^tf(*iGa`T8n*Zc1n_O%yTc|c0R;y8S$T_hlv<95z$6s+sr!&)G$g3vXn8ZptSvS=lXeFYY)P*q^DBVYlt{edUG#H^y^ zRm>sa)i;RDuihUL@$>i*Kc(stxh$Ra9%3STXcV7p-!O{L3}aTwWyzt@SD6N%k6xy! zFY^jU5zN;p+8FOctlK+TtL+5afwg@1%4Y*z7oe@jk14vK{Sv%@7rAv_YJcS?T#>NL zAYPSHU!v_#@v{KxOS~%+BqgDi>@I0u?koI7fyb~(UN0ZVS0XYs3gT7=%a@rZ(cL2` zf1pH++OQ zvSQ1aRxjb_o`|Ue(^L?IQriClzYKV(h`z?Zc!^tXU>5&KhF@{V2!4&<@H