package es.ejie.frmk.control.excepciones;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.infraestructura.logs.incidencias.Q70LogIncidenciasInterface;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;

/**
 * La clase se encarga de gestionar las excepciones por componentes de Geremua.
 * <p>
 * Para ello se realizan las siguientes tareas:
 * <ul>
 * <li>registrar la excepción recogida en el Log de Incidencias</li>
 * </ul>
 * <p>
 * Así mismo, Geremua presenta una jerarquía de excepciones de Geremua que permite a los componentes
 * capturar excepciones lanzadas por otros componentes o por las aplicaciones y añadirles más 
 * información como "componente", "clase" y "método" que las causa.
 * 
 */
public class Q70GestorDeExcepcionesServidor
{
	/**
	 * Constante que indica el componente al que pertenece dicha clase. Es
	 * necesario para el uso del log de trazas.
	 */
	private static final String COMPONENTE = "GESTOR_EXCEPCIONES_SERVIDOR";

	private static Q70GestorDeExcepcionesServidor instancia = null;
	
	/**
	 * Constructor privado necesario para ocultar el constructor por defecto.
	 */
	private Q70GestorDeExcepcionesServidor()
	{}

	/**
	 * Método estático que devuelve la única instacia del <code>GestorDeExcepciones</code>, que sigue el patrón de Singleton.
	 * <p>
	 * @return Única instacia del <code>GestorDeExcepciones</code>.
	 */
	public static Q70GestorDeExcepcionesServidor getSingleton()
	{
		/**
		 * El componente es de servidor por eso no hace falta que se registre
		 * en el Q70GestorArranqueConfiguracionServidor ya que no tiene
		 * configuración propia.
		 * @version 2.0 Fecha: 05-Jun-2006
		 */
	    //Q70GestorDeExcepcionesServidor instancia = (Q70GestorDeExcepcionesServidor)Q70GestorArranqueConfiguracionServidor.getAttribute(COMPONENTE);
		if (instancia == null)
		{
			instancia = new Q70GestorDeExcepcionesServidor();
			//Q70GestorArranqueConfiguracionServidor.setAttribute(COMPONENTE, instancia);

		}
		return instancia;

	}

	/**
	 * Método que recoge throwables y los registra en el Log de Incidencias de Geremua
	 * 
	 * @param throwable Throwable a tratar.
	 */
	public void recogerThrowable(Throwable throwable)
	{
		Q70TrazaInterface tr = Q70Factoria.getTraza();
		Q70LogIncidenciasInterface logInc = Q70Factoria.getLogIncidencias();
		
		if (tr.isTraceActive())
		{
			tr.trace(COMPONENTE, Q70TraceLevel.INFO, "Throwable recogida por el Gestor de Excepciones.");
		}
		if (logInc.isEnabled())
		{
			logInc.log(throwable, COMPONENTE, "Throwable recogida por el Gestor de Excepciones");
		}
	}
}