
package es.ejie.frmk.infraestructura.logs.base.impl;

import java.util.Map;

import org.apache.log4j.helpers.LogLog;

import es.ejie.frmk.infraestructura.logs.base.Q70DatosComunes;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70GestorDatosComunes;

/**
 * Implementación del interfaz Q70GestorDatosComunes específica para uso con Log4j
 * utiliza MDC para guardar y devolver los valores que compartirán los logs
 * En realidad se trata de una hash cuya clave es el thread y cuyos elementos son a su
 * vez una hash de propiedades
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 * 
 */
public class Q70GestorDatosComunesImpl implements Q70GestorDatosComunes
{
	public final static String CODIGO_PAIS = "COD_PAIS";
	public final static String CANAL = "CANAL";
	public final static String CODIGO_ENTIDAD = "COD_ENTIDAD";
	public final static String ID_USUARIO = "ID_USUARIO";
	public final static String ID_SESION = "ID_SESION";
	public final static String CODIGO_OPERACION = "COD_OPERACION";
	public final static String NUMERO_OPERACION = "NUM_OPERACION";
	public final static String CODIGO_PAGINA = "COD_PAGINA";
	public final static String NUMERO_PAGINA = "NUM_PAGINA";
	public final static String APLICACION= "APLICACION";
	
	/**
	 * Introduce los valores a compartir y los asocia al thread actual.
	 * @param data Objeto con el contenido de los datos a guardar
	 */
	public void setData(Q70DatosComunes data)
	{
		//this try statement intends to provide a solution for error during debugging
		//process. MDC is related to current thread and debugger modifies 
		// usual thread's exection workflow.
		
		try
		{
			clearData();
			if(data.getCodigoPais()!=null)
				Q70DatosThreadLocal.put(CODIGO_PAIS, data.getCodigoPais());
			if(data.getCanal()!=null)
				Q70DatosThreadLocal.put(CANAL, data.getCanal());
			if(data.getCodigoEntidad()!=null)
				Q70DatosThreadLocal.put(CODIGO_ENTIDAD, data.getCodigoEntidad());
			if(data.getIdUsuario()!=null)
				Q70DatosThreadLocal.put(ID_USUARIO, data.getIdUsuario());
			if(data.getIdSesion()!=null)
				Q70DatosThreadLocal.put(ID_SESION, data.getIdSesion());
			if(data.getCodigoOperacion()!=null)
				Q70DatosThreadLocal.put(CODIGO_OPERACION, data.getCodigoOperacion());
			if(data.getNumeroOperacion()!=null)
				Q70DatosThreadLocal.put(NUMERO_OPERACION, data.getNumeroOperacion());
			if(data.getCodigoPagina()!=null)
				Q70DatosThreadLocal.put(CODIGO_PAGINA, data.getCodigoPagina());
			if(data.getNumeroPagina()!=null)
				Q70DatosThreadLocal.put(NUMERO_PAGINA, data.getNumeroPagina());
			if(data.getAplicacion()!=null)
				Q70DatosThreadLocal.put(APLICACION, data.getAplicacion());
			
		}
		catch (Exception e)
		{
			LogLog.debug("Error al inicializar las variables comunes" +e.getMessage());
		}

	}
	
	/**
	 * Elimina los datos de la colección para liberar memoria. 
	 */
	public void clearData()
	{
		
		try
		{
			Q70DatosThreadLocal.remove(CODIGO_PAIS);
			Q70DatosThreadLocal.remove(CANAL);
			Q70DatosThreadLocal.remove(CODIGO_ENTIDAD);
			Q70DatosThreadLocal.remove(ID_USUARIO);
			Q70DatosThreadLocal.remove(ID_SESION);
			Q70DatosThreadLocal.remove(CODIGO_OPERACION);
			Q70DatosThreadLocal.remove(NUMERO_OPERACION);
			Q70DatosThreadLocal.remove(CODIGO_PAGINA);
			Q70DatosThreadLocal.remove(NUMERO_PAGINA);
			Q70DatosThreadLocal.remove(APLICACION);
		}
		catch (NullPointerException e)
		{
			LogLog.debug(e.getMessage());
		}
	}
	
	
	/** 
	 * Devuelve los datos asociados al thread actual.
	 * @return objeto con los datos
	 */
	public Q70DatosComunes getData()
	{
		Q70DatosComunes data = new Q70DatosComunes();
		
		data.setCodigoPais((String)Q70DatosThreadLocal.get(CODIGO_PAIS));
		data.setCanal((String)Q70DatosThreadLocal.get(CANAL));
		data.setCodigoEntidad((String)Q70DatosThreadLocal.get(CODIGO_ENTIDAD));
		data.setIdUsuario((String)Q70DatosThreadLocal.get(ID_USUARIO));
		data.setIdSesion((String)Q70DatosThreadLocal.get(ID_SESION));
		data.setCodigoOperacion((String)Q70DatosThreadLocal.get(CODIGO_OPERACION));
		data.setNumeroOperacion((String)Q70DatosThreadLocal.get(NUMERO_OPERACION));
		data.setCodigoPagina((String)Q70DatosThreadLocal.get(CODIGO_PAGINA));
		data.setNumeroPagina((String)Q70DatosThreadLocal.get(NUMERO_PAGINA));
		data.setAplicacion((String)Q70DatosThreadLocal.get(APLICACION));
				
		return data;
	
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70GestorDatosComunes#getProperty(java.lang.String)
	 */
	public String getProperty(String property)
	{
		return (String)Q70DatosThreadLocal.get(property);
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70GestorDatosComunes#getDataMap()
	 */
	public Map getDataMap()
	{
		try
		{
			return Q70DatosThreadLocal.getContext();
		}
		catch(NullPointerException npe)
		{
			return null;
		}
	}

}
