package es.ejie.frmk.infraestructura.seguridad;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import n38c.exe.N38API;

import org.w3c.dom.Document;

import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesExcepcion;
import es.ejie.frmk.infraestructura.utilidades.general.Q70UtilidadesGenerales;
import es.ejie.frmk.infraestructura.utilidades.xml.Q70UtilidadesXML;


/**
 * La clase encapsula la información de la sesión de usuario.
 * <p>
 * La información de usuario se obteniene mediante una invocación a <code>n38itemSesion</code>
 * del API de XL-Nets. Las autorizaciones del usuario a cada una de las aplicaciones se solicitan 
 * mediante llamadas a <code>n38itemSeguridad</code> del API de XL-Nets.
 * <p>
 * Implementa el interfaz <code>Q70InformacionSeguridadInterface</code>, que proporciona el API para 
 * interrogar por los parámetros de la información de sesion mantenida en el sistema XL-Nets.
 */
public class Q70InformacionSeguridadUsuario implements Q70InformacionSeguridadInterface, Externalizable{
	Document documentSesion = null;
	N38API n38api;
	HashMap funciones = null;

/**
 * Método constructor.
 */
public Q70InformacionSeguridadUsuario() {
	super();
}
/**
 * Método constructor.
 * 
 * @param req Petición a tratar
 * @throws Q70LogonException
 * @throws Q70SeguridadException
 */
public Q70InformacionSeguridadUsuario(HttpServletRequest req)throws Q70SeguridadException, Q70LogonException{
	buildSecurityInf(req);	
}

/**
 * Método que invoca a XL-Nets para obtener la información de seguridad de usuario.
 * <p>
 * <ul>
 * <li>Si existe información de sesión, es decir, XL-Nets devuelve un XML de sesión válido, el usuario está autenticado.</li>
 * <li>Si no existe información de sesión, es decir, XL-Nets devuelve un XML de error, el método lanzará una excepción <code>Q70LogonException</code> con la información necesaria para poder redirigir el flujo hacia la página de Logon de XL-Nets.</li>
 * </ul> 
 * <p> 
 * @param req Petición a tratar
 * @throws Q70SeguridadException
 * @throws Q70LogonException
 */
protected void buildSecurityInf(HttpServletRequest req)throws Q70SeguridadException, Q70LogonException{
	funciones = new HashMap();	
	n38api = new N38API(req);
	documentSesion = n38api.n38ItemSesion();
	try{
		if(Q70UtilidadesXML.searchDomNode(documentSesion, Q70Constantes.SESSION) == null){
			throw new Q70LogonException("Q70InformacionSeguridadUsuario", "", Q70GestorSeguridad.getSingleton().getLogonPage(), null);
		}
	}catch(Q70UtilidadesExcepcion ue){
		throw new Q70LogonException("Q70InformacionSeguridadUsuario", "", Q70GestorSeguridad.getSingleton().getLogonPage(), ue);	
	}
}

/**
 * @see es.ejie.frmk.infraestructura.seguridad.Q70InformacionSeguridadInterface#getSessionSecurityInf(java.lang.String)
 */
public Object getSessionSecurityInf(String valor) throws Q70SeguridadException{
	String val = Q70UtilidadesGenerales.replaceString(Q70Constantes.RUTAVALOR,"?",valor);
	try{
		return Q70UtilidadesXML.searchDomVector(documentSesion,val);
	}catch(Q70UtilidadesExcepcion ue){
		throw new Q70SeguridadException("Q70InformacionSeguridadUsuario", "getSessionSecurityInf", "No encontrada informacion para " + valor , ue);
	}
}

/**
 * Devuelve una instancia del Toolkit de XLNet para la sesión de la petición.
 * @param contextoSeguridad contexto de seguridad de la sesión
 */	
public N38API getXLNESessionTolkit() throws Q70SeguridadException{
	return n38api;
}

protected HashMap getSecurityAuthorizations(){
	return funciones;
}

protected void setSecurityAuthorizations(HashMap funcionesAutorizacion){
	funciones = funcionesAutorizacion;
}

protected N38API getToolKit(){
	return n38api;
}

public void setTestToolKit(N38API unN38API){
	n38api = unN38API;
	documentSesion = n38api.n38ItemSesion();
}

/**
 * @see java.lang.Object#toString()
 */
public String toString(){
	return "\n<ContextoSeguridad>\n<Sesion>" + documentSesion + 
	"</sesion>\n<funciones>" + funciones + 
	"</recursos>\n</ContextoSeguridad>";
}
/**
 * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
 */
public void readExternal(ObjectInput ois)throws IOException, ClassNotFoundException{
		
}
/**
 * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput)
 */
public void writeExternal(ObjectOutput oos)throws IOException{
	
}

/**
 * @return Returns the documentSesion.
 */
protected Document getDocumentSesion() {
	return documentSesion;
}
}