
package negocio;

import datos.ConexionBaseDatos;
import datos.LibrosDatos;
import encapsuladores.Libro;
import excepciones.GenericaExcepcion;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

public class LibrosNegocio {

public List<Libro> consultarTodos() throws Exception
 { 
    Connection connection=null;      
    List<Libro> listaLibros = null;
    
  try {
        connection = ConexionBaseDatos.getInstancia().abrirConexion();                                
        listaLibros = new LibrosDatos().consultarTodos(connection);
      } catch (Exception excepcion)
          {  
            throw excepcion; 
          }   
        finally
          {
             ConexionBaseDatos.getInstancia().cerrarConexion(connection);          
          } 
     
     return listaLibros;                                 
 }  


public List<String> probarOcupacionPoolConexiones() throws Exception 
{     
      List<String> listaMensajes = new ArrayList();
      listaMensajes.add("-----  PRUEBA DE TODAS LAS CONEXIONES QUE SE PUEDEN ABRIR EN EL POOL DADA LA CONFIGURACION QUE SE LE HA ESTABLECIDO   -----");
      
      //         APERTURA DE CONEXIONES
      Connection[] conexiones = new Connection[1000];     
      int numeroConexionesAbiertas = 0;
      boolean interceptadaExcepcion = false;
      boolean abiertasTodasLasConexionesDisponibles = false;
      while (!interceptadaExcepcion) 
      {
         try { 
               conexiones[numeroConexionesAbiertas] = ConexionBaseDatos.getInstancia().abrirConexion(); 
               listaMensajes.add("Abierta conexión del pool : " + numeroConexionesAbiertas);
               numeroConexionesAbiertas++;               
         } catch (Exception excepcion)
            { 
               interceptadaExcepcion = true;
               if (excepcion instanceof GenericaExcepcion)      
               {
                  GenericaExcepcion genericaExcepcion = (GenericaExcepcion)excepcion;  
                  if (genericaExcepcion.getCodigoError() == 20)
                    {
                       abiertasTodasLasConexionesDisponibles = true; 
                       listaMensajes.add("Se han podido abrir : " + numeroConexionesAbiertas + " conexiones");
                       listaMensajes.add("-----   Al intentar abrir nueva conexión en el pool, se ha interceptado excepcion asociada a que todas las conexiones están ocupadas   -----");                                                         
                    }
                   else
                    {
                       throw excepcion;
                    } 
               }                           
            }     
      }    

      if (abiertasTodasLasConexionesDisponibles)
      {
         //         LANZAMIENTO DE SQL DESDE CADA UNA DE LAS CONEXIONES ABIERTAS
         //         Evidenciamos que siguien abiertas las conexiones del pool lanzando una SQL desde cada una de ellas
         for (int i=0; i<numeroConexionesAbiertas; i++) 
         {
            listaMensajes.add("Desde la conexión "+ i +" lanzamos la SQL obteniendo el número de filas de la tabla : " + (new LibrosDatos().consultarNumeroFilas(conexiones[i])).intValue());
         }      
      
         //         CIERRE DE 10 DE LAS CONEXIONES ABIERTAS. ABRIENDO UNA NUEVA PARA CADA UNA DE LAS QUE SE CIERRA, LANZANDO UNA SQL DESDE CADA CONEXION QUE SE ABRE
         listaMensajes.add("PROCEDEMOS A CERRAR CONEXIONES Y A REUTILIZARLAS ABRIENDO UNA CADA VEZ QUE SE CIERRA OTRA");
         for (int i=0; i<10; i++) 
         {
            ConexionBaseDatos.getInstancia().cerrarConexion(conexiones[i]);
            listaMensajes.add("Se ha cerrado la conexión del pool : " + i);
            conexiones[i] = ConexionBaseDatos.getInstancia().abrirConexion();
            listaMensajes.add("Se ha reutilizado la conexión del pool : " + i);
            listaMensajes.add("Desde la conexión "+ i +" lanzamos la SQL obteniendo el número de filas de la tabla : " + (new LibrosDatos().consultarNumeroFilas(conexiones[i])).intValue());
         }      
      
         //         CIERRE DE TODAS LAS CONEXIONES ABIERTAS
         listaMensajes.add("PROCEDEMOS AL CIERRE DE TODAS LAS CONEXIONES ABIERTAS");
         for (int i=0; i<numeroConexionesAbiertas; i++) 
         {  //    Cerramos todas las conexiones del pool
            ConexionBaseDatos.getInstancia().cerrarConexion(conexiones[i]);
            listaMensajes.add("Se ha cerrado la conexión del pool : " + i);             
         }     
      }      
   
      return listaMensajes;
}      
}
