/**
  * Acción que se ejecuta cuando el usuario que está autenticado devuelve un libro alquilado.
  *
  * @param libro Libro alquilado que se va devolver.
  */
 @featureFT(parent = "InterfazBiblioteca", mandatory = "true")
 public void devolver(String libro) {
   biblioteca.devolverLibro(loginUsuario, libro);
   panelLibros.actualizarListaAlquilados(biblioteca.darAlquilados(loginUsuario));
   JOptionPane.showMessageDialog(
       this, "Petición realizada con éxito", "Éxito", JOptionPane.INFORMATION_MESSAGE);
 }
 /**
  * Método para la autenticación del usuario.
  *
  * @param login Login del usuario.
  * @param contrasenia Contraseña de usuario.
  */
 @featureFT(mandatory = "true")
 public void autenticar(String login, String contrasenia) {
   boolean correcto = biblioteca.autenticar(login, contrasenia);
   if (correcto) {
     loginUsuario = login;
     panelLibros.cambiarUsuario(login);
     panelAccionesContenedora.login(
         login, biblioteca, biblioteca.darTotalLibros(), biblioteca.darTotalLibrosEnPrestamo());
     JOptionPane.showMessageDialog(
         this,
         "Sesión iniciada con exito",
         "Bienvenido " + login,
         JOptionPane.INFORMATION_MESSAGE);
   } else {
     JOptionPane.showMessageDialog(
         this, "Nombre de usuario o contraseña incorrectos", "Error", JOptionPane.ERROR_MESSAGE);
   }
 }
  /** Constructor de interfaz principal de la aplicación. */
  public InterfazBiblioteca() {
    try {
      fabrica = new FabricaBiblioteca();
      loginUsuario = "";
      biblioteca =
          fabrica.darBiblioteca("./data/bibliotecaLibros.data", "./data/bibliotecaUsuarios.data");
      biblioteca.cargar();
    } catch (CargarBibliotecaException e) {
      JOptionPane.showMessageDialog(
          this,
          "Error cargando el archivo: " + e.getMessage() + "\nSe reinicirán los datos del sistema",
          "Error",
          JOptionPane.ERROR_MESSAGE);
    }
    setSize(779, 710);
    setBackground(new Color(238, 238, 179));
    setResizable(true);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
    gridBagConstraints12.fill = GridBagConstraints.BOTH;
    gridBagConstraints12.gridy = 1;
    gridBagConstraints12.weightx = 1.0;
    gridBagConstraints12.weighty = 1.0;
    gridBagConstraints12.anchor = GridBagConstraints.NORTHWEST;
    gridBagConstraints12.gridx = 1;
    GridBagConstraints gridBagConstraints = new GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    gridBagConstraints.gridy = 0;
    GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
    gridBagConstraints1.gridx = 0;
    gridBagConstraints1.fill = GridBagConstraints.BOTH;
    gridBagConstraints1.gridwidth = 1;
    gridBagConstraints1.gridy = 1;
    panelPrincipal = new JPanel();
    panelPrincipal.setLayout(new GridBagLayout());
    panelPrincipal.setMinimumSize(new Dimension(700, 478));

    // Agregar el panel de la imagen
    panelImagen = new PanelImagen();
    panelPrincipal.add(panelImagen, gridBagConstraints);

    // Agregar el Scroll de los libros
    panelLibros = new PanelLibros(this);
    panelPrincipal.add(panelLibros, gridBagConstraints12);

    // Agregar el panel donde están las acciones
    panelAccionesContenedora = new PanelAccionesContenedora(this);
    panelPrincipal.add(panelAccionesContenedora, gridBagConstraints1);
    add(panelPrincipal);

    setTitle("Biblioteca");
  }
 /**
  * Agrega un libro a la biblioteca. <br>
  * <b>post:</b> La biblioteca tiene un nuevo libro con los datos dados.
  *
  * @param titulo Nombre del libro.
  * @param autores Autores del libro.
  * @param descriptores Palabras que describen el libro.
  * @param referencia Referencia del libro.
  */
 @featureFT(parent = "InterfazBiblioteca")
 public void insertarLibro(
     String titulo, String autores[], String descriptores[], String referencia) {
   try {
     biblioteca.insertarLibro(titulo, autores, descriptores, 1, referencia);
     JOptionPane.showMessageDialog(
         this, "Libro agregado con exito", "Libro agregado", JOptionPane.INFORMATION_MESSAGE);
   } catch (LibroYaExisteException e) {
     JOptionPane.showMessageDialog(
         this, "El libro ya existía previamente", "Libro agregado", JOptionPane.ERROR_MESSAGE);
   }
 }
 /** Método que se ejecuta cuando se cierra la aplicación. */
 public void dispose() {
   try {
     biblioteca.salvar();
     super.dispose();
   } catch (Exception e) {
     setVisible(true);
     int respuesta =
         JOptionPane.showConfirmDialog(
             this,
             "Problemas salvando la información de la biblioteca:\n"
                 + e.getMessage()
                 + "\n¿Quiere cerrar el programa sin salvar?",
             "Error",
             JOptionPane.YES_NO_OPTION);
     if (respuesta == JOptionPane.YES_OPTION) {
       super.dispose();
     }
   }
 }
 /** Muestra los libros que está alquilados por el usuario que está autenticado. */
 @featureFT(parent = "InterfazBiblioteca", mandatory = "true")
 public void verAlquilados() {
   panelLibros.actualizarListaAlquilados(biblioteca.darAlquilados(loginUsuario));
 }
 /**
  * Acción que se ejecuta cuando el usuario que está autenticado alquila un libro.
  *
  * @param libro Libro que va alquilar el usuario.
  * @throws CopiasInsuficientesException Se lanza esta excepción cuando no hay copias suficientes.
  */
 @featureFT(parent = "InterfazBiblioteca", mandatory = "true")
 public void alquilar(String libro) throws CopiasInsuficientesException {
   biblioteca.alquilarLibro(loginUsuario, libro);
   JOptionPane.showMessageDialog(
       this, "Petición realizada con éxito", "Éxito", JOptionPane.INFORMATION_MESSAGE);
 }
 /**
  * Hace la búsqueda de los libros por los descriptores exactos del autor del libro.
  *
  * @param datos Datos de la búsqueda.
  */
 public void buscarDescriptoresExacto(String datos[]) {
   Iterador<ILibro> libros = biblioteca.buscarPorDescriptoresExacto(datos);
   panelLibros.actualizarListaBusqueda(libros);
 }
 /**
  * Busca los libros descritos por los descriptores que tienen las palabras dadas.
  *
  * @param datos Datos de la búsqueda.
  */
 @featureFT(parent = "InterfazBiblioteca")
 public void buscarDescriptoresPorPalabra(String datos[]) {
   Iterador<ILibro> libros = biblioteca.buscarPorDescriptores(datos);
   panelLibros.actualizarListaBusqueda(libros);
 }
 /**
  * Hace la búsqueda de los libros por el nombre exacto del autor del libro.
  *
  * @param datos Datos de la búsqueda.
  */
 @featureFT(parent = "InterfazBiblioteca")
 public void buscarAutoresExacto(String datos) {
   Iterador<ILibro> libros = biblioteca.buscarPorAutoresExacto(datos);
   panelLibros.actualizarListaBusqueda(libros);
 }
 /**
  * Busca los libros descritos por los autores que tienen las palabras dadas.
  *
  * @param datos Datos de la búsqueda.
  */
 public void buscarAutoresPorPalabra(String datos[]) {
   Iterador<ILibro> libros = biblioteca.buscarPorAutores(datos);
   panelLibros.actualizarListaBusqueda(libros);
 }
 /**
  * Hace la búsqueda de un libro por el título exacto del libro.
  *
  * @param titulo Título a buscar.
  */
 public void buscarTituloExacto(String titulo) {
   Iterador<ILibro> libros = biblioteca.buscarPorTituloExacto(titulo);
   panelLibros.actualizarListaBusqueda(libros);
 }
 /**
  * Agrega una copia de un libro a la biblioteca.<br>
  * <b>post:</b> En caso que exista el libro aumenta en uno el número de copias.
  *
  * @param referencia Referencia del libro.
  * @throws LibroInexistenteException Se lanza esta excepción cuando se intenta ingresar la copia
  *     de un libro que no existe
  */
 @featureFT(parent = "InterfazBiblioteca")
 public void insertarCopiaLibro(String referencia) throws LibroInexistenteException {
   biblioteca.agregarCopia(referencia);
 }
 /**
  * Registra un nuevo usuario en el sistemas de biblioteca.
  *
  * @param login Login del usuario.
  * @param contrasenia Contraseña del usuario.
  * @param nombre Nombre del usuario.
  * @throws UsuarioPreexistenteException Si ya existe un usuario con el login ingresado.
  */
 @featureFT(name = "registrarUsuario", mandatory = "true")
 public void registrarUsuario(String login, String contrasenia, String nombre)
     throws UsuarioPreexistenteException {
   biblioteca.insertarUsuario(login, contrasenia, nombre);
 }