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

import java.util.Enumeration;
import java.util.Map;

import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;

import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70Log;
import es.ejie.frmk.infraestructura.utilidades.concurrencia.Q70Lock;


/**
 * Implmentación específica del interfaz Q70Log para Log4j.
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 */
public class Q70LogImpl implements Q70Log
{
	private Q70Lock lock = null;
	private Logger logger;
	
	protected Q70LogImpl(Logger logger, Q70Lock lock)
	{
		this.logger=logger;
		this.lock=lock;
	}
	/**
	 * realiza la escritura del mensaje si el log está activado.
	 * @param hm representa el mensaje a escribir
	 */
	public void log(Map hm)
	{
		lock.entradaZonaCritica();		
		try {
			logger.debug(hm);	
		}catch(NullPointerException npe){
			if (Q70LogInterno.isEnabled())
				npe.printStackTrace();
		}catch (RuntimeException e) {
			throw e;
		} finally {
			lock.salidaZonaCritica();
		}		
	}
	/**
	 * @return si el log está o no activado.
	 */
	public boolean isEnabled()
	{
		lock.entradaZonaCritica();		
		try {
			return logger.isDebugEnabled();			
		} catch (RuntimeException e) {
			throw e;
		} finally {
			lock.salidaZonaCritica();
		}
	}
	
	/** 
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70Log#flush()
	 */
	public void flush (){

		Appender appender=null;
		Enumeration enumAppender = logger.getAllAppenders();
		
		while (enumAppender.hasMoreElements()){
			appender = (Appender)enumAppender.nextElement();
			if (appender instanceof FileAppender){
				if (!((FileAppender)appender).getImmediateFlush()){
					((FileAppender)appender).setImmediateFlush(true);
				}
			}
		}
	}
	
}