package es.ejie.frmk.infraestructura.logs.transacciones;

import java.util.HashMap;

import es.ejie.frmk.infraestructura.logs.base.Q70ConstantesLogs;
import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;
import es.ejie.frmk.infraestructura.logs.base.Q70Mensaje;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70Log;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70LogFlushable;

/**
 * Log específico para guardar datos relativos a transacciones.
 * <p>
 * Previamente ha de ser configurado por el <b>Q70GestorLogs</b>. 
 * Los datos de la configuración
 * se encuentran en un fichero de configuración XML.
 * 
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 * 
 */
public class Q70LogTransacciones implements Q70LogTransaccionesInterface,Q70LogFlushable
{

	//única instancia del log de incidencias.
	private static Q70LogTransacciones logTransacciones;

	private Q70Log log;
	//constructor privado sin parametros	
	private Q70LogTransacciones() {
	}

	/**
	  * Proporciona acceso al Q70Log de Transacciones
	  * @return Instancia única del Q70Log de Transacciones
	  */
	synchronized public static Q70LogTransacciones getSingleton()
	{
		if (logTransacciones == null)
			logTransacciones = new Q70LogTransacciones();
		return logTransacciones;
	}

	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.transacciones.Q70LogTransaccionesInterface#log(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void log(
		String codigoFN,
		String metodoFN,
		String datosFN,
		String codRespuesta,
		String resultadoTransaccion,
		String datosRespuesta)
	{
		if (log == null){
			Q70LogTransaccionesServidor.getSingleton().log(codigoFN, metodoFN, datosFN, codRespuesta, resultadoTransaccion, datosRespuesta);
			return;
		}
		
		if (Q70LogTransaccionesServidor.getSingleton().isEnabled()){
			Q70LogTransaccionesServidor.getSingleton().log(codigoFN, metodoFN, datosFN, codRespuesta, resultadoTransaccion, datosRespuesta);
		}

		if (log.isEnabled()){
			HashMap hm = new Q70Mensaje();
			hm.put(Q70ConstantesLogs.COD_FUNCION_NEGOCIO, codigoFN);
			hm.put(Q70ConstantesLogs.METODO_FUNCION_NEGOCIO, metodoFN);
			hm.put(Q70ConstantesLogs.DATOS_FUNCION_NEGOCIO, datosFN);
			hm.put(Q70ConstantesLogs.COD_RESPUESTA, codRespuesta);
			hm.put(Q70ConstantesLogs.RESULTADO_TRANSACCION, resultadoTransaccion);
			hm.put(Q70ConstantesLogs.DATOS_RESPUESTA, datosRespuesta);
	
			try
			{
				log.log(hm);
			}
			catch (NullPointerException ex)
			{
				Q70LogInterno.log(hm.toString());
			}
		}

	}
	/**
	 * @see es.ejie.frmk.infraestructura.logs.transacciones.Q70LogTransaccionesInterface#isEnabled()
	 */
	public boolean isEnabled()
	{
		if (log == null)
			return Q70LogTransaccionesServidor.getSingleton().isEnabled();
		return log.isEnabled() || Q70LogTransaccionesServidor.getSingleton().isEnabled();
	}
	
	/**
	 * Establece el log de transacciones
	 * @param log log
	 */
	public void setLog(Q70Log log)
	{
		this.log = log;
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70LogFlushable#flush()
	 */
	public void flush(){
		log.flush();
	}
}
