/*
 * Creado el 24-nov-03
 *
 * 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.presentacion.sesiondatos;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import es.ejie.frmk.presentacion.sesiondatos.utilidades.Q70ContextoEJIERuntimeException;

/**
 * @version 1.0
 * Fecha: 24-nov-03
 * 
 * Esta clase gobierna la gestion de los contextos globales de Geremua.
 * Contiene en memoria dichos contextos, organizados segun su tipo y su identificativo.
 * 
 * @see es.ejie.frmk.presentacion.sesiondatos.Q70ContextoGlobal
 */
public class Q70ContextosEnMemoriaManejador
{
	private static List contextoNiveles = new ArrayList(4);
	private static List contextoNivelesId = new ArrayList(4);

	private static final String ID_COMPONENTE = "CTXGLOBALESDISPATCHER";

	public synchronized static void reconfigure(){
		int index = contextoNivelesId.indexOf(Q70SesionDatos.CTX_GLOBAL_SISTEMA_TECNICO);
		if (index != -1)
		{
			((Map) contextoNiveles.get(index)).clear();
		}
		index = contextoNivelesId.indexOf(Q70SesionDatos.CTX_GLOBAL_ENTIDAD);
		if (index != -1)
		{
			((Map) contextoNiveles.get(index)).clear();
		}
		index = contextoNivelesId.indexOf(Q70SesionDatos.CTX_GLOBAL_DEPARTAMENTO);
		if (index != -1)
		{
			((Map) contextoNiveles.get(index)).clear();
		}
	}
	
	/**
	 * Añade un nuevo Q70ContextoGlobal a la estructura en memoria
	 * @param contexto Un Q70ContextoGlobal
	 */
	public static void addContexto(Q70ContextoJerarquicoEJIE contexto)
	{
		if (!contextoNivelesId.contains(contexto.getTipoContexto()))
		{
			Map nuevoTipoContextoGlobales = new HashMap(5);
			contextoNivelesId.add(contexto.getTipoContexto());
			contextoNiveles.add(contextoNivelesId.indexOf(contexto.getTipoContexto()), nuevoTipoContextoGlobales);
		}

		Map aux = (Map) contextoNiveles.get(contextoNivelesId.indexOf(contexto.getTipoContexto()));
		aux.put(contexto.getIdContexto(), contexto);
	}

	/**
	 * Borra la referencia de memoria de un contexto del tipo e id dado.
	 * @param tipoContexto Tipo del contexto a eliminar de memoria
	 * @param idContexto Id del contexto a eliminar de memoria
	 */
	public static void removeContexto(String tipoContexto, String idContexto)
	{
		int index = contextoNivelesId.indexOf(tipoContexto);
		if ( index == -1 ){
			return;
		}
		Map aux = (Map) contextoNiveles.get(index);
		aux.remove(idContexto);
	}
	
	/**
	 * Borra la referencia de memoria de todos los contextos de Grupo de Aplicacion de un usuario dado.
	 * @param idContexto Id del contexto a eliminar de memoria
	 */
	public static void removeContextosGruposAplicaciones(String idContexto)
	{
		int index = contextoNivelesId.indexOf(Q70SesionDatos.CTX_GRUPO_APLICACIONES);
		if ( index == -1 ){
			return;
		}
		Map aux = (Map) contextoNiveles.get(index);
		
		String auxSufijoGrupoAplicacion = Q70SesionDatos.getSingleton().getSufijoIdContextoGrupoAplicacion(idContexto);
		
		// Recuperar todas la lista de claves de contextos de grupo de aplicaciones a borrar
		ArrayList listaABorrar = new ArrayList(5);

		Iterator it1 = aux.keySet().iterator();
		while (it1.hasNext()) {
			String element = (String) it1.next();
			if (element.indexOf(auxSufijoGrupoAplicacion) != -1) {
				listaABorrar.add(element);
			}
		}

		Iterator it2 = listaABorrar.iterator();
		while (it2.hasNext()) {
			String element = (String) it2.next();
			aux.remove(element);
		}
	}
	
	/**
	 * Devuelve la referencia en memoria de un contexto del tipo e id dado.
	 * @param tipoContexto Tipo del contexto a obtener de memoria
	 * @param idContexto Id del contexto a obtener de memoria
	 * @return Un Q70ContextoGlobal almacenado en memoria
	 */
	public static Q70ContextoEJIE getContexto(String tipoContexto, String idContexto)
	{
		int index = contextoNivelesId.indexOf(tipoContexto);
		Map aux = null;
		if (index == -1)
		{
			throw new Q70ContextoEJIERuntimeException(
				ID_COMPONENTE,
				Q70ContextosEnMemoriaManejador.class.toString(),
				"getContextoSesion(String tipoContexto, String idContexto)",
				"Tipo de contexto no existe:'" + tipoContexto + "','"+idContexto+"'",
				null);
		}

		aux = (Map) contextoNiveles.get(index);
		Object contextoGlobal = aux.get(idContexto);
		if (contextoGlobal == null)
		{
			throw new Q70ContextoEJIERuntimeException(
				ID_COMPONENTE,
				Q70ContextosEnMemoriaManejador.class.toString(),
				"getContextoSesion(String tipoContexto, String idContexto)",
				"Contexto no existe con el identificativo:'" + tipoContexto + "','"+idContexto+"'",
				null);
		}

		return (Q70ContextoEJIE) contextoGlobal;
	}

	/**
	 * Devuelve todos los contextos de un tipo dado.
	 * @param tipoContexto Tipo del contexto a obtener de memoria
	 */
	public static Collection getContextosDeTipo(String tipoContexto)
	{
		int index = contextoNivelesId.indexOf(tipoContexto);
		if (index == -1)
		{
			throw new Q70ContextoEJIERuntimeException(
				ID_COMPONENTE,
				Q70ContextosEnMemoriaManejador.class.toString(),
				"getIdContextos(String tipoContexto)",
				"Tipo de contexto no existe:'" + tipoContexto + "'",
				null);
		}

		return Collections.unmodifiableCollection(((Map) contextoNiveles.get(index)).values());
	}
}
