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

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.arranque.Q70GestorArranqueConfiguracionServidor;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.infraestructura.utilidades.constantes.Q70UtilidadesConstantes;
import es.ejie.frmk.infraestructura.utilidades.general.Q70UtilidadesGenerales;

public abstract class Q70ConfiguradorBase implements Q70Configurable, Q70ConfigurableMBean {

	private String codigoAplicacion = null;
	private String fichero;
	private static final String COMPONENTE = "CONFIGURACION";

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

	public void beginList(String strName, String strLevel, String strPath) {
	}

	public void beginProperty(String strName, String strValue, String strLevel, String strPath) {
	}

	public void beginStructure(String strName, String strLevel, String strPath) {
	}

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

	public void endList(String strName, String strLevel, String strPath) {
	}

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

	public void endStructure(String strName, String strLevel, String strPath) {
	}

	protected String getFichero() {
		return fichero;
	}

	public void persisteConfiguracion(Object configuracionComponete) {
	}

	public void persisteConfiguracionXML(String xmlConfiguracion) throws Q70FrameworkException {
		String pathEscritura=null;
		try {
			pathEscritura=Q70GestorArranqueConfiguracionServidor.getGlobalProperty("PREFIJO_PATH_CONFIGURACION_GLOBAL_ABSOLUTO");
			OutputStreamWriter ficheroWriter = new OutputStreamWriter(new FileOutputStream(pathEscritura+ "/" +fichero),Q70UtilidadesConstantes.ENCODING);
			ficheroWriter.write(xmlConfiguracion);
			ficheroWriter.close();
		} catch (Exception e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()){
				traza.trace(COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error en el método persisteConfiguracionXML de la clase Q70ConfiguradorBase");
			}
			throw new Q70FrameworkException(COMPONENTE,this.getClass().toString(),"persisteConfiguracionXML","Se ha producido un error en el método persisteConfiguracionXML.",e);
		}
	}

	public Object recuperaConfiguracion() throws Q70FrameworkException{
		lanzarConfigurador();
		return getConfiguracion();
	}

	public String recuperaConfiguracionXML() throws Q70FrameworkException {		
		try {
			return Q70UtilidadesGenerales.readInputStream(Q70GestorArranqueConfiguracionServidor.getResourceAsStream(fichero));
		} catch (Exception e) {
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()) {
				traza.trace(COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error al leer el fichero "+fichero + " en el método recuperaConfiguracionXML de la clase Q70ConfiguradorBase");
			}
			throw new Q70FrameworkException (COMPONENTE,this.getClass().getName(), "recuperaConfiguracionXML","Se ha producido un error en el método recuperaConfiguracionXML.",e);
		}
	}

	protected void setFichero(String fichero) {
		this.fichero = fichero;
	}

	protected abstract Object getConfiguracion();

	/**
	 * método que genera la configuración
	 */
	private void lanzarConfigurador() throws Q70FrameworkException{
		InputStream fis = Q70GestorArranqueConfiguracionServidor.getResourceAsStream(fichero);
		es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurador cu = new es.ejie.frmk.infraestructura.utilidades.configurador.Q70Configurador(this,fis,codigoAplicacion);
		try
		{
			cu.generateConfiguration();
		}
		catch (Exception e)
		{
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()){
				traza.trace(COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error en el método lanzarConfigurador de la clase Q70ConfiguradorBase");
			}
			throw new Q70FrameworkException(COMPONENTE,this.getClass().toString(),"lanzarConfigurador","Se ha producido un error en el método lanzarConfigurador.",e);
		}
	}

	protected void setCodigoAplicacion(String codigoAplicacion) {
		this.codigoAplicacion = codigoAplicacion;
	}
}
