package es.ejie.frmk.infraestructura.tablas;

import es.ejie.frmk.Q70FactoriaConstantes;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.poolCache.Q70GestorPool;
import es.ejie.frmk.infraestructura.utilidades.concurrencia.Q70Lock;

public class Q70GestorTablasCodigosServidor extends Q70GestorTablasCodigosBase{

	private static Q70GestorTablasCodigosServidor instancia = null;
	
	private Q70GestorTablasCodigosServidor() {
		super();
		setLock(new Q70Lock(Q70FactoriaConstantes.ID_GESTOR_TABLASCODIGOS));
	}
	
	/** 
	 * Método estático que devuelve la única instancia de la clase <code>Q70GestorTablasCodigosServidor</code>.
	 * @return <code>instancia</code> Instancia de Q70GestorTablasCodigosServidor
	 */
	public static Q70GestorTablasCodigosServidor getSingleton() {
		if (instancia == null) {
			instancia = new Q70GestorTablasCodigosServidor();
		}
		return instancia;
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Administrable#inicializar()
	 */
	public void inicializar() throws Q70FrameworkException{
		if (!getLock().isBloqueo()) {
			throw new Q70FrameworkException(Q70Constantes.ID_COMPONENTE,this.getClass().toString(),"inicializar","Se ha entrado por un método que necesita que el bloqueo del componente esté activo.",null);
		}
		try {
			Class.forName(Q70Constantes.drvHsql);
		}catch (Exception e) {
		}
		
		int maxCat = Q70Constantes.TAMANO_MAX_POOLHSQL;	
		int minCat = Q70Constantes.TAMANO_MIN_POOLHSQL;
		int timeOutCat = Q70Constantes.TIEMPO_TIMEOUT_POOLHSQL;
		
		if (getCatalog().getMaxPoolHsql()!=-1)
			maxCat=getCatalog().getMaxPoolHsql();
		if (getCatalog().getMinPoolHsql()!=-1)
			minCat=getCatalog().getMinPoolHsql();
		if (getCatalog().getTimeoutHsql()!=-1)
			timeOutCat=Q70Constantes.TIEMPO_TIMEOUT_POOLHSQL;
		
		Q70HSQLConnectionPool hConnPool = new Q70HSQLConnectionPool("conexionInternaHSQL", Q70Constantes.urlHsql,Q70Constantes.userHsql,Q70Constantes.passwdHsql,maxCat,minCat,timeOutCat);
		Q70GestorPool.getSingleton().putResourcePool("conexionInternaHSQL",hConnPool);
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.tablas.Q70GestorTablasCodigosBase#doDestruir()
	 */
	protected void doDestruir() {
		instancia = null;
		Q70GestorPool.getSingleton().release("conexionInternaHSQL");
		Q70GestorPool.getSingleton().removeResourcePool("conexionInternaHSQL");
	}

	/**
	 * @see es.ejie.frmk.infraestructura.tablas.Q70GestorTablasCodigosServidorInterface#getMaximoNumeroTablasEnMemoria()
	 */
	public int getMaximoNumeroTablasEnMemoria() {
		return getCatalog().getMaximoEnMemoriaAplicacion();
	}
}