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

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;

/**
 * <p>Q70Log especifico para guardar datos relativos a Conectores</p>
 * <p>Previamente ha de ser configurado por el Q70GestorLogs. Los datos de la configuración
 * se encuentran en el un fichero de configuración XML.
 * 
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 * 
 */
public class Q70LogConectores implements Q70LogConectoresInterface,Q70LogFlushable
{

	//instancia unica del log de conectores
	private static Q70LogConectores logConectores;

	//resultado de la transaccion.
	public final static String RESULTADO_COMMIT = "COMMIT";
	public final static String RESULTADO_ROLLBACK = "ROLLBACK";
	public final static String RESULTADO_NA = "NA";

	private Q70Log log;

	private Q70LogConectores() {
	}

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

	/**
	 * @see es.ejie.frmk.infraestructura.logs.conectores.Q70LogConectoresInterface#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 tipoConector,
		String mensajeEnviado,
		String codigoRespuesta,
		String resultadoTransaccion,
		String datosRespuesta)
	{
		if (log == null){
			Q70LogConectoresServidor.getSingleton().log(codigoFN, tipoConector, mensajeEnviado, codigoRespuesta, resultadoTransaccion, datosRespuesta);
			return;
		}
		
		if (Q70LogConectoresServidor.getSingleton().isEnabled()){
			Q70LogConectoresServidor.getSingleton().log(codigoFN, tipoConector, mensajeEnviado, codigoRespuesta, resultadoTransaccion, datosRespuesta);
		}
		
		if (log.isEnabled()) {
			HashMap hm = new Q70Mensaje();
			hm.put(Q70ConstantesLogs.COD_FUNCION, codigoFN);
			hm.put(Q70ConstantesLogs.TIPO_CONECTOR, tipoConector);
			hm.put(Q70ConstantesLogs.MENSAJE_ENVIADO, mensajeEnviado);
			hm.put(Q70ConstantesLogs.CODIGO_RESPUESTA, codigoRespuesta);
			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.conectores.Q70LogConectoresInterface#isEnabled()
	 */
	public boolean isEnabled()
	{
		if (log == null)
			return Q70LogConectoresServidor.getSingleton().isEnabled();
		return log.isEnabled() || Q70LogConectoresServidor.getSingleton().isEnabled();
	}
	
	/**
	 * Establece el log de conectores
	 * @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();
	}
}
