/*
 * Creado el 02-feb-04
 */
package es.ejie.frmk.infraestructura.poolCache;

import java.util.ArrayList;
import java.util.Map;

import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.utilidades.configurador.Q70Administrable;

/**
 * @version 1.0 Fecha: 02-feb-04
 * @version 2.0 Fecha: 16-feb-06
 */
public interface Q70GestorCacheServidorInterface extends Q70GestorCacheInterface, Q70Administrable {

	/**
	 * Obtiene un ArrayList con el nombre de las clases de los objetos cacheados
	 * @param cache identificativo de la caché
	 * @return un objeto ArrayList
	 */
	public ArrayList getCachedObjects(String cache);

	/**
	 * Se elimina de la caché el objeto cuyo nombre referente se pasa como
	 * parámetro
	 * @param cache identificativo de la caché
	 * @param nombre nombre del objeto cacheado a liberar
	 */
	public void freeCachedObject(String cache, String nombre);

	/**
	 * Vacía la caché
	 * @param cache identificativo de la caché
	 */
	public void freeCached(String cache);

	/**
	 * Obtiene el número de elementos en la caché
	 * @param cache identificativo de la caché
	 * @return un entero
	 */
	public int getCacheSize(String cache);
	
	/**
	 * Añade un objeto a la cache. Si ya existe en la cache un objeto con la
	 * misma clave pero con distinto valor, entonces devuelve el objeto anterior
	 * y añade el nuevo (lo sobreescribe). En otro caso, devuelve null
	 * @param cache identificativo de la caché
	 * @param clave clave del objeto a añadir a la cache
	 * @param objeto objeto a añadir a la cache
	 * @return un objeto, si ya existía un objeto en la caché y su valor era
	 *         diferente al que se va a añadir. null, en otro caso.
	 */
	public Object addElement(String cache, Object clave, Object objeto);

	/**
	 * Obtiene el objeto cuya clave se pasa como parámetro. En caso de que no se
	 * encuentre en la cache, devuelve null
	 * @param cache identificativo de la caché
	 * @param clave clave del objeto a recuperar de la cache
	 * @return un objeto si se encuentra en la cache. null en caso contario
	 */
	public Object getElement(String cache, Object clave);

	/**
	 * Método que establece la configuración de todas las cachés 
	 * @param Q70BeanConfiguracionCaches configuracion caches
	 * @throws Q70FrameworkException 
	 */
	public void setConfiguracion(Q70BeanConfiguracionCaches configuracion) throws Q70FrameworkException;
	
	/**
	 * Método que recupera la configuración de todas las cachés 
	 * @return Q70BeanConfiguracionCaches configuracion caches
	 */
	public Q70BeanConfiguracionCaches getConfiguracion();
	
	/**
	 * Método que recupera la configuración de todas las cachés por defecto
	 * @param configuracionCachesAplicacion
	 * @return Q70BeanConfiguracionCaches configuracion caches por defecto
	 */
	public Q70BeanConfiguracionCaches getConfiguracionCachesPorDefecto(Map configuracionCachesAplicacion);
	
	/**
	 * Método que añade una referencia de todas las caches por defecto de una
	 * aplicación. Este método es para que la clase Q70GestorCacheServidor
	 * guarde una referencia a dichas caches para hacer posible la
	 * reconfiguración de las caches por defecto en caliente.
	 * @param Q70GestorCacheInterface referencia al Q70GestorCacheAplicacion
	 * @param Map HashMap con las diferentes caches por defecto de la aplicacion
	 */
	public void addCachesPorDefecto(Q70GestorCacheInterface gestorCacheAplicacion, Map cachesPorDefecto);
	
	/**
	 * Método que elimina una referencia de todas las caches por defecto de una
	 * aplicación. Este método es para que la clase Q70GestorCacheServidor
	 * elimine una referencia a dichas caches para hacer posible la
	 * reconfiguración de las caches por defecto en caliente.
	 * @param Q70GestorCacheInterface referencia al Q70GestorCacheAplicacion
	 */
	public void removeCachesPorDefecto(Q70GestorCacheInterface gestorCacheAplicacion);
	
	/**
	 * @return Returns the caches.
	 */
	public Map getCaches();
}
