package es.ejie.frmk.infraestructura.poolCache;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.Q70FactoriaConstantes;
import es.ejie.frmk.control.arranque.Q70MBeanBase;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.infraestructura.utilidades.configurador.Q70Administrable;

/**
 * @version 2.0 Fecha: 21-feb-06
 */
public class Q70MBeanGestorCache extends Q70MBeanBase implements Q70MBeanGestorCacheMBean  {
	
	public Q70MBeanGestorCache() {
		super();
	}
	
	/**
	 * @see es.ejie.frmk.control.arranque.Q70MBeanBase#doConfiguracionComponente(java.lang.Object)
	 */
	protected void doConfiguracionComponente(Object configuracion) throws Q70FrameworkException{
		try {
			((Q70GestorCacheServidorInterface)getClaseComponente()).setConfiguracion((Q70BeanConfiguracionCaches)configuracion);
		} catch (Exception e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()){
				traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error en el método doConfiguracionComponente de la clase Q70MBeanGestorCache");
			}
			throw new Q70FrameworkException(Q70Constantes.ID_COMPONENTE,this.getClass().toString(),"doConfiguracionComponente","Se ha producido un error en el método doConfiguracionComponente.",e);
		}
	}

	/**
	 * @see es.ejie.frmk.control.arranque.Q70MBeanBase#anadirComponenteFactoria()
	 */
	protected void anadirComponenteFactoria() {
		Q70Factoria.setGestorCache(getClaseComponente());
	}

	/**
	 * @see es.ejie.frmk.control.arranque.Q70MBeanBase#setComponenteAplicacion(es.ejie.frmk.infraestructura.utilidades.configurador.Q70Administrable)
	 */
	protected void setComponenteAplicacion(Q70Administrable claseComponente) {
		((Q70GestorCache)Q70GestorCache.getSingleton()).setComponenteAplicacion((Q70GestorCacheServidorInterface)claseComponente);		
	}

	private String getTipoComponente() {
		return Q70FactoriaConstantes.ID_GESTOR_CACHE;
	}

	/**
	 * @see es.ejie.frmk.control.arranque.Q70MBeanInterface#getNombreMBean()
	 */
	public ObjectName getNombreMBean() throws MalformedObjectNameException {
		Hashtable atributos = doMapaAtributos(getTipoComponente(), this.getClass().getName(), getAplicacion());
		return new ObjectName(getDominioMBean(),atributos);
	}
	
	//	Monitorización del Gestor de cache
	/**
	 * @see es.ejie.frmk.infraestructura.poolCache.Q70MBeanGestorCacheMBean#getCacheSize(java.lang.String)
	 */
	public int getCacheSize(String idCache){
		return ((Q70GestorCacheServidorInterface) getClaseComponente()).getCacheSize(idCache);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.poolCache.Q70MBeanGestorCacheMBean#freeCache(java.lang.String)
	 */
	public void freeCache(String idCache){
		((Q70GestorCacheServidorInterface) getClaseComponente()).freeCached(idCache);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.poolCache.Q70MBeanGestorCacheMBean#getCacheIds()
	 */
	public List getCacheIds() {
		Map listaCaches = ((Q70GestorCacheServidorInterface) getClaseComponente()).getCaches();
		if (listaCaches == null){
			return Collections.EMPTY_LIST;
		}else{
			return new ArrayList(listaCaches.keySet());
		}
	}
}