/*
 * Creado el 16-ene-04
 *
 * Para cambiar la plantilla para este archivo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
package es.ejie.frmk.infraestructura.seguridad;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.commons.beanutils.BasicDynaBean;
import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaProperty;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;

/**
 * @author sp86512
 *
 * Para cambiar la plantilla para este comentario de tipo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
public class Q70ParseDOMXLNET {

	public DynaBean execute(Document doc) throws Q70SeguridadException {
		DynaBean db = null;
		try{
			NodeList nl = doc.getChildNodes();		
			HashMap hm = analiza(nl);
			db = getSecurityContext((HashMap)hm.get("n38"),"n38");	
		}catch(Exception e)
		{
			throw new Q70SeguridadException(this.getClass().getName(), "execute", "Error Parseando XL-Net", e);	
		}
		return db;
	}

	public  HashMap analiza(NodeList nl) throws Exception{	
	HashMap res = new HashMap();
	String valor = null;	
	for(int j=0; j < nl.getLength(); j++)
	{
		Node nodo = nl.item(j);
		valor = null;
		ArrayList listaValores=null;
		
		switch (nodo.getNodeType())
		{
		   case Node.ELEMENT_NODE: 
			{
				if(nodo.getNodeName().equals("n38"))
				{
					res.put("n38", analiza(nodo.getChildNodes()));
				}				
				if(nodo.getNodeName().equals("elementos"))
				{
					res.put(nodo.getAttributes().item(0).getNodeValue(), analiza(nodo.getChildNodes()));
				}
				if(nodo.getNodeName().equals("elemento"))
				{
					res.put(nodo.getAttributes().item(0).getNodeValue(), analiza(nodo.getChildNodes()));
				}
				if(nodo.getNodeName().equals("parametro"))
				{
					listaValores = new ArrayList();	
					for (int i=0;i<nodo.getChildNodes().getLength();i++){
						Node nd = nodo.getChildNodes().item(i);
						if(nd.getNodeName().equals("valor")){
							if (nd.getChildNodes().item(0) != null){
								valor = nd.getChildNodes().item(0).getNodeValue();
							}
							else{
								valor= "";
							}
							listaValores.add(valor);								
						}
					}
					if (listaValores.size()>1)
						res.put(nodo.getAttributes().item(0).getNodeValue(),listaValores);		
					else
						res.put(nodo.getAttributes().item(0).getNodeValue(),(String)listaValores.get(0));
				}

				if (nodo.getNodeName().equals("error")||nodo.getNodeName().equals("informacion")||nodo.getNodeName().equals("warning")){
					res.put(nodo.getAttributes().item(0).getChildNodes().item(0).getNodeValue(),analiza(nodo.getChildNodes()));
				}
				if(nodo.getNodeName().equals("descripcionCA")||nodo.getNodeName().equals("descripcionEU")||nodo.getNodeName().equals("componente")||nodo.getNodeName().equals("motivo")){
					res.put(nodo.getNodeName(),nodo.getChildNodes().item(0).getNodeValue());
				}							
				break;
			}
		}
	}
	return res;
	}
	
	
	public static DynaBean getSecurityContext(HashMap data, String name) throws Q70FrameworkException
	{
		DynaBean db = null;
		try
		{
		DynaProperty [] dp = new DynaProperty[data.size()];
		Iterator it = (Iterator)data.keySet().iterator();
		int i = 0;
		String key = "";			
		while(it.hasNext()){
			key = (String)it.next();
			if (data.get(key) instanceof HashMap)			
				dp[i] = new DynaProperty(key,DynaBean.class);
			else	
				dp[i] = new DynaProperty(key,data.get(key).getClass());				
			i++;		
		}
		BasicDynaClass bdc = new BasicDynaClass(name,BasicDynaBean.class,dp);	
		db = (DynaBean)bdc.newInstance();
		it = (Iterator)data.keySet().iterator();
		while(it.hasNext()){
			key = (String)it.next();
			if (data.get(key) instanceof HashMap)				
				db.set(key, getSecurityContext((HashMap)data.get(key), key));
			else
				db.set(key, data.get(key));					
		}
		}catch(Exception e){
			Q70TrazaInterface traza = Q70Factoria.getTraza();
			if (traza.isTraceActive()){
				traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "Se ha producido un error en el método getSecurityContext de la clase Q70ParseDOMXLNET");
			}
			throw new Q70FrameworkException(Q70Constantes.ID_COMPONENTE,Q70ParseDOMXLNET.class.getName(),"getSecurityContext","Se ha producido un error en el método getSecurityContext.",e);
		}
		return db;
	}
	    	
}
