package es.ejie.frmk.infraestructura.utilidades.mapeador;

import java.io.InputStream;
import java.util.HashMap;

import es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable;
import es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurador;
import es.ejie.frmk.infraestructura.utilidades.constantes.Q70UtilidadesConstantes;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesExcepcion;

/**
 * Esta clase permite configurar el componente de Gestor de Mapas
 * a partir de su fichero xml de configuración.
 * La clase implementa el interface Q70Configurable para autoconfigurarse 
 * a partir de un fichero xml.
 * @author UFRM005
 * @version 1.0
 *  
*/	
public class Q70ConfiguradorMapeador implements Q70Configurable {

	private HashMap hashConverters = null;
	private InputStream inputStreamXMLConfiguracion = null;
	private String strFicheroXMLConfiguracion = "";
	private String strFicheroXMLMapas = "";
	private String strTempConverter = "";
	private String strTempDestino = "";
	
	/**
	 * Constructor del Q70Configurador Mapeador.
	 * @param newStrFicheroXMLConfiguracion String nombre del fichero XML de configuración
	 */
	public Q70ConfiguradorMapeador(String newStrFicheroXMLConfiguracion) {
		this.strFicheroXMLConfiguracion=newStrFicheroXMLConfiguracion;
	}
	
	/**
	 * Constructor del Q70Configurador Mapeador.
	 * @param newInputStreamXMLConfiguracion InputStream del XML de configuración
	 */
	public Q70ConfiguradorMapeador(InputStream newInputStreamXMLConfiguracion) {
		this.inputStreamXMLConfiguracion=newInputStreamXMLConfiguracion;
	}

	/**
	 * Método que ejecuta la configuración del componente
	 * @throws  Q70UtilidadesExcepcion Excepción del componente utilidades
	 * @exception  Q70UtilidadesExcepcion Excepción del componente utilidades
	 */	
	public void generateConfiguration() throws Q70UtilidadesExcepcion {
		if (strFicheroXMLConfiguracion != "") {
			Q70Configurador cu = new Q70Configurador(this, strFicheroXMLConfiguracion);
			cu.generateConfiguration();
		} else if (inputStreamXMLConfiguracion != null) {
			Q70Configurador cu = new Q70Configurador(this, inputStreamXMLConfiguracion);
			cu.generateConfiguration();
		}
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 */ 	
	public void beginConfiguration() {
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void endConfiguration(){
		// poner fichero de mapeos en singletón
		Q70GestorMapeador.getSingleton().setStrXMLMapFile(strFicheroXMLMapas);
		// poner hash de converters en singletón
		//Q70GestorMapeador.getSingleton().setHashConverters(hashConverters);
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void beginList(String name, String level, String path) {
		// instanciar el hasmap para los pares converter, destino 
		if (level.equalsIgnoreCase("/"+Q70UtilidadesConstantes.ELEMENTO_LISTA)) {
			if ( name == Q70UtilidadesConstantes.ATRIBUTO_LISTACONVERTERS){
				hashConverters = new HashMap();
			}
		}
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void endList(String name, String level, String path) {
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void beginStructure(String name, String level, String path) {
		
		// marcar inicio estructura y limpiar temporales converter, destino
		if ( level.equalsIgnoreCase("/"+Q70UtilidadesConstantes.ELEMENTO_LISTA+"/"+Q70UtilidadesConstantes.ELEMENTO_ESTRUCTURA ) ){
			if ( name.equalsIgnoreCase(Q70UtilidadesConstantes.ATRIBUTO_CONVERTER)  ){
				strTempConverter = "";
				strTempDestino = ""; 
			}
		}
		
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void endStructure(String name, String level, String path) {
		
		// marcar fin de estructura y poner temporales converter, destino
		if ( level.equalsIgnoreCase("/"+Q70UtilidadesConstantes.ELEMENTO_LISTA+"/"+Q70UtilidadesConstantes.ELEMENTO_ESTRUCTURA ) ){
			if ( name.equalsIgnoreCase(Q70UtilidadesConstantes.ATRIBUTO_CONVERTER)  ){
				hashConverters.put(strTempConverter, strTempDestino);
			}
		}
		
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void beginProperty(String name, String value, String level, String path) {
		
		
		if (level.equalsIgnoreCase("/"+ Q70UtilidadesConstantes.ELEMENTO_LISTA + "/"+ Q70UtilidadesConstantes.ELEMENTO_ESTRUCTURA +"/"+ Q70UtilidadesConstantes.ELEMENTO_PROPIEDAD)) {
		// recoger valores de estructuras converters	
			if(name.equalsIgnoreCase(Q70UtilidadesConstantes.ATRIBUTO_CLASECONVERTER)){
				strTempConverter = value;
			} else if (name.equalsIgnoreCase( Q70UtilidadesConstantes.ATRIBUTO_CLASEDESTINO ) ){
				strTempDestino = value;
			}
		} else if (level.equalsIgnoreCase("/"+ Q70UtilidadesConstantes.ELEMENTO_PROPIEDAD )){
		// recoger valor de path de fichero xml de mapeos
			if (name.equalsIgnoreCase(Q70UtilidadesConstantes.ATRIBUTO_FICHEROMAPAS)){
				strFicheroXMLMapas = value;
			}
		}
	
	}
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable
	 * */ 	
	public void endProperty(String name, String level, String path) {
	}
}
