package es.ejie.frmk.infraestructura.poolCache;


/**
 * Clase que represena un Almacen de pools, que consiste en una serie de pools independientes e 
 * identificados por una clave dentro del Almacen. Cada uno de estos pools, a su vez, manejan
 * un determinado numero de recursos 'pooleables' determinados por las clases clientes 
 * (conexiones a bbdd, conexiones a hypersonic, ...) 
 */
public interface Q70AlmacenRecursosPool
{
    /**
     * Obtiene un recurso de un pool especificado
     * 
     * @param key Clave para identificar el pool
     * @return Recurso de pool 
     * @throws Q70PoolException
     */
    public Q70RecursoPoolable getResource(Object key) throws Q70PoolException;

    /**
     * Devuelve el recurso especificado de un pool especificado
     * 
     * @param key Clave para identificar el pool
     * @param resource Recurso especificado
     */
    public void freeResource(Object key, Q70RecursoPoolable resource);

    /**
     * Libera todos los recursos de todos los pools.
     */
    public void release();
    
    /**
     * Libera todos los recursos de un pool especificado
     * 
     * @param key Clave para identificar el pool
     */
    public void release(Object key);
    
    /**
     * Agrega un recurso en el pool especificado dentro del Almacen. 
     * 
     * @param key Clave para identificar el pool
     * @param resourcePool Recurso especificado
     */
    public void putResourcePool(Object key, Q70RecursoPool resourcePool);
    
    /**
     * Elimina un pool especificado del Almacen.
     * 
     * @param key Clave para identificar el pool
     */
    public void removeResourcePool(Object key);
}
