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

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

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.Q70ArgumentoAdaptadorInvocacion;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70Mapa;
import es.ejie.frmk.infraestructura.utilidades.mapeador.Q70ObjetoContextoInicial;
import es.ejie.frmk.infraestructura.utilidades.xml.Q70UtilidadesXML;
import es.ejie.frmk.negocio.operacioninterna.Q70InformacionInvocacion;

/**
 * Clase que realiza un mapeo simple de una propiedad del contexto a un argumento de invocacion
 */
public class Q70MapaPropiedadArgumento implements Q70Mapa{
	
	// variables miembro
	private Node nodoMapa = null;
	private String strXMLNombreArgumento = Q70UtilidadesConstantes.ATRIBUTO_NOMBREARGUMENTO;
	private Q70ArgumentoAdaptadorInvocacion argumentoAdaptadorInvocacion = null;
		
	// métodos miembro
		
	/**
	 * Constructor de la clase
	 */
	public Q70MapaPropiedadArgumento() {
		super();
	}
	
	/**
	 * Constructor de la clase alternativo
	 */
	public Q70MapaPropiedadArgumento(Node newNodoMapa) {
		super();
		nodoMapa = newNodoMapa;
	}

	public void makeMap(Object objContextoInicial, Object objContextoFinal) throws Q70UtilidadesExcepcion{
		
		// recuperar las propiedades del mapeo y el contexto inicial
		String strNombreArgumento = Q70UtilidadesXML.searchNodeAtribute(nodoMapa,strXMLNombreArgumento);
		
		DynaBean dynContextoInicial = new Q70ObjetoContextoInicial(objContextoInicial).getInicialDynaBean();
		Object objBeanContextoInicial = null;
			
		// realizar el mapeo 
		if ( objContextoFinal instanceof Q70InformacionInvocacion ){
			
			// crear clase argumento
			argumentoAdaptadorInvocacion = new Q70ArgumentoAdaptadorInvocacion((Q70InformacionInvocacion)objContextoFinal);
			
			
			// recuperar el objecto de contexto
			objBeanContextoInicial = dynContextoInicial.get(strNombreArgumento);  
			
			// poner objeto en argumento
			argumentoAdaptadorInvocacion.addElement(objBeanContextoInicial, objBeanContextoInicial.getClass());
			
			// poner el argumento datos
			
			if ( objContextoFinal instanceof Q70ArgumentoAdaptadorInvocacion ){
								
				Q70ArgumentoAdaptadorInvocacion argumentoAIObjContextoFinal = (Q70ArgumentoAdaptadorInvocacion) objContextoFinal;
				argumentoAIObjContextoFinal.addElement(objBeanContextoInicial, objBeanContextoInicial.getClass());
			
			} else {
				
				Q70InformacionInvocacion infInvObjContextoFinal = (Q70InformacionInvocacion) objContextoFinal ;
				infInvObjContextoFinal.setParametros(argumentoAdaptadorInvocacion.getParametros());
				infInvObjContextoFinal.setTipoParametros(argumentoAdaptadorInvocacion.getTipoParametros());
			
			}
			
		
		} else {
			throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_MAPEADOR,
			"Q70MapaPropiedadArgumento","makeMap",Q70UtilidadesErrores.UTILIDADES_MAPEADOR_ARGUMENTO_ADAPTADOR_INVOCACION);										
		}
		 		 
				
	}
	
		
}
