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

import java.util.Map;

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.xml.Q70UtilidadesXML;
/**
 * Clase que procesa los destinos de cada transferencia
 * @author UFRM005
 * @version 1.0 
 */
public class Q70TransferenciaDestino extends Q70Transferencia
{

	// variables miembro

	Node nodDestino = null;
	Object objContextoDestino = null;
	boolean bolIgnorarExcepcion = false;
	String strXMLNombre = Q70UtilidadesConstantes.ATRIBUTO_NOMBRE;
	String strXMLConversion = Q70UtilidadesConstantes.ATRIBUTO_CONVERSION;

	// métodos miembro

	/**
	 * Constructor de la clase
	 * */
	public Q70TransferenciaDestino()
	{
		super();
	}

	/**
	 * Constructor de la clase alternativo
	 * @param newNodDestino Node nodo destino de la transferencia
	 * @param newObjFinalContext Object object que representa el objeto final del mapeo
	 * @param newBolIgnorarteException boolean booleano que determina el tramiento de errores transferencia (true se ignora, false de lanza)
	 */
	public Q70TransferenciaDestino(Node newNodDestination, Object newObjFinalContext, boolean newBolIgnorateException)
	{

		this.nodDestino = newNodDestination;
		this.objContextoDestino = newObjFinalContext;
		this.bolIgnorarExcepcion = newBolIgnorateException;
	}

	/**
	 * Función que genera el destino de la transferencia a partir del 
	 * Node de destino.
	 * @param objOrigin object que representa la clase origen de la transferencia
	 * @throws Q70UtilidadesExcepcion Excepción de utilidades
	 * */

	public void generateDestination(Object objOrigin) throws Q70UtilidadesExcepcion
	{

		try
		{

			String nombre = Q70UtilidadesXML.searchNodeAtribute(nodDestino, strXMLNombre);
			String conversion = Q70UtilidadesXML.searchNodeAtribute(nodDestino, strXMLConversion);
			Q70ObjetoContextoFinal objetoContextoFinal = new Q70ObjetoContextoFinal(objContextoDestino);
			DynaBean dynContextoFinal = objetoContextoFinal.getFinalDynaBean();
			Object objDestinoConvertido = null;

			// convertir destino

			if (conversion != null)
			{

				objDestinoConvertido = coversion(conversion, objOrigin);

			}
			else
			{

				objDestinoConvertido = objOrigin;

			}

			// poner destino

			try
			{

				if (nombre.indexOf(Q70UtilidadesConstantes.INDICADOR_MAP) >= 0)
				{
					// 1. poner destino propiedad Map

					Map mapaDestino = null;
					String strNombreMap = nombre.substring(0, nombre.indexOf(Q70UtilidadesConstantes.INDICADOR_MAP));
					String strClaveMap = nombre.substring(nombre.indexOf(Q70UtilidadesConstantes.INDICADOR_MAP) + 1, nombre.length());
					mapaDestino = (Map) dynContextoFinal.get(strNombreMap);
					mapaDestino.put(strClaveMap, objDestinoConvertido);

				}
				else
				{
					// 2. poner destino propiedad Object

					dynContextoFinal.set(nombre, objDestinoConvertido);
				}

			}
			catch (Exception e)
			{

				throw Q70GenerarUtilidadesExcepcion.createUtilityException(
					Q70UtilidadesConstantes.UTILIDADES_MAPEADOR,
					"Q70TransferenciaDestino",
					"generateDestination()",
					Q70UtilidadesErrores.UTILIDADES_MAPEADOR_PONER_DESTINO_PROPIEDAD,
					e);
			}

		}
		catch (Q70UtilidadesExcepcion ue)
		{

			if (bolIgnorarExcepcion == false)
			{
				throw ue;
			}

		}

	}

}
