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

import java.io.PrintWriter;
import java.io.StringWriter;
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 escribir incidencias.
 * <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.
 * 
 * @see es.ejie.frmk.infraestructura.logs.base.Q70GestorLogs
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 * 
 */
public class Q70LogIncidenciasServidor implements Q70LogIncidenciasInterface,Q70LogFlushable 
{
	private static Q70LogIncidenciasServidor logIncidencias;
	
	//gravedad y componente usados por defecto.
	protected final static String GRAVEDAD_DEFECTO = "ERROR";
	protected final static String COMPONENTE_DEFECTO = "GESTOR DE EXCEPCIONES";

	private Q70Log log;

	private Q70LogIncidenciasServidor()	{
	}

	/**
	  * Proporciona acceso al Q70Log de Incidencias
	  * @return Instancia única del Q70Log de Incidencias
	  */
	synchronized public static Q70LogIncidenciasServidor getSingleton()
	{
		if (logIncidencias == null)
			logIncidencias = new Q70LogIncidenciasServidor();

		return logIncidencias;
	}

	/**
	 * Componente por defecto: "GESTOR DE EXCEPCIONES". Nivel de gravedad por defecto: ERROR.
	 * @see es.ejie.frmk.infraestructura.logs.incidencias.Q70LogIncidenciasInterface#log(java.lang.Throwable)
	 */
	public void log(Throwable e)
	{
		log(e, COMPONENTE_DEFECTO, GRAVEDAD_DEFECTO);
	}

	/**
	 * Nivel de gravedad por defecto: ERROR.
	 * @see es.ejie.frmk.infraestructura.logs.incidencias.Q70LogIncidenciasInterface#log(java.lang.Throwable, java.lang.String)
	 */
	public void log(Throwable e, String componente)
	{
		log(e, componente, GRAVEDAD_DEFECTO);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.logs.incidencias.Q70LogIncidenciasInterface#log(java.lang.Throwable, java.lang.String, java.lang.String)
	 */
	public void log(Throwable e, String componente, String gravedad)
	{
		HashMap hm = new Q70Mensaje();
		//pasar la pila a un String
		if (e != null)
		{
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			e.printStackTrace(pw);
			String pila = "\n" + sw.toString();
//			if (pila.length() > 255)
//				pila = pila.substring(0, 255);
			hm.put(Q70ConstantesLogs.EXCEPCION, e.getMessage());
			hm.put(Q70ConstantesLogs.PILA, pila);
		}
		else
		{
			hm.put(Q70ConstantesLogs.EXCEPCION, null);
			hm.put(Q70ConstantesLogs.PILA, null);
		}

		hm.put(Q70ConstantesLogs.COMPONENTE, componente);
		hm.put(Q70ConstantesLogs.GRAVEDAD, gravedad);

		try
		{
			log.log(hm);
		}
		catch (NullPointerException ex)
		{
			Q70LogInterno.log(hm.toString());
		}

	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.incidencias.Q70LogIncidenciasInterface#isEnabled()
	 */
	public boolean isEnabled()
	{
		if (log.isEnabled())
			return true;
		return false;
	}
	
	/**
	 * Establece el log de incidencias
	 * @param log
	 */
	public void setLog(Q70Log log)
	{
		this.log = log;
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70LogFlushable#flush()
	 */
	public void flush(){
		log.flush();
	}
}