/*
 * Fichero:     ManejadoresMensajesSoap.java
 * Fecha:       12/01/07
 * Autor:       Alvaro Sarmiento losada 
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Contiene la clase ManejadoresMensajesSoap la cual realiza una gran cantidad de operaciones sobre 
 * 	mensajes para obtener la información que llevan en su interior.
 *
 * Este fichero pertenece al proyecto fin de carrera del autor,
 * consistente en el estudio de JXTA y su aplicación al comercio 
 * electrónico b2b.
 */
package com.pfc.manejadores;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import com.pfc.ventanas.*;
import com.pfc.lib.utiles.*;

import com.pfc.lib.soap.MensajeSOAP;
import com.pfc.lib.soap.RespuestaCategoria;


/** Clase que realiza todo tipo de operaciones de tratamiento de los mensajes SOAP para el fin
 * de nuestra aplicación.
 * 
 * @author Alvaro Sarmiento Losada
 *
 */
public class ManejadoresMensajesSoap {
	
	public final static String PROVEE= "proveedor.txt";
	public final static String PROVEEDORES= "proveedores.txt";
	public final static String NUESTROSPRODUCTOS= "nuestrosproductos.txt";
	
	public final static String EXCEPCION= "Se produjo una excepcion en el servidor";
	public final static String ERROR= "Su peticion no era correcta";
	public final static String ERRORBUSQUEDA= "No se encuentra en la base de datos";
	public final static String ERRORELIMINACION= "No ha podido eliminarse";
	public final static String BIEN= "Su peticion se ha realizado correctamente";
	
	
	/** Realiza una instanciación del este objeto*/
	public ManejadoresMensajesSoap(){
		super();
	}
	
	/**Método para el envío y recepción de un mensaje SOAP
	 * 
	 * @param mysoap El mensaje SOAP a enviar
	 * @return El mensaje SOAP de respuesta
	 */
	public SOAPMessage envioRecepcionMensajeSoap(SOAPMessage mysoap){
		
		SOAPMessage resultado=null;
		
		try{
			mysoap.writeTo(System.out);
			MensajeSOAP mensaje =new MensajeSOAP();
			mensaje.setDocumentoSOAP(mysoap);
			mensaje.enviarMensajeSOAP();
			System.out.println("Se ha enviado una peticion");
			MensajeSOAP respuesta=new MensajeSOAP();
			respuesta.recibirMensajeSOAP();
			System.out.println("Se ha recibido una respuesta a la anterior solicitud");
			resultado=respuesta.getDocumentoSOAP();
			System.out.println();
			resultado.writeTo(System.out);
			
		}catch(Exception e){
			System.out.println("Se ha producido un error en el envío de la peticion");
			e.printStackTrace(System.out);
			resultado=null;
		}
		
		return resultado;
		
	}
	
	/** Método en el que se crea un mensaje respuesta SOAP en cuyo cuerpo irá una cadena determinada
	 * 
	 * @param cadena La información que se desea transmitir.
	 * @return El mensaje SOAP creado con la cadena en su interior
	 */
	public SOAPMessage crearRespuesta(String cadena){
		
		RespuestaCategoria resp= new RespuestaCategoria(cadena);
    	SOAPMessage respuesta=resp.devolverMensaje();
    	
    	return respuesta;
	}
	
	
	/** Método para el envío de la respuesta
	 * 
	 * @param respuesta El mensaje SOAP a enviar
	 */
	public void envioRespuesta(SOAPMessage respuesta){
		MensajeSOAP mensaje =new MensajeSOAP();
		mensaje.setDocumentoSOAP(respuesta);
		try{
			mensaje.enviarMensajeSOAP();
		}catch(Exception e){
			System.out.println("Se ha producido un error en el envíode la respuesta");
		}
	}
	
	
	/** Incorpora una serie de atributos a un mensaje SOAP
	 * 
	 * @param resultado El mensaje original
	 * @param aux Los atributos a añadir
	 * @return El mensaje con los atributos añadidos
	 */
	public SOAPMessage anadirAtributos(SOAPMessage resultado,String []aux){
		/*SOAPMessage resultado=peticion.devolverMensaje();*/
		Iterator auxiliar=null;
		
		try{
    		/*Obtenemos la cabecera de nuestro mensaje*/
    			SOAPPart MyPart = resultado.getSOAPPart(); 

    			SOAPEnvelope sobre = MyPart.getEnvelope(); 

    			SOAPBody cuerpo = sobre.getBody();
    		
    			auxiliar = cuerpo.getChildElements();		
    			SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
    			if(aux[0].equals("atributo")){
    			
    				Name id = sobre.createName("atributo");

    				SOAPElement myS = body.addChildElement(id);
    			
    				myS.addTextNode(aux[1]);
    			}else if(aux[0].equals("valor")){
    				Name id = sobre.createName("valor");

    				SOAPElement myS = body.addChildElement(id);
    			
    				myS.addTextNode(aux[1]);
    			}else{
    				Name id = sobre.createName("comparacion");

    				SOAPElement myS = body.addChildElement(id);
    			
    				myS.addTextNode(aux[1]);
    			}
		}catch(Exception e){}
		/*peticion.colocarMensaje(resultado);*/
		
		return resultado;
	}
	
	
	/** Método que comprueba el tipo de petición recibida
	 * 
	 * @param msg El mensaje que contiene la petición
	 * @return Una cadena que especifica el tipo de peticion recibida
	 * @throws SOAPException
	 */
	public String comprobacionPeticion(SOAPMessage msg) throws SOAPException{
			
			
			/*Obtenemos la cabecera de nuestro mensaje*/
			SOAPPart MyPart = msg.getSOAPPart(); 
	
			SOAPEnvelope sobre = MyPart.getEnvelope(); 
	
			SOAPHeader  cabecera = sobre.getHeader(); 
		
			/*Ahora veamos sus elementos*/
			Iterator iterador = cabecera.getChildElements();
		
			SOAPElement auxiliar = (SOAPElement)iterador.next();
		
			Iterator prefix = auxiliar.getNamespacePrefixes();
	
			String prefijo =(String)prefix.next();
					
			return prefijo;
		}
	
	
	/** Método que obtiene los productos a partir de un mensaje respuesta SOAP
	 * 
	 * @param msg El mensaje respuesta
	 * @return Arreglo con las características de los distintos productos que cumplen la petición. Si se quiere devolver 
	 * 	sólo una cadena informando de cómo fué la peición se guardará en la primera posición del arreglo y el resto a null  
	 */
	public  String[] comprobarLista(SOAPMessage msg) {
		String [] array=new String[100];
		String frase=new String();
		String apoyo=new String();
		String acabar="final2";
		String acabar2="final";
		boolean exit=false;
		int contador=0;
		int indice=0;
		Iterator auxiliar;
		int j =0;
		
		/*Obtenemos la cabecera de nuestro mensaje*/
		SOAPPart MyPart = msg.getSOAPPart(); 
		Log log=new Log("log_aplicacion");
		System.out.println("Entramos en comprobarLista");
	
		try{
			SOAPEnvelope sobre = MyPart.getEnvelope(); 
			
			SOAPBody  cuerpo = sobre.getBody();
		
			auxiliar = cuerpo.getChildElements();
			SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
			Iterator ayuda=body.getChildElements();
		
			while(ayuda.hasNext()==true){
				SOAPElement aux=(SOAPElement)ayuda.next();
				Name nombre=aux.getElementName();
				if((nombre.getLocalName())=="respuesta"){					
					frase=aux.getValue();/*Se obtiene el valor*/
					if(frase.equals(ERROR)){
						array[0]=ERROR;
						log.apuntar("la peticion no tenía el formato esperado");
					}else if(frase.equals(BIEN)){
						array[0]=BIEN;
					}else if(frase.equals(ERRORBUSQUEDA)){
						array[0]=ERRORBUSQUEDA;
						log.apuntar(ERRORBUSQUEDA);
					}else if(frase.equals(ERRORELIMINACION)){
						array[0]=ERRORELIMINACION;
						log.apuntar(ERRORELIMINACION);
					}else if(frase.equals(EXCEPCION)){
						array[0]=EXCEPCION;
					}else{
						
						for(j=0;exit!=true;j++){
							indice=frase.indexOf(":",contador);			
							apoyo=frase.substring(contador,indice);
							System.out.println(apoyo);
							indice++;
							contador=indice;
			
							if(apoyo.equals(acabar))
								exit=true;
							else
								array[j]=apoyo;
						}
						
						
					}
					
					if(array[0].equals(ERROR) || array[0].equals(BIEN) || array[0].equals(EXCEPCION) || array[0].equals(ERRORBUSQUEDA) || array[0].equals(ERRORELIMINACION)){
						;/*No hacemos nada*/
						
					}
					else{
						if(array[0].equals("nuevo_producto")){
							
							for(j=1;array[j]!=null;j++){
								int k=0;
								String []auxi=new String[array.length];
								while(array[j]!=null && array[j].equals("nuevo_producto")!=true){
									auxi[k]=array[j];
									k++;
									j++;
								}
						
								int i=0;
								String apoyo2=new String();
								String producto=new String();
								for(i=0;auxi[i]!=null;i++){
									if(auxi[i].equals("id"))
										apoyo2=auxi[i+1];
									if(auxi[i].equals("producto"))
										apoyo2=auxi[i+1];
									if(auxi[i].equals("precio"))
										apoyo2=auxi[i+2];
									if(auxi[i].equals("id_par"))
										apoyo2=auxi[i+1];
									if(apoyo2.equals("")!=true){
										producto=producto+apoyo2+":";
										apoyo2="";
									}
								}
								String[]datos_proveedor=new String[11];
								int cont=0;
								k=0;
								for(i=0;auxi[i].equals(acabar2)!=true;i++){
									cont++;
								}
								for(i=cont+1;auxi[i]!=null;i++){
									datos_proveedor[k]=auxi[i];
									k++;
								}
						
								for(i=0;datos_proveedor[i]!=null;i++){
									apoyo2=datos_proveedor[i];
									producto=producto+apoyo2+":";
								}
						
								producto=producto+"null:";
								System.out.println(producto);
							
								try{
									File archivo=new File(PROVEEDORES);
									FileWriter escritor = new FileWriter(archivo,true);                     		
									escritor.write(producto);
									escritor.write("\r\n");
									escritor.flush();
			  
									escritor.close();
								}catch(IOException e){
									e.printStackTrace(System.out);
								}
							}
						
						}else{
							;/*No hacemos nada*/
						}
					}
					
				
				}else {
					System.out.println("Error en la respuesta devuelta");
				}
				
			}
			
		}catch(SOAPException e){}
		
		int cont=0;
		for(j=0;array[j]!=null;j++){
			cont++;
		}
		String []auxiliar2=new String[cont];
		for(j=0;j<cont;j++){
			auxiliar2[j]=array[j];
		
		}
		System.out.println("Salimos en comprobarLista");
		return auxiliar2;
		
	}
	
	/** Método para mostrar por pantalla los productos que hay en la base de datos
	 * 
	 * @param mensajesoap Mensaje SOAP para pedir la muestra de o todos los productos o de todas las categorías
	 * @return Una cadena que indica el producto o categoría elegida de todas las mostradas
	 */
	public String visualizar(SOAPMessage mensajesoap){
		
		String result=new String();
		gestorVentanas gestor=new gestorVentanas();
		ManejadoresCadenas manejador=new ManejadoresCadenas();
		
		try{
			
			SOAPMessage resultado=envioRecepcionMensajeSoap(mensajesoap);
			if(resultado==null){
				System.out.println("Se ha producido un error");
				result=null;
			}else{	
				String []productos=comprobarLista(resultado);
				boolean fuera=false;
				
				if(productos[0].equals(ERROR))
					result=ERROR;
				else if(productos[0].equals(EXCEPCION))
					result=EXCEPCION;
				else if(productos[0].equals(ERRORBUSQUEDA))
					result=ERRORBUSQUEDA;
				else{
					while (fuera!=true){
						
						String pro_elegida=gestor.seleccionBusqueda(productos);
					
						boolean estar=manejador.estaEnLista(productos,pro_elegida);
						if(estar!=false){
							System.out.println(pro_elegida);
							result=pro_elegida;
							fuera=true;
						}else
							System.out.println("Debe elegir otra vez");
					}
				}
			}
			
		}catch(Exception e){
			e.printStackTrace(System.out);
		}
		
		return result;
	}
	
	
	/** Método para la muestra por pantalla de todos los atibutos de la base de datos, 
	 *así como los valores que toman
	 *
	 *@param message Mensaje que pide todos los atributos de la base de datos
	 */
	public void visualizarAtributos(SOAPMessage message){
		gestorVentanas gestor=new gestorVentanas();
		ManejadoresCadenas manejador=new ManejadoresCadenas();
		
		try{
			
			SOAPMessage resultado=envioRecepcionMensajeSoap(message);
			if(resultado==null){
				System.out.println("Se ha producido un error");
			}else{	
				System.out.println();
				
				String []productos=comprobarLista(resultado);
				if(productos[0].equals(ERROR))
					gestor.error();
				else if(productos[0].equals(EXCEPCION))
					gestor.excepcion();
				else if(productos[0].equals(ERRORBUSQUEDA))
					gestor.errorBusqueda();
				else{
					String []atributos=new String[productos.length/4];
					String []valores=new String[productos.length/4];
				
					int i=0;
					int j=0;
					for(i=0,j=0;i<productos.length;i++,j++){
						i++;
						atributos[j]=productos[i++];
						i++;
						valores[j]=productos[i];
					}
					
					System.out.println("Imprimimos los atributos");
					for(i=0;i<atributos.length;i++){
						
						System.out.println(atributos[i]);
					}
					String []atri_finales=manejador.eliminarElementosRepetidos(atributos);
					String []valor_finales=manejador.eliminarElementosRepetidos(valores);
					
					System.out.println("Imprimimos los atri_finales");
					for(i=0;i<atri_finales.length;i++){
						
						System.out.println(atri_finales[i]);
					}
					
				
					boolean fuera=false;
				
					while (fuera!=true){
						
						String []pro_elegida=gestor.mostrarAtributos(atri_finales,valor_finales);
				
						boolean estar=manejador.estaEnLista(atri_finales,pro_elegida[0]);
						boolean estar2=manejador.estaEnLista(valor_finales,pro_elegida[1]);
						if(estar!=false && estar2!=false){
							System.out.println(pro_elegida[0]);
							System.out.println(pro_elegida[1]);
							fuera=true;
						}else{
							System.out.println("Debe elegir otra vez");
						}
					}
				}
			}
		}catch(Exception e){}
	}
	
	
	/** Método que nos permite ver en pantalla todos los productos que hemos buscado y encontrado en la base de datos.
	 * 	Cuando un producto es encontrado se guarda en un fichero de nombre "proveedores.txt". Aquí lo que se hace
	 * 	es abrirlo y recorrerlo y motrando en pantalla las características de cada producto*/
	public void mostrarBusquedas(){
		String[]resultado=new String [100];
		String []datos=new String[4];
		int j=0,contador=0,indice=0;
		String apoyo=null;
		gestorVentanas gestor=new gestorVentanas();
		boolean exit=false,terminar=false;
		String acabar="direccion";
		
		
		
		try{
			File archi=new File(PROVEEDORES);
			if(!archi.exists()){
				gestor.noMasElementos();
		   	 	System.out.println("Se sale de mostrar productos");
			}else{
				BufferedReader br = new BufferedReader(new FileReader(archi));
		    	String s;
		   	      
		   	 	int i=0;
		   	 	while ((s = br.readLine())!= null) {
		   	     resultado[i]=s;
		   	      i++;
		   	 	}
		   	 	
		   	 	i=0;
		   	 	while(resultado[i]!=null && terminar==false){
				   	 String frase=resultado[i];	
				   	 indice=0;
				   	 contador=0;
				   	 exit=false;
				   	 for(j=0;exit!=true;j++){
						indice=frase.indexOf(":",contador);			
						apoyo=frase.substring(contador,indice);
						System.out.println(apoyo);
						indice++;
						contador=indice;
		
						if(apoyo.equals(acabar))
							exit=true;
						else
							datos[j]=apoyo;
					}
				   	 terminar=gestor.mostrarProductos(datos);
				   	 i++;
				   	 
		   	 	}
		   	 	if(terminar==false)
		   	 		gestor.noMasElementos();
		   	 	System.out.println("Se sale de mostrar productos");	
			}
    		
    	}catch(IOException e){}
	}
	
	
	/** Muestra por pantalla todos los productos que hayamos registrado en la base de datos.
	 * 	Cuando un producto es registrado se guarda en un fichero de nombre "nuestrosproductos.txt". Aquí lo que se hace
	 * 	es abrirlo y recorrerlo y motrando en pantalla las características de cada producto*/
	public void mostrarRegistros(){
		String[]resultado=new String [100];
		int j=0,contador=0,indice=0;
		String apoyo=null;
		boolean fuera=false,terminar=false;
		String fin="final2";
		
		
		gestorVentanas gestor=new gestorVentanas();
		
		try{
			File archi=new File(NUESTROSPRODUCTOS);
			if(!archi.exists()){
				gestor.noMasElementos();
		   	 	System.out.println("Se sale de mostrar productos");
			}else{
				BufferedReader br = new BufferedReader(new FileReader(archi));
		    	String s;
		   	      
		   	 	 int i=0;
		   	 	while ((s = br.readLine())!= null) {
			   	     resultado[i]=s;
			   	     i++;
		   	 	}
		   	 	
		   	 	i=0;
		   	 	while(resultado[i]!=null && terminar==false){
				   	 String frase=resultado[i];
				   	 String []datos=new String[100];
				   	 fuera=false;
				   	 indice=0;
				   	 contador=0;
				   	 
				   	 for(j=0;fuera!=true;j++){
						indice=frase.indexOf(":",contador);			
						apoyo=frase.substring(contador,indice);
						System.out.println(apoyo);
						indice++;
						contador=indice;
		
						if(apoyo.equals(fin))
							fuera=true;
						else
							datos[j]=apoyo;
					}
				   	 String []proveedor=new String[5];
				   	 int k=0;
				   	 for(k=0;datos[k]!=null;k++){
				   		if(k<4)
				   			proveedor[k]=datos[k];
				   	 }
				   	 int longitud=(k-5)/4;
				   	 String []atributos=new String[longitud];
				   	 String []valores=new String[longitud];
				   	 
				   	for(k=5,j=0;datos[k]!=null;j++){
				   		atributos[j]=datos[k+1];
				   		k=k+2;
				   		valores[j]=datos[k+1];
				   		k=k+2;
				   	 }
				   	 
				   	 terminar=gestor.mostrarMisRegistros(datos,atributos,valores);
				   	 i++;
				   	 
		   	 	}
		   		if(terminar==false)
		   	 		gestor.noMasElementos();
		   		
		   	 	System.out.println("Se acabó");
			}
    	}catch(IOException e){}
	}
	
	
	/** Almacena nuestros datos en un fichero. Esto es necesario para una posterior operación de comercio eletrónico
	 * 
	 * @param ultimo El nombre que tiene nuestro par actulmente
	 */
	public String[] almacenarDatosPropios(String ultimo){
		gestorVentanas gestor=new gestorVentanas();
		String []datos=null;
		File provee=new File(PROVEE);
		
		if(provee.exists())
			System.out.println("Sus datos ya han sido tomados antes");
		
		else{
			
			datos=gestor.datosProveedor();
			datos[0]=ultimo;
			
			int i=0;
			String total=new String();
			for(i=0;i<datos.length;i++){
				String apoyo=datos[i];
				total=total+apoyo+":";
			}
			total=total+"final2:";
			
			try{
				File pro=new File(PROVEE);
				FileWriter escritor = new FileWriter(pro,true);                     		
   		 		escritor.write(total);
   		 		escritor.write("\r\n");
   		 		escritor.flush();

   		 		escritor.close();
			}catch(IOException e){}
		}
		
		return datos;
		
	}
	
	
	/** Método para obtener los productos que se están pasando en una petición de registro
	 * 
	 * @param msg El mensaje de petición de registro
	 * @return Arreglo con todos los productos a registrar
	 */
	public String[] comprobarProductos(SOAPMessage msg) {
    	System.out.println("Entramos en comprobarProductos");
		String [] array=new String[50];
		Iterator auxiliar;
		boolean error=false;
		int j =0;
		
		/*Obtenemos la cabecera de nuestro mensaje*/
		SOAPPart MyPart = msg.getSOAPPart(); 
		
		try{
			SOAPEnvelope sobre = MyPart.getEnvelope(); 

			SOAPBody  cuerpo = sobre.getBody();
		
			auxiliar = cuerpo.getChildElements();
			SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
			Iterator ayuda=body.getChildElements();
		
			while(ayuda.hasNext()==true){
				SOAPElement aux=(SOAPElement)ayuda.next();
				Name nombre=aux.getElementName();
				/*if((nombre.toString())=="id"){
					
					array[j++]=(nombre.toString());/*Se copia el tipo de búsqueda*/
					/*array[j]=aux.getValue();/*Se obtiene el valor*/
				/*}else*/
				if((nombre.getLocalName())=="categoria"){
					array[j++]="nuevo_producto";/*Indicamos el inicio de un nuevo producto*/
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else if((nombre.getLocalName())=="producto"){
					j++;
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else if((nombre.getLocalName())=="catalogo"){
					j++;
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else if((nombre.getLocalName())=="id_par"){
					j++;
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else if((nombre.getLocalName())=="atributo"){
					j++;
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else if((nombre.getLocalName())=="valor"){
					j++;
					array[j++]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j]=aux.getValue();
				}else {
					System.out.println("Error  en la petición");
					error=true;
				}
				
			}
			
		}catch(SOAPException e){
			e.printStackTrace(System.out);
		}
		int cont=0;
		for(j=0;array[j]!=null;j++)
			cont++;
		
		String []resp=new String[cont];
		
		if(error==true)
			resp[0]=ERROR;
		else{
    		for(j=0;array[j]!=null;j++)
    			resp[j]=array[j];
    		
		}
		System.out.println("Salimos de comprobarProductos");
    	return resp;
		
		
		
	}
	
	
	/** Método para obtener las características de los productos que se buscan en la bse de datos
	 * 
	 * @param msg El mensaje que contiene tales características
	 * @return Arreglo con las características por las que se buscará enla base de datos
	 */
	public String [] elementosBusqueda(SOAPMessage msg) {
		String [] array=new String[100];
		boolean error=false;
		Iterator auxiliar;
		int j =0;
		System.out.println("Entramos en elementosBusqueda");
		
		try{
		/*Obtenemos la cabecera de nuestro mensaje*/
			SOAPPart MyPart = msg.getSOAPPart(); 

			SOAPEnvelope sobre = MyPart.getEnvelope(); 

			SOAPBody cuerpo = sobre.getBody();
		
			auxiliar = cuerpo.getChildElements();		
			SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
			Iterator ayuda=body.getChildElements();
	
			while(ayuda.hasNext()==true){
				SOAPElement aux=(SOAPElement)ayuda.next();
				Name nombre=aux.getElementName();		
		
				if((nombre.getLocalName())=="categoria"){
					array[j]=(nombre.getLocalName());/*Se copia el tipo de búsqueda*/
					array[j+1]=aux.getValue();/*Se obtiene el valor*/
					j=j+2;
				}else if((nombre.getLocalName())=="producto"){
					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
					array[j+1]=aux.getValue();
					j=j+2;
				}else if((nombre.getLocalName())=="atributo"){
					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
					array[j+1]=aux.getValue();
					j=j+2;
				}else if((nombre.getLocalName())=="valor"){
					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
					array[j+1]=aux.getValue();
					j=j+2;
				}else if((nombre.getLocalName())=="comparacion"){
					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
					array[j+1]=aux.getValue();
					j=j+2;
				
				}else {
					System.out.println("Error  en la petición");
					error=true;
				}
				
			}
		}catch(SOAPException e){}
		int cont=0;
		for(j=0;array[j]!=null;j++){
			cont++;
		}
		String []tabla=new String[j];
		if(error==true)
			tabla[0]=ERROR;
		else{
    		for(j=0;j<cont;j++){
    			tabla[j]=array[j];
    		}
		}
		System.out.println("Salimos de elementosBusqueda");
		return tabla;
		
	}
	
	
	/** Método para obtener los identificadores de los productos a eliminar de la base de datos
	 * 
	 * @param msg Mensaje en donde se guarda los identificadores de los productos a eliminar
	 * @return Arreglo con los identificadores
	 */
	 public String [] elementosEliminar(SOAPMessage msg) throws SOAPException{
 		String [] array= new String[100];
 		boolean error=false;
 		Iterator auxiliar;
 		int i=0;
 	
 		
 		/*Obtenemos la cabecera de nuestro mensaje*/
 		SOAPPart MyPart = msg.getSOAPPart(); 

 		SOAPEnvelope sobre = MyPart.getEnvelope(); 

 		SOAPBody  cuerpo = sobre.getBody();
 		
 		auxiliar = cuerpo.getChildElements();
 		
 		SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
			Iterator ayuda=body.getChildElements();
 		
 		while(ayuda.hasNext()==true){
 			SOAPElement aux=(SOAPElement)ayuda.next();
				Name nombre=aux.getElementName();	
 			if((nombre.getLocalName())=="id_producto"){
 				array[i]=aux.getValue();
 			}else if((nombre.getLocalName())=="id_par")
 				array[i]=aux.getValue();
 			else{
 				System.out.println("Error en la peticion");
 				error=true;
 			}
 			i++;
 		}
 		int cont=0;
 		for(i=0;array[i]!=null;i++){
 			cont++;
 		}
 		
 		/*se crea una nueva tabla que es la que devolvemos*/
 		String []tabla=new String[i];
 		if(error==true)
 			tabla[0]=ERROR;
 		else{
     		for(i=0;i<cont;i++){
     			tabla[i]=array[i];
     		}
 		}
 		
 		
 		return tabla;
 	}
	 
	 
	 /** Método para obtener los nombres, tanto nuevo como el anterior, del par que efectúa la petición
	  * 
	  * @param mensaje Mnsaje que contiene los nombres del par
	  * @return Arreglo con el actual y el anterior nombre del par
	  */ 
	 public  String[] verIdentificadores(SOAPMessage mensaje){
     	String []resultado=new String[2];
     	Iterator auxiliar=null;
     	
     	try{
 		
     		/*Obtenemos la cabecera de nuestro mensaje*/
     		SOAPPart MyPart = mensaje.getSOAPPart(); 

     		SOAPEnvelope sobre = MyPart.getEnvelope(); 

     		SOAPBody  cuerpo = sobre.getBody();
 		
     		auxiliar = cuerpo.getChildElements();
 		
     		SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
     		Iterator ayuda=body.getChildElements();
 		
     		while(ayuda.hasNext()==true){
     			SOAPElement aux=(SOAPElement)ayuda.next();
     			Name nombre=aux.getElementName();	
     			if((nombre.getLocalName()).equals("anterior"))
     				resultado[0]=aux.getValue();
     			else if((nombre.getLocalName()).equals("nuevo"))
     				resultado[1]=aux.getValue();
 					
 				else{
 					System.out.println("Error en la peticion");
 					resultado[0]=ERROR;
 				}
     		}
     	}catch(Exception e){
     		e.printStackTrace(System.out);
     	}
     	return resultado;
     }
     
	 
	 /** Método para obtener los datos de un proveedor a partir de una petición de proveedor
	  * 
	  * @param mensaje La petición de proveedor(se almacena en la base de datos de proveedor)
	  * @return Arreglo con los datos del proveedor
	  */
     public String[] obtenerDatos(SOAPMessage mensaje){
     	String []array=new String[100];
     	boolean error=false;
     	int j=0;
     	Iterator auxiliar=null;
     
     	
     	try{
 		
     		/*Obtenemos la cabecera de nuestro mensaje*/
     		SOAPPart MyPart = mensaje.getSOAPPart(); 

     		SOAPEnvelope sobre = MyPart.getEnvelope(); 

     		SOAPBody  cuerpo = sobre.getBody();
 		
     		auxiliar = cuerpo.getChildElements();
 		
     		SOAPBodyElement body=(SOAPBodyElement)auxiliar.next();
     		Iterator ayuda=body.getChildElements();
 		
     		while(ayuda.hasNext()==true){
     			SOAPElement aux=(SOAPElement)ayuda.next();
     			Name nombre=aux.getElementName();	
     			if((nombre.getLocalName()).equals("nombre")){
     				array[j]=nombre.getLocalName();
 					array[j+1]=aux.getValue();/*Se obtiene el valor*/
 					j=j+2;
     			}else if((nombre.getLocalName()).equals("direccion")){
     				array[j]=nombre.getLocalName();
 					array[j+1]=aux.getValue();/*Se obtiene el valor*/
 					j=j+2;
 				}else if((nombre.getLocalName()).equals("localidad")){
 					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
 					array[j+1]=aux.getValue();
 					j=j+2;
 				}else if((nombre.getLocalName()).equals("provincia")){
 					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
 					array[j+1]=aux.getValue();
 					j=j+2;
 				}else if((nombre.getLocalName()).equals("codigopostal")){
 					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
 					array[j+1]=aux.getValue();
 					j=j+2;
 				}else if((nombre.getLocalName()).equals("pais")){
 					array[j]=nombre.getLocalName();/*Se copia el tipo de búsqueda*/
 					array[j+1]=aux.getValue();
 					j=j+2;
 				}
 				else{
 					System.out.println("Error en la peticion");
 					error=true;
 				}
     		}
     	}catch(Exception e){}
     	
     	int cont=0;
     	for(j=0;array[j]!=null;j++){
     		cont++;
     	}
     	String []resultado=new String[cont];
     	
     	if(error==true)
     		resultado[0]=ERROR;
     	else{
         	for(j=0;j<cont;j++)
         		resultado[j]=array[j];
     	}
     	
     	return resultado;
     }
     
     
     /** Método para comprobar si la operación de compra fue o no correcta
      * 
      * @param codigo Cadena que especifica el resultado de la operación
      */
     public void operacionCompra(String codigo){
    	 gestorVentanas gestor=new gestorVentanas();
    	 Log log=new Log("log_aplicacion");
    	 if(codigo.equals("200")){
    		 System.out.println("La operacion será realizada y se encuentra en proceso");
    		 gestor.bien();
    		 log.apuntar("se ha realizado la compra de un producto");
    	 }else if(codigo.equals("400")){
    		 System.out.println("Peticion inaceptable para el servidor cXML");
    		 gestor.error();
    	 }else if(codigo.equals("402")){
    		 System.out.println("Peticion inaceptable, no se ha incluido informacion de pago");
    		 gestor.error();
    	 }else if(codigo.equals("406")){
    		 System.out.println("Peticion inaceptable, el mensaje recibido esta corrupto o no es valido");
    		 gestor.error();
    	 }else{
    		 System.out.println("Peticion inaceptable, el cliente no esta autorizado a ejecutar esta operacion"); 
    		 gestor.error();
    	 }
     }

}
