package es.ejie.frmk.presentacion.sesiondatos;

import org.apache.commons.lang.StringUtils;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.presentacion.sesiondatos.contexto.persistencia.Q70ManejadorPersistenciaContextoEJIE;
import es.ejie.frmk.presentacion.sesiondatos.contexto.persistencia.Q70PersistenciaMalInicializadaException;
import es.ejie.frmk.presentacion.sesiondatos.utilidades.Q70ContextoEJIERuntimeException;

/**
 * @author co00660e
 * 
 * Esta clase contiene metodos relacionados con la clase Q70SesionDatos, 
 * pero que se han sacado de esta clase para NO tener problemas de deadlock (abrazo mortal) 
 * con la invalidacion de las sesiones de un usuario.
 * Los metodos de esta clase son estaticos y tienen que ver con la creación 
 * de contextos de sesion usuario y grupo de aplicaciones de usuario.
 * 
 */
public class Q70SesionDatosCrearUsarios {

	private static final String ID_COMPONENTE = "SESIONDATOS";


	private static synchronized Q70ContextoEJIE crearContextoSesiones(String tipoContexto, String idContexto, String rutaXMLConfiguracion)
		throws Q70PersistenciaMalInicializadaException
	{
		Q70ContextoSesionUsuario ctxSesion = null;
		try
		{
			ctxSesion = (Q70ContextoSesionUsuario) Q70ContextosEnMemoriaManejador.getContexto(tipoContexto, idContexto);
		}
		catch (Q70ContextoEJIERuntimeException e)
		{
			ctxSesion = (Q70ContextoSesionUsuario) crearContextoSesionesDeXML(tipoContexto, idContexto, rutaXMLConfiguracion);
			Q70ContextosEnMemoriaManejador.addContexto(ctxSesion);
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive())
			{
				traza.trace(
					ID_COMPONENTE,
					Q70TraceLevel.DEBUG,
					"Creado contexto de sesion:'"
						+ idContexto
						+ "' de '"
						+ tipoContexto
						+ "' en la clase:"
						+ Q70ContextosEnMemoriaManejador.class.toString());
			}
		}
		return ctxSesion;
	}

	/**
	 * Instancia un contexto del tipo indicado 
	 * actualizando las tablas internas de referencias y contadores de contextos
	 * 
	 * @param tipoContexto
	 * @param idContexto
	 * @param rutaXMLConfiguracion
	 * @return
	 * @throws Q70PersistenciaMalInicializadaException
	 */
	private static Q70ContextoJerarquicoEJIE crearContextoSesionesDeXML(String tipoContexto, String idContexto, String rutaXMLConfiguracion)
		throws Q70PersistenciaMalInicializadaException
	{
		Q70ManejadorPersistenciaContextoEJIE manejador = null;
		Q70ContextoSesionUsuario ctxSesion = null;
	
		if (rutaXMLConfiguracion == null)
		{
			if (tipoContexto.equals(Q70SesionDatos.CTX_SESION_USUARIO))
			{
				rutaXMLConfiguracion = Q70SesionDatos.getSingleton().rutaXMLSesionUsuario;
			}
			else
			{
				if (tipoContexto.equals(Q70SesionDatos.CTX_GRUPO_APLICACIONES))
				{
					rutaXMLConfiguracion = Q70SesionDatos.getSingleton().rutaXMLGrupoAplicacion_Prefix + getNombreDelGrupoAplicacion(idContexto) + Q70SesionDatos.getSingleton().rutaXMLGrupoAplicacion_Sufix;
				}
				else
				{}
			}
		}
		manejador = Q70SesionDatos.getSingleton().getManejadorParaXML(rutaXMLConfiguracion);
		try {
			ctxSesion = new Q70ContextoSesionUsuario(manejador.toDynaBean(), manejador, tipoContexto, idContexto);
		} catch (RuntimeException e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			String strMensaje = "Imposible crear contexto de sesion:'" + idContexto + "' de '"
					+ tipoContexto + "' cuyo fichero configuracion es '" + rutaXMLConfiguracion
					+ "'";
			if (traza.isTraceActive())
			{
				traza.trace(ID_COMPONENTE, Q70TraceLevel.ERROR, strMensaje);
			}
			throw new Q70PersistenciaMalInicializadaException(ID_COMPONENTE,
					Q70SesionDatosCrearUsarios.class.toString(), "crearContextoSesionesDeXML",
					strMensaje, e);
		}
		return ctxSesion;
	}

	/**
	 * Devolver el contexto de <b>sesionUsuario</b> perteneciente al usuario con el identificativo 
	 * pasado por parámetro.
	 * <p>
	 * Si no existiese una referencia en memoria se crea dicho contexto 
	 * y se almacena en memoria hasta que se invalide. 
	 * Se le pasa por parámetro el identificador único de contexto y la ruta correspondiente 
	 * a su xml de configuración.
	 * 
	 * @param aContexto Contiene la estructura y datos del contexto a crear
	 * @param idContexto Identificativo del contexto a crear
	 * @return Un Q70ContextoEJIE
	 */
	public static Q70ContextoEJIE crearContextoSesionUsuario(String idContexto, String rutaXMLConfiguracion) throws Q70PersistenciaMalInicializadaException
	{
		return crearContextoSesiones(Q70SesionDatos.CTX_SESION_USUARIO, idContexto, rutaXMLConfiguracion);
	}
	/**
	 * Devolver el contexto de <b>Grupo de Aplicación</b> de usuario perteneciente al grupo de aplicaciones 
	 * y el usuario con el identificativo pasado por parámetro.
	 * Si no existiese una referencia en memoria se crea dicho contexto 
	 * y se almacena en memoria hasta que se invalide.
	 * <p>
	 * Se le pasa por parámetro el identificador unico de contexto y la ruta correspondiente
	 * a su xml de configuración
	 * 
	 * @param idContexto
	 * @param rutaXMLConfiguracion
	 * @return
	 * @throws Q70PersistenciaMalInicializadaException
	 */
	public static Q70ContextoEJIE crearContextoGrupoAplicacion(String idContexto, String rutaXMLConfiguracion)
		throws Q70PersistenciaMalInicializadaException
	{
		return crearContextoSesiones(Q70SesionDatos.CTX_GRUPO_APLICACIONES, idContexto, rutaXMLConfiguracion);
	}

	private static String getNombreDelGrupoAplicacion(String idContextoGrupoAplicacion) {
		return StringUtils.substringBefore(idContextoGrupoAplicacion, Q70SesionDatos.STR_PARA_CONCATENAR_EN_GRUPOAPLICACION);
	}

}
