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

import java.util.ArrayList;

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.negocio.operacioninterna.Q70InformacionInvocacion;

/**
 * Clase que extiende de Q70InformacionInvocacion para añadir y redefinir funcionalidades.
 * Se trata del argumento del adaptador de invocación y es el resultado de un mapa de 
 * referencia a mapa.
 * @version 1.0
 * @author UFRM005
 */

public class Q70ArgumentoAdaptadorInvocacion extends Q70InformacionInvocacion {


// variables miembro
	
   private Object[] objParametros  = null;
   private Class [] classTipoParametros = null;
   int numArgumentos = 0;	
   int indexElementos = 0;	
	
// métodos

/**
 * Constructor de la clase
 * */

public Q70ArgumentoAdaptadorInvocacion(){
	super();	
}

/**
 * Constructor de la clase alternativo
 * @param nodeListArgumentos NodeList lista de mapas que conformarán el argumento invocación
 * */

public Q70ArgumentoAdaptadorInvocacion(NodeList nodeListArgumentos){
	numArgumentos = nodeListArgumentos.getLength();
	objParametros = new Object[numArgumentos];
	classTipoParametros = new Class[numArgumentos];
	super.setParametros(new Object[numArgumentos]);
	super.setTipoParametros(new Class[numArgumentos]);		
}

/**
 * Constructor de la clase alternativo
 * @param informacionInvocacion Q70InformacionInvocacion clase que representa un argumento de invocación
 * */
public Q70ArgumentoAdaptadorInvocacion(Q70InformacionInvocacion informacionInvocacion){

	this.classTipoParametros = informacionInvocacion.getTipoParametros();
	this.objParametros = informacionInvocacion.getParametros();
	this.setParametros(informacionInvocacion.getParametros() );
	this.setTipoParametros( informacionInvocacion.getTipoParametros() );
	
	try {	
	
		numArgumentos = informacionInvocacion.getParametros().length;	
		indexElementos = informacionInvocacion.getParametros().length -1 ; 	
	
		if ( numArgumentos <= 0){
			numArgumentos = 0;
		}
	
		if ( indexElementos <= 0 ){
			indexElementos = 0;
		}
	
	} catch(Exception e){
		numArgumentos = 1;
		indexElementos = 0;
		objParametros = new Object[1];
		classTipoParametros = new Class[1];
		this.setParametros(objParametros);
		this.setTipoParametros(classTipoParametros);	
	}

}

/**
 * Método que añade un elemento a los dos arrays de forma paralela
 * @param objElemento Object que representa el bean elemento a añadir
 * @param tipoElemento Class  descripción de la clase del bean elemento
 * @throws Q70UtilidadesExcepcion  Excepción del componente utilidades
 * */

public synchronized void addElement(Object objElemento, Class tipoElemento ) throws Q70UtilidadesExcepcion{
		
		int numParametros = objParametros.length;
		int numClassTipoParametros = classTipoParametros.length;
		
		if ( numParametros != numClassTipoParametros ){
			throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_MAPEADOR,
																	"Q70ArgumentoAdaptadorInvocacion","addElement",
																	Q70UtilidadesErrores.UTILIDADES_MAPEADOR_ARGUMENTO_ADAPTADOR_INVOCACION);																
		} else {
			
			// añadir datos a a mis arrays	
			this.objParametros[indexElementos] =  objElemento;	
			this.classTipoParametros[indexElementos] = tipoElemento;
			// poner arrays en arrays heredados 
			indexElementos++;
						
		}
		
		this.setParametros(objParametros);
		this.setTipoParametros(classTipoParametros);
	 
}

/**
 * Método que recupera un Object[] de elementos de una determinada clase
 * @param tipoElemento Class que representa la clase del elemento a buscar
 * @return arrElementos ArrayList arraylist de elementos que implementan la clase
 * @throws Q70UtilidadesExcepcion
 * */

public ArrayList getElements( Class tipoElemento ) throws Q70UtilidadesExcepcion{
		
		ArrayList arrElementos = null;
		
		int count = 0;
		
		arrElementos = new ArrayList();
	
		for(count=0; count < numArgumentos ; count ++){
				
				if ( classTipoParametros[count] == tipoElemento){
					arrElementos.add(objParametros[count]);
				}	
		}
		
		return arrElementos;
}


	
}
