package es.ejie.frmk.infraestructura.tablas;
import java.util.HashMap;

import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;
import es.ejie.frmk.infraestructura.utilidades.configurador.Q70ConfiguradorBase;


/**
 * @version 1.0
 * Fecha: 19-dic-03
 */
public class Q70Configurador extends Q70ConfiguradorBase {

	private Q70Catalogo catalogo;
	private Q70Tabla tabla;
	private HashMap localesCodigo;
	private HashMap localesColumna;
	private HashMap grupoLocalesColumna;
	private HashMap internac;

	/**
	 * Construye un configurador a partir del fichero xml para la aplicación especificada 
	 * @param ficheroXML nombre del fichero XML de configuración
	 * @param aplicacionCodigo código de aplicación
	 */
	public Q70Configurador(String ficheroXML, String aplicacionCodigo) {
		setFichero(ficheroXML);
		setCodigoAplicacion(aplicacionCodigo);
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#inicioLista(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginList(String nombre, String nivel, String path) {
		if (nivel.equals("/lista")) {
			catalogo = new Q70Catalogo(nombre);
		}
		else if (nivel.equals("/lista/estructura/lista")) {
			if (nombre.equals(Q70Constantes.MULTILENGUAJE_VERTICAL)){
				localesCodigo = new HashMap(); 			
			}
			else if (nombre.equals(Q70Constantes.MULTILENGUAJE_HORIZONTAL)){
				grupoLocalesColumna = new HashMap();
			}
			tabla.setMultilanguage(nombre);
		}
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#finLista(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endList(String nombre, String nivel, String path) {
		if (nivel.equals("/lista/estructura/lista")) {			
			if (nombre.equals(Q70Constantes.MULTILENGUAJE_VERTICAL)){
				tabla.setLanguages(localesCodigo);
			}
			else if (nombre.equals(Q70Constantes.MULTILENGUAJE_HORIZONTAL)){
				tabla.setFields(grupoLocalesColumna);
			}
		}		
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#inicioEstructura(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void beginStructure(String idTabla, String nivel, String path) {
		if (nivel.equals("/lista/estructura")) {
			tabla = new Q70Tabla(idTabla);
		}
		else if (nivel.equals("/lista/estructura/lista/estructura") && tabla.getMultilenguaje().equals(Q70Constantes.MULTILENGUAJE_HORIZONTAL)) {
			localesColumna = new HashMap();
		}
		else if (nivel.equals("/lista/estructura/estructura")){
			internac = new HashMap();
		}	
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#finEstructura(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void endStructure(String nombre, String nivel, String path) {
		if (nivel.equals("/lista/estructura")){
			catalogo.addTable(nombre,tabla);
		}
		else if (nivel.equals("/lista/estructura/lista/estructura") &&  tabla.getMultilenguaje().equals(Q70Constantes.MULTILENGUAJE_HORIZONTAL)){
			grupoLocalesColumna.put(nombre,localesColumna);
		}
		else if (nivel.equals("/lista/estructura/estructura")){
			if (internac.size()!=3){
				if(Q70LogInterno.isEnabled()){
					Q70LogInterno.log("****************************************************************************************************************************************************");
					Q70LogInterno.log("La internacionalización para la tabla '" + tabla.getidTabla() + "' no se ha cargado correctamente. Se deben definir las propiedades: 'codigo', 'literal' y 'tipoCodigo'");
					Q70LogInterno.log("****************************************************************************************************************************************************");
				}
			}
			tabla.setInternationalization(internac);
		}
	}

	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurable#inicioPropiedad(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */ 
	public void beginProperty(String nombre, String valor, String nivel, String path) {
		if (nivel.equals("/propiedad")) {
			if (nombre.equals(Q70Constantes.TAM_MAX_POOLHSQL)){
				 catalogo.setMaxPoolHsql(Integer.parseInt(valor));
			}
			else if (nombre.equals(Q70Constantes.TAM_MIN_POOLHSQL)){
				catalogo.setMinPoolHsql(Integer.parseInt(valor));
			}
			else if (nombre.equals(Q70Constantes.TIMEOUT_POOLHSQL)){
				catalogo.setTimeoutHsql(Integer.parseInt(valor));
			}
			else if (nombre.equals(Q70Constantes.MAXIMO_EN_MEMORIA_APLICACION)){
				catalogo.setMaximoEnMemoriaAplicacion(Integer.parseInt(valor));
			}
		}
		else if (nivel.equals("/lista/estructura/propiedad")) {
				if (nombre.equals(Q70Constantes.NOMBRE_TABLA_FISICO)) 
					tabla.setNombreTablaFisico(valor);
				if (nombre.equals(Q70Constantes.ALIAS)) 
					tabla.setAlias(valor);				
				if (nombre.equals(Q70Constantes.EN_MEMORIA)) 
					tabla.setInMem(valor);
				else if (nombre.equals(Q70Constantes.CARGADA)) 
					tabla.setLoaded(valor);
				else if (nombre.equals(Q70Constantes.DATASOURCE)) 
					tabla.setDataSource(valor);
				else if (nombre.equals(Q70Constantes.INDICES)) 
					tabla.setIndices(valor);

		}
		else if (nivel.equals("/lista/estructura/lista/propiedad")) {
			if (nombre.equals(Q70Constantes.NOMBRE_COLUMNA))
				tabla.setColNameLanguage(valor);
		}
		else if (nivel.equals("/lista/estructura/lista/estructura/propiedad")) {
			if (tabla.getMultilenguaje().equals(Q70Constantes.MULTILENGUAJE_HORIZONTAL)){
					localesColumna.put(nombre,valor);
			}
			else{
					localesCodigo.put(nombre,valor);
			}
		}
		else if (nivel.equals("/lista/estructura/estructura/propiedad")) {
			if (nombre.equals(Q70Constantes.CODIGO) || nombre.equals(Q70Constantes.LITERAL) || nombre.equals(Q70Constantes.TIPO_CODIGO))
				internac.put(nombre,valor);
		}			
	}

	protected Object getConfiguracion() {
		return catalogo;
	}
		
}
