/*
 * Creado el 15-mar-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.presentacion.sesiondatos;

import java.io.Serializable;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.control.excepciones.Q70GestorDeExcepcionesServidor;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.presentacion.base.Q70Constantes;
import es.ejie.frmk.presentacion.sesiondatos.contexto.persistencia.Q70PersistenciaMalInicializadaException;

/**
 * Se encarga de escuchar las activaciones e invalidaciónes de las HttpSession del servidor, 
 * gestionando el Componente de SesionDatos para mantener actualizada las referencias a memoria 
 * de las HttpSessions y para poder crear, eliminar, gestionar los Contextos de Sesion.
 * 
 * @version 1.0
 * Fecha: 15-mar-04
 */
public class Q70HttpSesionEscuchador implements Serializable, HttpSessionBindingListener
{
	private static final String ID_COMPONENTE = "HTTPSESIONESCUCHADOR";

	private transient String idContextoSession, idContextoGrupoAplicacion, idHttpSession;

	public boolean isInicialized(){
		return null!=idContextoSession && null!=idContextoGrupoAplicacion && null!=idHttpSession;
	}
	
	/**
	 * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
	 */
	public void valueBound(HttpSessionBindingEvent arg0)
	{
		doConstruir(arg0, ">>>>> " + arg0.getSource().toString());
	}

	private void doConstruir(HttpSessionBindingEvent arg0, String mensajeProcedencia){
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		if ( isInicialized() ){
			if (traza.isTraceActive())
			{
				traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, mensajeProcedencia + ", INICILIAZADO");
			}
			return;
		}
		Q70ContextoJerarquicoEJIE contextoAux = (Q70ContextoJerarquicoEJIE)arg0.getSession().getAttribute(Q70Constantes.CONTEXT);
		if (traza.isTraceActive())
		{
			traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, mensajeProcedencia + ", mensaje:" + getMensaje(arg0));
			trazaContextoSesion(mensajeProcedencia + ", ", contextoAux);
		}
		
		Q70SesionDatos.getSingleton().addContextoSesionUsuario(arg0.getSession());
		try {
			Q70SesionDatos.getSingleton().addIdSesionAContextosDeSesion(contextoAux, arg0.getSession().getId());
		} catch (Q70PersistenciaMalInicializadaException e) {
			Q70GestorDeExcepcionesServidor.getSingleton().recogerThrowable(new Q70FrameworkException(ID_COMPONENTE,this.getClass().toString(),"doConstruir","Se ha producido un error en el método doConstruir.",e));
		}

		if ( contextoAux != null ){
			idHttpSession = arg0.getSession().getId();
			idContextoSession = Q70SesionDatos.getSingleton().getContexto(contextoAux,Q70SesionDatos.CTX_SESION_USUARIO).getIdContexto();
			idContextoGrupoAplicacion = Q70SesionDatos.getSingleton().getContexto(contextoAux,Q70SesionDatos.CTX_GRUPO_APLICACIONES).getIdContexto(); 
		}
	}

	/**
	 * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
	 */
	public void valueUnbound(HttpSessionBindingEvent arg0)
	{
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		if (traza.isTraceActive())
		{
			traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, "<<<<< " + arg0.getSource().toString() + ", mensaje:" + getMensaje(arg0));
			trazaContextoSesion("<<<<< " + arg0.getSource().toString() + ", ", arg0.getSession().getAttribute(Q70Constantes.CONTEXT));
		}

		Q70SesionDatos.getSingleton().removeContextoSesionUsuario(arg0.getSession());
		
		if (arg0.getSession().getAttribute(Q70Constantes.CONTEXT) == null)
		{
			if (traza.isTraceActive())
			{
				traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, "<<<<< " + arg0.getSource().toString() + ": Objecto de contexto en sesion NULO");
			}
			return;
		}
		Q70SesionDatos.getSingleton().invalidateContextosDeSesion((Q70ContextoJerarquicoEJIE) arg0.getSession().getAttribute(Q70Constantes.CONTEXT), arg0.getSession().getId());
		
		idHttpSession = idContextoSession = idContextoGrupoAplicacion = null; 
		
		if (traza.isTraceActive())
		{
			traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, "<<<<< " + arg0.getSource().toString() + " acabado correctamente");
		}
	}
	
	private void trazaContextoSesion(String preMensaje, Object contextoObj)
	{	
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		if (contextoObj != null)
		{
			Q70ContextoEJIE contexto = (Q70ContextoEJIE) contextoObj;
			Q70ContextoSesionUsuario ctxSesion =
				(Q70ContextoSesionUsuario) Q70SesionDatos.getSingleton().getContexto(contexto, Q70SesionDatos.CTX_SESION_USUARIO);

			if (ctxSesion != null)
			{
				traza.trace(
					ID_COMPONENTE,
					Q70TraceLevel.DEBUG,
					preMensaje + "contexto Usuario   :'" + ctxSesion.getTipoContexto() + "','" + ctxSesion.getIdContexto() + "'");
			}
			ctxSesion = (Q70ContextoSesionUsuario) Q70SesionDatos.getSingleton().getContexto(contexto, Q70SesionDatos.CTX_GRUPO_APLICACIONES);
			if (ctxSesion != null)
			{
				traza.trace(
					ID_COMPONENTE,
					Q70TraceLevel.DEBUG,
					preMensaje + "contexto GrupoAplic:'" + ctxSesion.getTipoContexto() + "','" + ctxSesion.getIdContexto() + "'");
			}
		}
		else
		{
			traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, preMensaje + "contexto de sesion NULO.");
		}
	}

	private String getMensaje(HttpSessionEvent arg0)
	{
		return "'" + arg0.getSession().getId() + "',clase del evento:'" + arg0.getSource().getClass() + "'";
	}
}
