package es.ejie.frmk.infraestructura.internacionalizacion;
import java.io.InputStream;
import java.util.HashMap;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.arranque.Q70GestorArranqueConfiguracionServidor;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable;
/**
 * @version 1.0
 * Fecha: 18-dic-03
 *
 * Esta clase permite configurar el componente de Gestor de mensajes e i18n
 * a partir de su fichero xml de configuración .
 * La clase implementa el interface Q70Configurable para autoconfigurarse 
 * a partir de un fichero xml
*/	
public class Q70Configurador implements Q70Configurable {

	private HashMap scopes;
	private HashMap aScope;
	private String nombreScope = null;
	private String fichero;	
	
	/**
	 * Constructor del <code>Q70Configurador</code>.
	 * 
	 * @param <code>String</code> nombre del fichero XML de configuración
	 */
	public Q70Configurador(String ficheroXML) {
		this.fichero=ficheroXML;
	}
	
	/**
	 * Método que ejecuta la configuración del componente 
	 * @throws Q70FrameworkException 
	 */	
	void lanzarConfigurador() throws Q70FrameworkException {
		InputStream fis = Q70GestorArranqueConfiguracionServidor.getApplicationConfigAsStream(fichero);
		es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurador cu =	new es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurador(this, fis);
		try
		{
			cu.generateConfiguration();
		}
		catch (Exception e)
		{
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()){
				traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error en el método lanzarConfigurador de la clase Q70Configurador");
			}
			throw new Q70FrameworkException(Q70Constantes.ID_COMPONENTE,this.getClass().toString(),"lanzarConfigurador","Se ha producido un error en el método lanzarConfigurador.",e);
		}
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginConfiguration()
	 */
	public void beginConfiguration() {
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endConfiguration()
	 */
	public void endConfiguration() {
		Q70GestorMensajesi18n.getSingleton().setScopes(scopes);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginList(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginList(String name, String level, String path) {
		if (level.equals("/lista")) {
			scopes = new HashMap();
		}
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endList(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endList(String name, String level, String path) {
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#beginStructure(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginStructure(String name, String level, String path) {
		if (level.equals("/lista/estructura")) {
			aScope = new HashMap();
			nombreScope = name;
		}
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endStructure(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endStructure(String name, String level, String path) {
		if (level.equals("/lista/estructura")){		
			scopes.put(name, aScope);
			nombreScope = null;
		}
	}

	/**
	 * @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 name, String value, String nivel, String path) {
		if (nivel.equals("/lista/estructura/propiedad")) {
			validate(name);
			if(name.equals(Q70Constantes.PATH)){
				if(value.endsWith("/"))
					value = value.concat(nombreScope); 							
			}
			aScope.put(name, value);
		}
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#endProperty(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endProperty(String name, String level, String path) {
	}

	/**
	 * Valida que los nombres de atributos en el fichero de configuración
	 * son válidos
	 * 
	 * @param <code>String</code> nombre de la propiedad en el fichero de configuración 
	 */	
	private void validate (String name) {
		if (!name.equals(Q70Constantes.CACHE) && !name.equals(Q70Constantes.PATH))
			if (Q70LogInterno.isEnabled())
				Q70LogInterno.log(Q70Constantes.ERROR_CONFIGURANDO + name);
	}
}
