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

import es.ejie.frmk.infraestructura.utilidades.configurador.Q70ConfiguradorBase;

/**
 * Esta clase es la encargada de crear y configurar los diferentes logs de Geremua.
 * <p>
 * La configuración se hace a través del <b>ConfiguradorUniversal</b>.
 * por ello esta clase debe implementar el interfaz configurable. 
 * A su vez debe implementar Arrancable para poder ser instanciada por el Gestor
 * de arranque y configuración. Éste una vez obtenida la instancia a través del método
 * <b>getInstance</b> llamará al método <b>afterCreate</b> en el que se realizará la configuración.<p> 
 * 
 * @author Carlos Rodriguez
 * @version 1.0  
 * fecha: 10-dic-03
 * 
 */
public class Q70ConfiguradorGestorLogs extends Q70ConfiguradorBase
{
	private static final String LOGS_ROOT = "/LOGS/";
	private static final int LOGS_ROOT_LENGTH = 6;
	
	private Q70ConfiguracionLog conf = null;
	private Q70ConfiguracionLogs configuracionLogs = new Q70ConfiguracionLogs();
	
	private String strLogRemotoActivo = Q70ConstantesLogs.NO;
	private String strLogRemotoURL = "";

	public Q70ConfiguradorGestorLogs(String ficheroXML, String aplicacionCodigo){
		setFichero(ficheroXML);
		setCodigoAplicacion(aplicacionCodigo);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginConfiguration()
	 */
	public void beginConfiguration()
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("INICIO CONFIGURACION");
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endConfiguration()
	 */
	public void endConfiguration()
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("FIN CONFIGURACION");

	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginList(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginList(String strNombre, String strNivel, String strPath)
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("Inicio Lista: " + strNombre + "\n  Nivel = " + strNivel + "\n  Path = " + strPath + "\n");

	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endList(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endList(String strNombre, String strNivel, String strPath)
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("Fin Lista: " + strNombre + "\n  Nivel = " + strNivel + "\n  Path = " + strPath + "\n");

	}
	/**
	 * Cada comienzo de estructura corresponde con un log concreto. La configuración
	 * de cada log se guarda en conf.
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginStructure(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginStructure(String strNombre, String strNivel, String strPath)
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log(
				"Inicio Estrutura: " + strNombre + "\n  Nivel = " + strNivel + "\n  Path = " + strPath + "\n");

		if (strPath.substring(0, LOGS_ROOT_LENGTH).equals(LOGS_ROOT))
		{
			conf = new Q70ConfiguracionLog();
			conf.setProperty(Q70ConstantesLogs.LOG_REMOTO_ACTIVO, strLogRemotoActivo);
			conf.setProperty(Q70ConstantesLogs.LOG_REMOTO_URL, strLogRemotoURL);
		}
	}

	/**
	 * Al terminar una estrutura si corresponde con un log se crea de acuerdo
	 * a la información recogida en la variable conf.
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endStructure(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endStructure(String strNombre, String strNivel, String strPath)
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log(
				"Fin Estructura: " + strNombre + "\n      Nivel = " + strNivel + "\n      Path = " + strPath);

		if (strPath.substring(0, LOGS_ROOT_LENGTH).equals(LOGS_ROOT))
		{
			defaultConfiguration(strNombre);
			configuracionLogs.setConfiguracion(strNombre,conf);
		}

	}
	/**
	 * Establece la configuración por defecto
	 * @param name nombre de la estructura
	 */
	private void defaultConfiguration(String name)
	{
		if (conf.getProperty(Q70ConstantesLogs.ATRIBUTOS_GENERICOS) == null)
			conf.setProperty(Q70ConstantesLogs.ATRIBUTOS_GENERICOS, Q70ConstantesLogs.getDefaultGenericColumns(name));

		if (conf.getProperty(Q70ConstantesLogs.ATRIBUTOS_MENSAJE) == null)
			conf.setProperty(Q70ConstantesLogs.ATRIBUTOS_MENSAJE, Q70ConstantesLogs.getDefaultMessageColumns(name));
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginProperty(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginProperty(String strNombre, String strValor, String strNivel, String strPath)
	{
		//utilizar el log interno para ver los valores de los parámetros
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log(
				"Inicio Propiedad: "
					+ strNombre
					+ "\n      Valor = "
					+ strValor
					+ "\n      Nivel = "
					+ strNivel
					+ "\n      Path = "
					+ strPath);

		
		if (strPath.equals(Q70ConstantesLogs.PATH_LOG_REMOTO_ACTIVO)){
			strLogRemotoActivo = strValor;
		}else if (strPath.equals(Q70ConstantesLogs.PATH_LOG_REMOTO_URL)) {
			strLogRemotoURL = strValor;
			Q70LogRemotoAppender.setUrlLogAppender(strValor);
		} else if (strPath.substring(0, LOGS_ROOT_LENGTH).equals(LOGS_ROOT)){
			conf.setProperty(strNombre, strValor);
		}

	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endProperty(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endProperty(String strNombre, String strNivel, String strPath)
	{
		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("Fin Propiedad: " + strNombre + "\n      Nivel = " + strNivel + "\n      Path = " + strPath);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70ConfiguradorBase#getConfiguracion()
	 */
	protected Object getConfiguracion() {
		return configuracionLogs;
	}

}
