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

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 accesos.
 * <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 Q70LogAccesos implements Q70LogAccesosInterface,Q70LogFlushable
{
	private static Q70LogAccesos logAccesos;

	private Q70Log log;

	private Q70LogAccesos()	{
	}

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

	/**
	 * @see es.ejie.frmk.infraestructura.logs.accesos.Q70LogAccesosInterface#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 dataSource, String tabla, String sql,String tipoAcceso, String SQLCode)
	{
		if (log == null){
			Q70LogAccesosServidor.getSingleton().log(codigoFN, dataSource, tabla, sql, tipoAcceso, SQLCode);
			return;
		}
		
		if (Q70LogAccesosServidor.getSingleton().isEnabled()){
			Q70LogAccesosServidor.getSingleton().log(codigoFN, dataSource, tabla, sql, tipoAcceso, SQLCode);
		}
		
		if (log.isEnabled()){
			//El la clave debe corresponder con la columna de la tabla del log de Accesos
			HashMap hm = new Q70Mensaje();
			hm.put(Q70ConstantesLogs.COD_FUNCION, codigoFN);
			hm.put(Q70ConstantesLogs.DATASOURCE, dataSource);
			hm.put(Q70ConstantesLogs.SQL, sql);
			hm.put(Q70ConstantesLogs.TABLA_ACCEDIDA, tabla);
			hm.put(Q70ConstantesLogs.TIPO_ACCESO, tipoAcceso);
			hm.put(Q70ConstantesLogs.COD_RESPUESTA, SQLCode);
	
			try //para el fallo que se produce en el debugger
				{
				log.log(hm);
			}
			catch (NullPointerException ex)
			{
				Q70LogInterno.log(hm.toString());
			}
		}
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.accesos.Q70LogAccesosInterface#isEnabled()
	 */
	public boolean isEnabled()
	{
		if (log == null)
			return Q70LogAccesosServidor.getSingleton().isEnabled();
		return log.isEnabled() || Q70LogAccesosServidor.getSingleton().isEnabled();
	}
	
	/**
	 * Establece el log de accesos
	 * @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(); 
	}
}