/*
 * Creado el 14-ene-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 es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.arranque.Q70GestorArranqueConfiguracionServidor;
import es.ejie.frmk.infraestructura.logs.base.Q70DatosComunes;
import es.ejie.frmk.infraestructura.logs.base.Q70GestorLogsServidor;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70GestorDatosComunes;
import es.ejie.frmk.infraestructura.seguridad.Q70AuthorizationException;
import es.ejie.frmk.infraestructura.seguridad.Q70Constantes;
import es.ejie.frmk.infraestructura.seguridad.Q70GestorSeguridad;
import es.ejie.frmk.infraestructura.seguridad.Q70InformacionSeguridadUsuario;
import es.ejie.frmk.infraestructura.seguridad.Q70LogonException;
import es.ejie.frmk.infraestructura.seguridad.Q70SeguridadException;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.presentacion.sesiondatos.utilidades.Q70ContextoEJIERuntimeException;

/**
 * @version 1.0 Fecha: 14-ene-04
 */
public class Q70SeguridadPorUsuarioContextoEJIE implements Q70ManejadorSeguridadContextoEJIE, Serializable {
	
	private static final long serialVersionUID = 1L;

	private static final String ID_COMPONENTE = "SEGURIDADPORUSUARIO";

	public boolean isModificable(Q70ContextoJerarquicoEJIE contexto, String nombreCampoModificado) {
		if (Q70SesionDatos.CTX_GLOBAL_APLICACIONGLOBAL.equals(contexto.getTipoContexto())){
			return true;
		}
		if (!isConsultable(contexto, nombreCampoModificado)) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.INFO,
						"Si el campo no es CONSULTABLE tampoco es MODIFICABLE, nombreCampoModificado="
								+ nombreCampoModificado);
			}
			return false;
		}
		String idUsuario = getSesionUsuarioActiva();
		if (idUsuario == null) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.ERROR,
						"No hay un usuario definido en los Datos Comunes del Hilo.");
			}
			throw new Q70ContextoEJIERuntimeException(ID_COMPONENTE, this.getClass().getName(),
					"isModificable", "No hay un usuario definido en los Datos Comunes del Hilo.",
					null);
		}
		Q70ContextoEJIE contextoUsuario = 
			Q70SesionDatos.getSingleton().getContextoGlobal(Q70SesionDatos.CTX_SESION_USUARIO, idUsuario);
		Q70InformacionSeguridadUsuario informacionSeguridadUsuario = 
			(Q70InformacionSeguridadUsuario) contextoUsuario.get(Q70Constantes.SEGURIDAD_USUARIO);

		try {
			Q70GestorSeguridad
					.getSingleton()
					.checkAuthorization(
							informacionSeguridadUsuario,
							Q70GestorArranqueConfiguracionServidor.getGlobalProperty(Q70GestorArranqueConfiguracionServidor.KEY_PERMISO_ADMINISTRADOR_APLICACION),
							Q70GestorArranqueConfiguracionServidor.getGlobalProperty(Q70GestorArranqueConfiguracionServidor.KEY_PERMISO_ADMINISTRADOR));
		} catch (Q70SeguridadException e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.ERROR,
						"Error en el Componente de seguridad'" + e.getClass() + "','"
								+ e.getMessage() + "'");
			}
			throw new Q70ContextoEJIERuntimeException(ID_COMPONENTE, this.getClass().getName(),
					"isModificable", "Error en el Componente de seguridad.", e);
		} catch (Q70AuthorizationException e) {
			return false;
		} catch (Q70LogonException e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.ERROR, "Usuario NO esta logeado '"
						+ e.getClass() + "','" + e.getMessage() + "'");
			}
			throw new Q70ContextoEJIERuntimeException(ID_COMPONENTE, this.getClass().getName(),
					"isModificable", "Usuario NO esta logeado.", e);
		}
		return true;
	}

	public boolean isConsultable(Q70ContextoJerarquicoEJIE contexto, String nombreCampoModificado) {
		return true;
		/*
		 * return
		 * MySecurityHelper.getUsuarioSeguridad(getSesionUsuarioActiva(),"CONSULTABLE",nombreCampoModificado);
		 */
	}

	private String getSesionUsuarioActiva() {
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		try {
			Q70GestorLogsServidor logManager = Q70GestorLogsServidor.getSingleton();
			Q70GestorDatosComunes dataManager = logManager.getCommonDataManager();
			Q70DatosComunes data = dataManager.getData();
			String idUsuario = data.getIdUsuario();

			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, "Usuario activo..." + idUsuario);
			}
			return idUsuario;
		} catch (RuntimeException e1) {
			if (traza.isTraceActive()) {
				traza.trace(ID_COMPONENTE, Q70TraceLevel.ERROR,
						"Error al recuperar Datos de Usuario de la hebra:'" + e1.getClass() + "','"
								+ e1.getMessage() + "'");
			}
			throw new Q70ContextoEJIERuntimeException(ID_COMPONENTE, this.getClass().getName(),
					"getSesionUsuarioActiva", "Error recuperando los Datos Comunes de la hebra.",
					e1);
		}
	}
}
