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.Q70UtilidadesExcepcion;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70Mapa;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70ObjetoContextoInicial;
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 las propiedades de un bean a propiedades del contexto.
 */
public class Q70MapaBeanPropiedades implements Q70Mapa{
	
	// variables miembro
	
	private Node nodoMapa = null;
	private String strXMLNombreOrigenEnContexto = Q70UtilidadesConstantes.ATRIBUTO_NOMBREORIGENCONTEXTO;
	private String strXMLIgnorarExcepcion = Q70UtilidadesConstantes.ATRIBUTO_IGNORAREXCEPCION;
	private String strXMLTransferencias = Q70UtilidadesConstantes.ELEMENTO_TRANSFERENCIA;
	private String strXMLOrigen = Q70UtilidadesConstantes.ELEMENTO_ORIGEN;
	private String strXMLDestino = Q70UtilidadesConstantes.ELEMENTO_DESTINO;
	private String strNombreOrigenEnContexto = "";
	
	// mÚtodos miembro
	
	/**
	 * Constructor de la clase
	 */
	public Q70MapaBeanPropiedades() {
		super();
	}
	
	/**
	 * Constructor de la clase alternativo
	 * @param newNodoMapa Node nodo que representa el mapa 
	 * */
	public Q70MapaBeanPropiedades(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 datos del mapeo
			strNombreOrigenEnContexto = Q70UtilidadesXML.searchNodeAtribute(nodoMapa,strXMLNombreOrigenEnContexto);
	
			// recuperar bean origen del contexto origen	
			DynaBean dynContextoInicial = new Q70ObjetoContextoInicial(objContextoInicial).getInicialDynaBean(); 
			DynaBean dynBeanContextoInicial = new Q70ObjetoContextoInicial( dynContextoInicial.get(strNombreOrigenEnContexto) ).getInicialDynaBean(); 	
		
			// mapear las propiedades del bean origen al contexto final  
			NodeList nodListTransferencias = Q70UtilidadesXML.searchDomNodeList(nodoMapa, strXMLTransferencias); 
			
			int num = nodListTransferencias.getLength();
			int count = 0;
			
			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();
				}
				
				NodeList nodListOrigenes = Q70UtilidadesXML.searchDomNodeList(nodListTransferencias.item(count), strXMLOrigen );
				Object objOrigen = new Q70TransferenciaOrigen(nodListOrigenes, dynBeanContextoInicial, bolIgnorarExcepcion).generateOrigin();
				Node nodeDestino = Q70UtilidadesXML.searchDomNode(nodListTransferencias.item(count), strXMLDestino );
				Q70TransferenciaDestino transDestino = new Q70TransferenciaDestino(nodeDestino, objContextoFinal, bolIgnorarExcepcion);
				transDestino.generateDestination(objOrigen);
				
			}
		
		
		} catch ( Q70UtilidadesExcepcion ue){
			throw ue;
		}
		
					
	}
	
}
