package es.ejie.frmk.infraestructura.traza;



/**
 * El <b>Gestor de Trazas</b> es un componente que permite grabar información técnica.
 * <p>
 * Esta información es acerca de los pasos por los que va pasando Geremua y las aplicaciones, 
 * con el objetivo de poder detectar posibles situaciones problemáticas durante la ejecución.
 * Cuando se realiza una invocación a este servicio para la grabación de una cierta información 
 * se debe especificar un nivel de severidad (información, aviso, error, error grave, ...).
 * Todos los componentes de Geremua realizan llamadas a este servicio en puntos estratégicos 
 * de su ejecución incluyendo la información adecuada para la posible identificación de los errores. 
 * Asimismo se deja la posibilidad a las aplicaciones a que efectúen sus propias trazas, 
 * muy útiles durante el período de desarrollo / pruebas.
 * <p>
 * Es un servicio que en producción se activará únicamente en situaciones puntuales 
 * y proporciona una traza condicionada discriminando por tipo de operación, 
 * código de usuario o nivel de severidad.
 * <p>
 * La traza se realiza si se cumplen un conjunto de condiciones booleanas 
 * que pueden englobar (con “and” y “or”) alguno de los conceptos siguientes:
 * <p>
 * <ul>
 * <li>Nivel de severidad
 * <li>Componente que origina la traza
 * <li>Código de usuario
 * <li>Aplicación
 * <li>Operación 
 * <li>Código de Sesión
 * <li>Versión de Navegador
 * <li>…
 * </ul>
 * <p>
 * Su implementación está basada el componente de logs, 
 * es decir, es un caso particular de log al que se le incorpora un mecanismo que permite interrogar 
 * al componente en tiempo de ejecución si para unas condiciones dadas 
 * (severidad, usuario, entorno, etc.) el componente está activado como traceable, 
 * en cuyo caso se construirían los parámetros necesarios para reflejarse en la traza, 
 * pero que si fuera el caso contrario, no se daría esta construcción. 
 * Esto se hace definiendo la condición de traceo en el fichero de configuración.
 *
 * @author UFRM004
 */
public class Q70Traza implements Q70TrazaInterface
{
	private static Q70Traza tracer;
	private Q70TrazaServidorInterface componenteAplicacion = Q70TrazaServidor.getSingleton();

	/**
	 * Devuelve la instancia del gestor de Traza. En caso de que no exista la crea.
	 * @return Instancia del gestor de Traza
	 */
	public static Q70Traza getSingleton()
	{
		if (tracer == null)
			doNewTraza();
		return tracer;
	}

	//TODO Jgrey Se le puede hacer a todos los componente getSingleton()
	synchronized private static void doNewTraza() {
		if (tracer == null)
			tracer = new Q70Traza();
	}

	/**
	 * Asigna el componente de aplicacion
	 * @param componenteAplicacion
	 */
	protected void setComponenteAplicacion(
			Q70TrazaServidorInterface componenteAplicacion) {
		this.componenteAplicacion = componenteAplicacion;
	}

	/**
	 * @return el componente de aplicacion
	 */
	protected Q70TrazaServidorInterface getComponenteAplicacion() {
		return componenteAplicacion;
	}

	/**
	 * @see es.ejie.frmk.infraestructura.traza.Q70TrazaInterface#isTraceActive()
	 */
	public boolean isTraceActive() {
		return componenteAplicacion.isTraceActive();
	}

	/**
	 * @see es.ejie.frmk.infraestructura.traza.Q70TrazaInterface#trace(java.lang.String, es.ejie.frmk.infraestructura.traza.Q70TraceLevel, java.lang.String)
	 */
	public void trace(String componente, Q70TraceLevel nivel, String mensaje) {
		componenteAplicacion.trace(componente, nivel, mensaje);
	}
}
