package es.ejie.frmk.infraestructura.seguridad;

import javax.servlet.http.HttpServletRequest;

/**
 * Esta interface encapsula la funcionalidad ofrecida por el componente <b>Gestor de Seguridad</b>.
 */
public interface Q70GestorSeguridadInterface {

	/**
	 * Para obtener un contexto de seguridad haciendo logon de aplicacion.
	 * @param aplicacion codigo de aplicacion
	 * @return ContextoSeguridad 
	 */
	public Q70InformacionSeguridadAplicacion createSecurityApplicationInfo(String aplicacion) throws Q70SeguridadException;
	
	/**
	 * Solicita la eliminación de una sesión de XLNets
	 * @param inf Información de seguridad
	*/
	public void destroySession(Q70InformacionSeguridadInterface inf) throws Q70SeguridadException;

	/**
	 * Reconstruye la información de seguridad de aplicacion haciendo una nueva peticion a XLNets
	 * @param aplicacion codigo de aplicacion
	 * @return ContextoSeguridad 
	 */
	public void rebuildAppSecurityInfo(Q70InformacionSeguridadInterface inf, String aplicacion) throws Q70SeguridadException;

	/**
	 * Para obtener un contexto de seguridad cuando se ha hecho un logon personalizado.
	 * @param HttpServletRequest 
	 * @return ContextoSeguridad, Q70LogonException 
	 */	
	public Q70InformacionSeguridadUsuario createSecurityUserInfo(HttpServletRequest req) throws Q70SeguridadException,Q70LogonException;
	
	/**
	 * Para obtener un contexto de seguridad cuando se ha hecho un logon personalizado.
	 * @param HttpServletRequest
	 * @return ContextoSeguridad, Q70LogonException  
	 */	
	public void rebuildUserSecurityInfo(Q70InformacionSeguridadUsuario inf, HttpServletRequest req) throws Q70SeguridadException,Q70LogonException;
	
	/**
	 * Para obtener usuario y password de conexion a BD de una aplicacion dada
	 * @param contextoSeguridad objeto con la información de seguridad
	 * @param recurso codigo de aplicacion 
	 * @return ContextoSeguridad 
	 */		 
	public String[] getDBUser(Q70InformacionSeguridadUsuario usuarioInf, String recurso) throws Q70SeguridadException, Q70AuthorizationException, Q70LogonException;

	/**
	 * Chequea si un usuario tiene acceso a una función de autorización de una aplicación
	 * @param usuarioInf objeto con la información de seguridad
	 * @param aplicacion codigo de aplicacion
	 * @param funcionAutorizacion codigo de la función de autorización
	 * @throws Q70SeguridadException
	 */
	public void checkAuthorization(Q70InformacionSeguridadUsuario usuarioInf, String aplicacion, String funcionAutorizacion) throws Q70SeguridadException, Q70AuthorizationException, Q70LogonException;

	/**
	 * Este método es invocado desde los custom tags.
	 * Devuelve 0, 1 (visible y accesible; oculto) en función del tipo de presentacion 
	 * para el usuario dado. 
	 * 
	 * @param usuarioInf Informacion de seguridad del usuario
	 * @param aplicacion Codigo de aplicacion 
	 * @param secureId Identificador del permiso de seguridad
	 * @return 0 (visible y accesible), 1 (oculto) 
	 * 
	 * @throws Q70SeguridadException
	 * @throws Q70LogonException
	 */
	public int getCustomTagDisplayMode(Q70InformacionSeguridadUsuario usuarioInf, String aplicacion, String secureId) throws Q70SeguridadException, Q70LogonException;
	/**
	 * Devuelve informacion de session de un objeto de seguridad
	 * @param sesionInf objeto con la información de seguridad
	 * @param parametro codigo de aplicacion 
	 * @return Object 
	 */		 	
	public Object getSessionSecurityInf(Q70InformacionSeguridadInterface sesionInf, String parametro) throws Q70SeguridadException;		
	
	/**
	 * Devuelve el identificador del usuario de la sesión
	 * @param sesionInf objeto con la información de seguridad
	 * @return String
	 * @throws Q70SeguridadException
	 */
	public String getSessionId(Q70InformacionSeguridadInterface sesionInf) throws Q70SeguridadException;

	/**
	 * Devuelve el identificador de la organización a la que pertenece el usuario de la sesión
	 * @param sesionInf objeto con la información de seguridad
	 * @return String
	 * @throws Q70SeguridadException
	 */
	public String getSessionOrganization(Q70InformacionSeguridadInterface sesionInf) throws Q70SeguridadException;
	
	/**
	 * Devuelve el identificador de la entidad a la que pertenece el usuario de la sesión
	 * @param sesionInf objeto con la información de seguridad
	 * @return String
	 * @throws Q70SeguridadException
	 */
	public String getSessionEntity(Q70InformacionSeguridadInterface sesionInf) throws Q70SeguridadException;
	/**
	 * Nos indica si el objeto con informacion de seguridad esta correctamente inicializado, es decir,
	 * si tiene información de sesión de XLNets. Cuando se serializa el contexto, la información de
	 * seguridad no se guarda aunque se serializa el objeto. Por eso, cuando se desserializa, se 
	 * tiene el objeto en el contexto pero sin información de sesion XLNets por lo que será
	 * necesario reconstruir el objeto.
	 * @param sesionInf objeto con la información de seguridad
	 * @return boolean
	 */
	public boolean isInitialized(Q70InformacionSeguridadInterface sesionInf);	
}
