/*
 * Creado el 25-feb-04
 *
 * Para cambiar la plantilla para este archivo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
package es.ejie.frmk.control.arranque;

import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.ServletContext;

import es.ejie.frmk.control.excepciones.Q70FrameworkException;

/**
 * @author UFRM004
 *
 * Para cambiar la plantilla para este comentario de tipo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
public class Q70ClassLoaderMap {
	
	private static Q70ClassLoaderMap clMap = new Q70ClassLoaderMap();
	
	private  HashMap hm = new HashMap(29);
	private  HashMap hmEars = new HashMap(29);
	
	public static Q70ClassLoaderMap getInstance()
	{
		return clMap;
	}
	
	private Q70ClassLoaderMap()
	{
		super();
	}
	
	void setServletContext(ServletContext servletContext) throws Q70FrameworkException
	{
		hm.put (Thread.currentThread().getContextClassLoader(),servletContext);
	
		Class claseKey = null;
		try {
			claseKey = doClassForNameKey();
			hmEars.put (claseKey, servletContext);
		} catch (ClassNotFoundException e) {
			throw new Q70FrameworkException(Q70GestorArranqueConfiguracionServidor.ID_COMPONENTE,this.getClass().getName(),"setServletContext","Error con siguiente ServletContext:'"+servletContext.toString()+"'",e);
		}
	}
	
	ServletContext getServletContext() throws Q70FrameworkException
	{
		Object servletContextDeWar = hm.get(Thread.currentThread().getContextClassLoader());
		if ( servletContextDeWar != null ){
			return (ServletContext)servletContextDeWar;
		}
	
		Class claseKey = null;
		try {
			claseKey = doClassForNameKey();
			return (ServletContext)hmEars.get(claseKey);
		} catch (ClassNotFoundException e) {
			throw new Q70FrameworkException(Q70GestorArranqueConfiguracionServidor.ID_COMPONENTE,this.getClass().getName(),"getServletContext","Error al recuperar el ServletContext.",e);
		}
	}
	
	void removeServletContext() throws Q70FrameworkException
	{
		hm.remove(Thread.currentThread().getContextClassLoader());
	
		Class claseKey = null;
		try {
			claseKey = doClassForNameKey();
			hmEars.remove(claseKey);
		} catch (ClassNotFoundException e) {
			throw new Q70FrameworkException(Q70GestorArranqueConfiguracionServidor.ID_COMPONENTE,this.getClass().getName(),"removeServletContext","Error al eliminar el ServletContext",e);
		}
	}
	
	int size()
	{
		return hm.size();
	}
	
	public int getSizeClassloaders()
	{
		return hm.size();
	}

	int getNumeroWarsAplicacion(String codAplicacion) {
		Iterator iter = hm.values().iterator();
		int numWars = 0;
		while (iter.hasNext()) {
			String aplicacion = ((ServletContext) iter.next()).getInitParameter(Q70GestorArranqueConfiguracionServidor.NOMBRE_APLICACION);
			if (aplicacion.equals(codAplicacion))
				numWars++;
		}
		return numWars;
	}	
	
	/**
	 * Se obtiene una instancia la clase Q70FactoriaKey que hacen accesible los componentes de aplicación definidos 
	 * en el EAR. Para cada aplicación de un mismo EAR devolverá una referencia distinta 
	 * @return instancia de accesibilidad de los componentes de aplicación
	 * @throws ClassNotFoundException
	 */
	private Class doClassForNameKey() throws ClassNotFoundException {
		Class claseKey;
		claseKey = Class.forName("es.ejie.frmk.Q70FactoriaKey", false, Thread.currentThread().getContextClassLoader());
		return claseKey;
	}
}