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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

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;

/**
 * API para tratamineto de XMLs de Geremua. Por ejemplo, en el 
 * tratamiento para XL-NETS devueltos por el Gestor de Seguridad.
 * 
 * @author UFRM005
 * @version 1.0 
  */

public class Q70UtilidadesXML {

/**
  * Funcion que devuelve un Texto dado un XPath
  * 
  * @param docDom Node XML 
  * @param strPath Path de XPath
  * @return strValor Valor seleccionado con el Path 
  * @exception TransformerException  
  * @throws Q70UtilidadesExcepcion  Error de utilidades
  */

public static String searchDomString(Node docDom, String strPath) throws Q70UtilidadesExcepcion {
	
	NodeList NodeLiResultado=null;
	String strValor="";

	try {

	NodeLiResultado = XPathAPI.selectNodeList(docDom, strPath);

	if ( NodeLiResultado.getLength() != 0 ) {
	 strValor = (String) NodeLiResultado.item(0).getNodeValue();
	} else {
	 strValor = "";
	}

	} catch(TransformerException te){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "searchDomString()", 
																Q70UtilidadesErrores.UTILIDADES_XML_XPATH ,te );
	}

return strValor;
}

/**
 * Funcion que devuelve un Vector de Strings dado un XPath.
 * 
 * @param docDom Node XML 
 * @param strPath Path de XPath
 * @return vecValores vector de valores seleccionados con el Path 
 * @exception TransformerException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static Vector searchDomVector(Node docDom, String strPath) throws Q70UtilidadesExcepcion{

	NodeList NodeLiResultado=null;
	Vector vecValores=null;

	try {

	NodeLiResultado = XPathAPI.selectNodeList(docDom, strPath);

	if ( NodeLiResultado.getLength() != 0 ) {

 	int x = 0;
 	vecValores = new Vector();

 	for(x=0;x<NodeLiResultado.getLength(); x++){

  	if(NodeLiResultado.item(x).hasChildNodes()) {
   	vecValores.add(NodeLiResultado.item(x).getFirstChild().getNodeValue());
  	} else {
   	vecValores.add("");
  	}

 	}

	} else {

  	vecValores = new Vector();

	}

	} catch(TransformerException te){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "searchDomVector()", 
																Q70UtilidadesErrores.UTILIDADES_XML_XPATH ,te );
		
	}

return vecValores;
}

/**
 * Funcion que devuelve un NodeList dado un XPath.
 * 
 * @param docDom Node XML 
 * @param strPath Path de XPath
 * @return NodeLiResultado  NodeList de Node seleccionado con el Path 
 * @exception TransformerException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static NodeList searchDomNodeList(Node docDom, String strPath) throws Q70UtilidadesExcepcion{

	NodeList NodeLiResultado=null;

	try {

	NodeLiResultado = XPathAPI.selectNodeList(docDom, strPath);

	} catch(TransformerException te){
	
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "searchDomNodeList()", 
																Q70UtilidadesErrores.UTILIDADES_XML_XPATH ,te );
	}

return NodeLiResultado;
}

/**
 * Funcion que devuelve un Node dado un XPath.
 * 
 * @param docDom Node XML 
 * @param strPath Path de XPath
 * @return NodeResultado Node Node seleccionado con el Path 
 * @exception TransformerException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades
 */
public static Node searchDomNode(Node docDom, String strPath) throws Q70UtilidadesExcepcion {

	Node NodeResultado=null;

	try {

	NodeResultado = XPathAPI.selectSingleNode(docDom, strPath);

	} catch(TransformerException te){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "searchDomNode()", 
														Q70UtilidadesErrores.UTILIDADES_XML_XPATH ,te );
	}

return NodeResultado;
}


/**
 * Funcion que convierte un document a string
 * 
 * @param doc Document XML 
 * @exception IOException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades
 * @return xmloutput String XML en forma de string 
 */
public static String documentToString(Document doc) throws Q70UtilidadesExcepcion{

	String xmloutput = null;
 	
	try {
	
	  	doc.getDocumentElement().normalize();
	  	OutputFormat format = new OutputFormat(doc);
	  	format.setPreserveSpace(false);
	  	format.setEncoding(Q70UtilidadesConstantes.ENCODING);
	  	StringWriter stringOut = new StringWriter();
	  	XMLSerializer serial = new XMLSerializer(stringOut, format);
	  	serial.asDOMSerializer();
	  	serial.serialize(doc.getDocumentElement());
	  	xmloutput = stringOut.toString();

	} catch ( IOException ioe ){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "documentToString()", 
														Q70UtilidadesErrores.UTILIDADES_XML_SERIALIZACION ,ioe );
	}
  	
return xmloutput;

}

/**
 * Funcion que convierte un string a document
 * 
 * @param textoXML String texto del XML 
 * @return document Document XML 
 * @exception ParserConfigurationException , IOException, SAXException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static Document stringToDocument(String textoXML) throws Q70UtilidadesExcepcion {

	Document document = null;
	
	try {

  		DocumentBuilderFactory factory = null;
  		DocumentBuilder builder = null;

  		factory = DocumentBuilderFactory.newInstance();
  		factory.setValidating(false);
  		factory.setIgnoringElementContentWhitespace(false);
  		builder = factory.newDocumentBuilder();
  		StringReader stringIn = new StringReader(textoXML);
  		document = builder.parse(new InputSource(stringIn));

  		ProcessingInstruction pi = document.createProcessingInstruction("xml",Q70UtilidadesConstantes.XML_PI);
  		document.appendChild(pi);
	
	} catch ( ParserConfigurationException pce){
			
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "stringToDocument()", 
														Q70UtilidadesErrores.UTILIDADES_XML_PARSEO ,pce );
	} catch ( IOException io){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "stringToDocument()", 
														Q70UtilidadesErrores.UTILIDADES_XML_PARSEO ,io );	
	} catch ( SAXException se){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "stringToDocument()", 
														Q70UtilidadesErrores.UTILIDADES_XML_PARSEO ,se );
	}
		
return document;

}

/**
 * Funcion que convierte un string con Entidades Generales a document
 * 
 * @param sourceText String texto del XML con Entidades Generales
 * @return document Document XML 
 * @exception ParserConfigurationException, IOException
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static Document stringToDocumentGE(String sourceText) throws Exception{

	Document document = null;
	DocumentBuilderFactory factory = null;
	DocumentBuilder builder = null;

	try {

		sourceText = replaceString(sourceText, "&lt;","<");
		sourceText = replaceString(sourceText, "&gt;",">");
		sourceText = replaceString(sourceText, "&amp;","&");
		sourceText = replaceString(sourceText, "&apos;","'");
		sourceText = replaceString(sourceText, "&quot;","\"");

		factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(false);
		factory.setIgnoringElementContentWhitespace(true);
		builder = factory.newDocumentBuilder();
		StringReader stringIn = new StringReader(sourceText);
		document = builder.parse(new InputSource(stringIn));
	
	} catch (ParserConfigurationException pce) {
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "stringToDocumentGE()", 
														Q70UtilidadesErrores.UTILIDADES_XML_PARSEO ,pce );	
	} catch (IOException io) {
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
														"Q70UtilidadesXML", "stringToDocumentGE()", 
														Q70UtilidadesErrores.UTILIDADES_XML_PARSEO ,io );		
	}

return document;
}

/**
 * Función que reemplaza un string por otro en una cadena reiterativamente
 * 
 * @param src String cadena de texto fuente
 * @param old String cadena a reemplazar
 * @param newOne String cadena de reemplazo
 * @return strBuffer String cadena resultado
 */
private static String replaceString( String src , String old , String newOne ){

	StringBuffer sbuf = new StringBuffer( src );
	int oldPos = 0;
	int fromIndex = 0;
	int offset = 0;

		while( true )
		{
		oldPos = src.indexOf( old , fromIndex ) ;
		if( oldPos == -1 )
		break;

		oldPos += offset;
		fromIndex = oldPos + 1;

		sbuf.replace( oldPos , oldPos + old.length() , newOne );
		offset = newOne.length() - 1;
		}

	String strBuffer = sbuf.toString();
	sbuf = null;

return strBuffer;

}

/**
 * Función para transformar XML en HTML con XSL
 * 
 * @param xml Document documento XML
 * @param xsl Document documento XSL
 * @return String 
 * @exception TransformerConfigurationException, TransformerException
 * @throws UtilidadesException Excepción de utilidades 
 */
public static String transformXML_XSL(Document xml, Document xsl) throws Q70UtilidadesExcepcion {

		StringWriter result = new StringWriter();
		
		try {
		

			TransformerFactory tfactory =  TransformerFactory.newInstance();
			DOMSource xmlsource = new DOMSource(xml);
			DOMSource xslsource = new DOMSource(xsl);
			Templates templates =  tfactory.newTemplates(xslsource);
			Transformer transformer = templates.newTransformer();
			transformer.transform(xmlsource, new StreamResult(result));
		
		} catch ( TransformerConfigurationException tce){
			
			throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
															"Q70UtilidadesXML", "transformXML_XSL()", 
															Q70UtilidadesErrores.UTILIDADES_XML_PARSEO_XSL ,tce );	
		} catch ( TransformerException te){
			
			throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
															"Q70UtilidadesXML", "transformXML_XSL()", 
															Q70UtilidadesErrores.UTILIDADES_XML_PARSEO_XSL ,te );	
		}

return result.toString();

}

/**
 * Función para transformar XML en XML con XSL
 * 
 * @param xml Document documento XML
 * @param xsl Document documento XSL
 * @return document Document documento XML
 * @exception TransformerConfigurationException, TransformerException
 * @throws Q70UtilidadesExcepcion  Excepción de utilidades
 */
public static Document transformXML_XML(Document xml, Document xsl) throws Q70UtilidadesExcepcion {

	Document document = null;

	try {

		TransformerFactory tfactory =  TransformerFactory.newInstance();
		DOMSource xmlsource = new DOMSource(xml);
		DOMSource xslsource = new DOMSource(xsl);
		DOMResult xmlresult = new DOMResult();
		Templates templates =  tfactory.newTemplates(xslsource);
		Transformer transformer = templates.newTransformer();
		transformer.transform(xmlsource, xmlresult);
		document = (Document) xmlresult.getNode();

	} catch ( TransformerConfigurationException tce){
			
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
													"Q70UtilidadesXML", "transformXML_XSL()", 
													Q70UtilidadesErrores.UTILIDADES_XML_PARSEO_XSL ,tce );	
	} catch ( TransformerException te){
			
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
													"Q70UtilidadesXML", "transformXML_XSL()", 
													Q70UtilidadesErrores.UTILIDADES_XML_PARSEO_XSL ,te );	
}

return document;

}

/**
 * Funcion añadir 1 valor a un nodo
 * 
 * @param xpath String path del nodo al que se añade
 * @param value String valor a añadir al nodo
 * @param document Document documento al que se añade
 * @return void
 * @exception Exception Excepción generica 
 * @throws UtilidadesException Excepción de utilidades
 */
public static void putNodeValue(String xpath, String value, Document document ) throws Q70UtilidadesExcepcion{

	try {
		
		Node nodo = searchDomNode(document, xpath);
	  	nodo.appendChild( document.createTextNode(value) );

	} catch(Exception e)  {
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
													"Q70UtilidadesXML", "putNodeValue()", 
													Q70UtilidadesErrores.UTILIDADES_XML_ANADIR_NODO ,e);	
	}

}

/**
 * Funcion añadir Nodo a un Document según XPath
 * 
 * @param nodoNuevo Node nodo que se añade
 * @param valor String valor a añadir al nodo
 * @param document Document documento al que se añade
 * @param xpath String path del documento al que se añade
 * @return void
 * @exception Exception Excepción generica
 * @throws  Q70UtilidadesExcepcion Excepción de utilidades
 */
public static void addNodeDocumentXPath(Node newNode , Document document, String xpath ) throws Q70UtilidadesExcepcion {

	try {
	  
	  Node nodo = searchDomNode(document, xpath);	
	  nodo.appendChild( newNode );

	} catch(Exception e)  {

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
													"Q70UtilidadesXML", "addNodeDocumentXPath()", 
													Q70UtilidadesErrores.UTILIDADES_XML_ANADIR_NODO ,e);	
	}

}


/**
 * Funcion que sustituye caracteres entidad general por entidad general
 * 
 * @param strText String cadena fuente
 * @return strText String cadena fuente con entidades generales
 */
public static String encodeGeneralEntity (String strText){

	strText = replaceString(strText, "<","&lt;");
	strText = replaceString(strText, ">","&gt;");
	strText = replaceString(strText, "&","&amp;");
	strText = replaceString(strText, "'","&apos;");
	strText = replaceString(strText, "\"","&quot;");

return strText;
}

/**
 * Funcion que sustituye entidad general por caracter entidad general
 * 
 * @param strText String cadena fuente
 * @return strTexto String cadena fuente sin entidades generales
 */
public static String decodeGeneralEntity(String strText){

	strText = replaceString(strText, "&lt;","<");
	strText = replaceString(strText, "&gt;",">");
	strText = replaceString(strText, "&amp;","&");
	strText = replaceString(strText, "&apos;","'");
	strText = replaceString(strText, "&quot;","\"");

return strText;
}

/**
 * Funcion para generar un nuevo documento xml
 * 
 * @return documento Document documento XML nuevo
 * @exception ParserConfigurationException
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static Document getNewDocument() throws Q70UtilidadesExcepcion{

	Document documento = null;

  	try {

		DocumentBuilderFactory factory = null;
		DocumentBuilder builder = null;
		factory = DocumentBuilderFactory.newInstance();
		builder = factory.newDocumentBuilder();
		documento = builder.newDocument();

	} catch (ParserConfigurationException pce){
	  	
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
													"Q70UtilidadesXML", "getNewDocument()", 
													Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,pce);	
	}

return documento;
}



/**
 * Funcion para generar un nuevo documento xml copia (no referencia)
 * 
 * @param document Document documento xml de entrada
 * @return document Document documento xml copia de entrada
 * @exception ParserConfigurationException  
 * @throws Q70UtilidadesExcepcion Excepción de utilidades 
 */
public static Document getNewDocument(Document document) throws Q70UtilidadesExcepcion {

  Document documento = null;

  try {

  		DocumentBuilderFactory factory = null;
  		DocumentBuilder builder = null;
  		factory = DocumentBuilderFactory.newInstance();
  		builder = factory.newDocumentBuilder();
  		StringReader reader = new StringReader(Q70UtilidadesXML.documentToString(document));
  		documento = builder.parse(new InputSource(reader));

  } catch (ParserConfigurationException pce){
			
			throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																	"Q70UtilidadesXML", "getNewDocument()", 
																	Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,pce);	  
  } catch (IOException ioe){
			
		  throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																  "Q70UtilidadesXML", "getNewDocument()", 
																  Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,ioe);	
  } catch (SAXException se) {
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
															"Q70UtilidadesXML", "getNewDocument()", 
															Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,se);	
  }
	  	


return documento;
}

/**
 * Funcion para generar un nuevo documento xml a partir de un path de archivo
 * 
 * @param strFile String path del fichero
 * @return documento Document documento xml 
 * @exception Exception Excepción generica
 * @throws  Q70UtilidadesExcepcion Excepción de utilidades
 */
public static Document getDocumentXMLPath(String strFile) throws Q70UtilidadesExcepcion{
	
	Document documento = null;
		
	try{
	
		File filFichero = new File(strFile);
		documento = Q70UtilidadesXML.getDocumentXMLPath(filFichero);	
	
	} catch (Exception e){
			
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "getDocumentXMLPath()", 
																Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,e);	
	}
	
return documento;
}

/**
 * Funcion para generar un nuevo documento xml a partir de un InputStream
 * 
 * @param inputStreamFile InputStream que representa el path del fichero
 * @return documento Document documento xml 
 * @exception ParserConfigurationException, IOException, SAXException  
 * @throws  Q70UtilidadesExcepcion Excepción de utilidades
 */
public static Document getDocumentXMLInputStream(InputStream inputStreamFile) throws Q70UtilidadesExcepcion{
	
	Document documento = null;
		
		
	try {
	
		DocumentBuilderFactory factory = null;
		DocumentBuilder builder = null;
		factory = DocumentBuilderFactory.newInstance();
		builder = factory.newDocumentBuilder();

		documento = builder.parse(inputStreamFile);
	
	} catch( ParserConfigurationException pce ){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "getDocumentXMLPath()", 
																Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,pce);	
	} catch( IOException ie){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "getDocumentXMLPath()", 
																Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,ie);	
	} catch( SAXException se){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
															"Q70UtilidadesXML", "getDocumentXMLPath()", 
															Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,se);	
	} 
	
return documento;
}

/**
 * Funcion para generar un nuevo documento xml a partir de un File
 * 
 * @param filFile File clase File que representa el archivo
 * @return documento Document documento xml 
 * @exception ParserConfigurationException, IOException, SAXException  
 * @throws  Q70UtilidadesExcepcion Excepción de utilidades
 */
public static Document getDocumentXMLPath(File filFile) throws Q70UtilidadesExcepcion{
	
	Document documento = null;
	
	try {
	
		DocumentBuilderFactory factory = null;
		DocumentBuilder builder = null;
		factory = DocumentBuilderFactory.newInstance();
		builder = factory.newDocumentBuilder();

		documento = builder.parse(new FileInputStream (filFile) );
	
	} catch( ParserConfigurationException pce ){
		
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "getDocumentXMLPath()", 
																Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,pce);	
	} catch( IOException ie){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
																"Q70UtilidadesXML", "getDocumentXMLPath()", 
																Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,ie);	
	} catch( SAXException se){

		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_XML,
															"Q70UtilidadesXML", "getDocumentXMLPath()", 
															Q70UtilidadesErrores.UTILIDADES_XML_CREAR_DOCUMENTO ,se);	
	} 
	
	
return documento;
}

/**
 * Funcion para recuperar el valor de un atributo a partir de un nodo
 * 
 * @param nodElemento Node nodo del xml que contiene atributos
 * @param strAtributoNombre String nombre del atributo del elemento
 * @return strAtributoValor String valor del atributo del elemento
 * @exception e Exception Excepción generica 
 */
public static String searchNodeAtribute(Node nodElement, String strAtributeName){
	
	String strAtributoValor = null;
	
	try {
	
		NamedNodeMap namedAtributos =  nodElement.getAttributes();
		Node nodAtributo = namedAtributos.getNamedItem(strAtributeName);
		strAtributoValor =  nodAtributo.getNodeValue();
	
	} catch ( Exception e ){
		
		strAtributoValor = null;	
	}	
	
return strAtributoValor;
}

/**
 * Funcion para determinar si existe o no un nodo xml
 *  
 * @param nodElement Node que represena el contexto xml desde donde se busca
 * @param strPath String path del nodo en el xml
 * @return bolExiste booolean true = existe, false = no existe
 * @exception e Exception Excepcion generica
 */
public static boolean bolNodeExist(Node nodElement, String strPath){
	
	boolean bolExiste = false;
	Node nodNodo = null;
	
	try {
		
		nodNodo = XPathAPI.selectSingleNode(nodElement, strPath);
		
		if ( (nodNodo.getNodeName() != "") || (nodNodo.getNodeName() != null) ){
			bolExiste = true;
		} else {
			bolExiste = false;
		}		
	
	} catch (Exception e){
		bolExiste = false;	
	}
	
return bolExiste;
}

/**
 * Funcion para determinar si existe o no un atributo en un nodo
 *  
 * @param nodElement Node nodo que tiene el atributo
 * @param strAtribute String que tiene el atributo
 * @return bolExiste booolean true = existe, false = no existe
 * @exception e Exception Excepcion generica
 */
public static boolean bolAtributeExist(Node nodElement, String strAtributeName){
	
	boolean bolExiste = false;
	Node nodAtributo = null;
	
	try {
		
		NamedNodeMap namedAtributos = nodElement.getAttributes();
		nodAtributo = namedAtributos.getNamedItem(strAtributeName);
		
		if ( nodAtributo == null){
			bolExiste = false;
		} else {
			bolExiste = true;
		}

	} catch (Exception e){
		bolExiste = false;	
	}
	
return bolExiste;
}
}
