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

import org.apache.commons.beanutils.DynaBean;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import es.ejie.frmk.infraestructura.utilidades.constantes.Q70UtilidadesConstantes;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70GenerarUtilidadesExcepcion;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesErrores;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesExcepcion;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70Mapa;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70ObjetoContextoFinal;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70TransferenciaDestino;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70TransferenciaOrigen;
import es.ejie.frmk.infraestructura.utilidades.xml.Q70UtilidadesXML;

/**
 * Clase que realiza el mapeo de varias propiedades a un bean en el contexto.
 * @author UFRM005
 * @version 1.0
 */
public class Q70MapaPropiedadesBean implements Q70Mapa{
	
	// variables miembro
	
	private Node nodoMapa = null;
	private String strXMLTipoBean = Q70UtilidadesConstantes.ATRIBUTO_TIPOBEAN;
	private String strXMLNombreDestinoEnContexto = Q70UtilidadesConstantes.ATRIBUTO_NOMBREDESTINOCONTEXTO;
	private String strXMLTransferencia = Q70UtilidadesConstantes.ELEMENTO_TRANSFERENCIA;
	private String strXMLOrigen = Q70UtilidadesConstantes.ELEMENTO_ORIGEN;
	private String strXMLDestino = Q70UtilidadesConstantes.ELEMENTO_DESTINO;
	private String strXMLIgnorarExcepcion = Q70UtilidadesConstantes.ATRIBUTO_IGNORAREXCEPCION;
	private String strTipoBean = null;
	private String strNombreDestinoEnContexto = null;	
	
	// métodos miembro	
	
	/**
	 * Constructor de la clase
	 */
	public Q70MapaPropiedadesBean() {
		super();
	}
	/**
	 * Constructor de la clase
	 * @param newNodoMapa Node nodo que representa el mapa
	 */
	public Q70MapaPropiedadesBean(Node newNodoMapa) {
		super();
		this.nodoMapa = newNodoMapa;
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.utilidades.mapeador.Q70Mapa
	 * */
	public void makeMap(Object objContextoInicial, Object objContextoFinal) throws Q70UtilidadesExcepcion{
		
		try {		
			
			// recuperar las propiedades y transferencias del mapeo 
			NodeList nodListTransferencias = Q70UtilidadesXML.searchDomNodeList(nodoMapa,strXMLTransferencia);
			strTipoBean = Q70UtilidadesXML.searchNodeAtribute(nodoMapa, strXMLTipoBean);
			strNombreDestinoEnContexto = Q70UtilidadesXML.searchNodeAtribute(nodoMapa, strXMLNombreDestinoEnContexto);	

			// poner propiedades en el bean
			Object objTipoBean = (Object)(Thread.currentThread().getContextClassLoader()).loadClass(strTipoBean).newInstance();
			
			
			int num = nodListTransferencias.getLength();
			int count = 0; 
			NodeList nodListOrigenes = null;
			Node nodDestino = null;
			
			for(count = 0 ; count < num ; count ++){
				
				boolean bolIgnorarExcepcion = false;
				if (Q70UtilidadesXML.bolAtributeExist(nodListTransferencias.item(count),strXMLIgnorarExcepcion)){
					bolIgnorarExcepcion = Boolean.valueOf(Q70UtilidadesXML.searchNodeAtribute(nodListTransferencias.item(count), strXMLIgnorarExcepcion)).booleanValue();
				}
	
				nodListOrigenes = Q70UtilidadesXML.searchDomNodeList(nodListTransferencias.item(count), strXMLOrigen);
				Object objOrigen = new Q70TransferenciaOrigen(nodListOrigenes, objContextoInicial, bolIgnorarExcepcion).generateOrigin();
				nodDestino = Q70UtilidadesXML.searchDomNode(nodListTransferencias.item(count), strXMLDestino); 
				Q70TransferenciaDestino transDestino = new Q70TransferenciaDestino(nodDestino, objTipoBean, bolIgnorarExcepcion);			
				transDestino.generateDestination(objOrigen);

			}
			
			// poner nuevo bean en contexto	final		
			DynaBean dynContextoFinal = new Q70ObjetoContextoFinal(objContextoFinal).getFinalDynaBean();
			dynContextoFinal.set(strNombreDestinoEnContexto, objTipoBean);   
			
			} catch(Exception e){
				
				throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_MAPEADOR,
																							"Q70MapaPropiedadesBean", "makeMap", 
																							Q70UtilidadesErrores.UTILIDADES_MAPEADOR_GENERICO ,e );
			}
		
			
	}
	
	
		
}
