package com.pfc.catalogop2p.p2p;

/*
 * Fichero:     ServicioCatalogo.java
 * Fecha:       20/10/06
 * Autor:       Alvaro Sarmiento Losada
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Contiene la clase ServicioCatalogo, que es quien analiza
 * 				el tipo de peticiones que se reciben y elige la solución
 * 				que se adopta para cada caso en la aplicacion de catalogo
 * 				de nuestro servicio peertopeer.
 *
 * 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.
 */

import com.pfc.bases.BaseDeDatosAtributos;
import com.pfc.bases.BaseDeDatosCatalogo;
import com.pfc.bases.BaseDeDatosId;
import com.pfc.bases.BaseDeDatosProveedores;
import com.pfc.lib.soap.*;
import com.pfc.lib.utiles.FechaISO8601;
import com.pfc.lib.utiles.Log;
import com.pfc.manejadores.*;
import java.sql.*;
import javax.xml.soap.*;
import com.pfc.lib.utiles.*;




/**
 * Implementa un servidor (manejador) de peticiones SOAP que genera repuestas también cXML. Este servidor SOAP recibe y envía peticiones/respuestas encapsuladas en mensajes <code>MensajeSOAP</code>. 
 * @author  Alvaro Sarmiento Losada
 */

public class ServicioCatalogo extends Object{

	
	/** 
     * El nombre del archivo que será usado como log por este servidor para
     * anotar eventos notables.
     */
    public static final String ARCHIVO_LOG = "servicioCatalogoP2P";
    
    /**Para indicar cuando se para el servicio*/
    private boolean parar = false;
        
    /**Sirve para indicarnos el tipo de registro que desea*/
    public String manera_registro =null;
     
    /**Array para ver qué elementos queremos borrar*/
    public String [] tabla =null;
    
    /**Cadenas para comprobar el tipo de petición*/
    public final static String REGISTRAR = "r";
	public final static String BUSCAR = "b";
	public final static String ELIMINAR = "e";
	public final static String IDENTIFICADOR="i";
	public final static String PROVEEDOR="p";
	public final static String VERCATEGORIAS = "vc";
	public final static String VERPRODUCTOS = "vp";
	public final static String VERATRIBUTOS = "va";
	public final static String PRODUCTOCATEGORIA="pc";
	public final static String ATRIBUTOSPRODUCTO="ap";
	public final static String PRODUCTOATRIBUTO="pa";
	
	
	/**Cadenas para comprobar el resultado de una operación*/
	public final static String BIEN= "Su peticion se ha realizado correctamente";
	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 EXCEPCION= "Se produjo una excepcion en el servidor";
	
	/**Cadenas para comprobar el tipo de registro*/
	public final static String CATALOGOS = "catalogos";
	public final static String PRODUCTOS = "productos";
    
	public String ayuda=new String();
    
	/** El fichero Log donde almacenaremos todas las incidencias. */
	 Log log;
	 
    /** Almacena la fecha en la que este servidor se puso en marcha. */
    public static String FechaComienzoEjecucion;
    
    /** Almacena el nombre dado a este servidor. */
    public static String identidadServidor;
    
    /**Definimos un manejador de mensajes*/
    ManejadoresMensajesSoap manejador;
  
    /**Definimos nuestras tablas para la base de datos*/
    BaseDeDatosCatalogo catalogos;
    
    BaseDeDatosAtributos atributos;
    
    BaseDeDatosId ident;
    
    BaseDeDatosProveedores proveedor;
    
    
    
    /** Realiza una instancia de nusestra clase, en donde se crea la base de datos*/
    
	public  ServicioCatalogo() {
		
		 // Se registra una fecha ISO8601 como de inicio.
        FechaComienzoEjecucion = FechaISO8601.fechaISO();
        
        log = new Log("log_aplicacion");
        log.iniciar();
        
        catalogos= new BaseDeDatosCatalogo();
        atributos=new BaseDeDatosAtributos();
        ident=new BaseDeDatosId();
        proveedor=new BaseDeDatosProveedores();
        try{
        	if(catalogos.crearBaseDeDatos())
        		System.out.println("Se ha creado la Base de Datos para los catalogos");
        	if(atributos.crearBaseDeDatos())
        		System.out.println("Se ha creado la Base de Datos para los atributos");
        	if(ident.crearBaseDeDatos())
        		System.out.println("Se ha creado la Base de Datos para los ident");
        	if(proveedor.crearBaseDeDatos())
        		System.out.println("Se ha creado la Base de Datos para los proveedor");
        }catch(SQLException e){}
        
        
	}
	
	
	/** Instanciación del servicio en el que se permite cambiar su identificación*/
	public ServicioCatalogo(String identidad) {
        this();
        identidadServidor = identidad;
    }
   
	
	
	/** Ejecución del servicio. Se espera a recibir un mensaje, se ejcuta la petición,
	 * 	se manda la respuesta y lo ponemos de nuevo a la  escucha
	 * 
	 * @throws ExcepcionMensajeSOAP
	 * @throws SOAPException
	 * @throws SQLException
	 */
	public void ejecutarServicio() throws ExcepcionMensajeSOAP,SOAPException,SQLException{
        parar = false;
        
        /*
         * La estructura de este método de procesado de peticiones y respuestas
         * a nuestros servicio es la siguiente:
         * 
         *  WHILE parar == FALSE 
         *      recibir una nueva petición
         *      procesar la petición y generar la respuesta
         *      enviar la respuesta
         *  END WHILE
         *
         *  Cada uno de los 3 pasos de cada iteración se detalla más adelante
         */ 
        
        while ( !parar ) {
        	manejador= new ManejadoresMensajesSoap();
           
            /* Se crea un objeto MensajeSOAP para recibir un nuevo mensaje */
        	MensajeSOAP mensajePeticion= new MensajeSOAP();
          
            
           System.out.println("A la espera de peticiones");
            
                        
            /*Se pone a la escucha para recibir mensajes SOAP*/
            mensajePeticion.recibirMensajeSOAP();
             
            System.out.println("Se ha recibido una peticion");
            
            SOAPMessage mySoapMessage=mensajePeticion.getDocumentoSOAP();
         	
             
             System.out.println("mensajeSOAP recibido:"+mySoapMessage);
             
 			 System.out.println("Se ha recibido un mensaje");
             /*dentro va mensajePeticion*/
             SOAPMessage respuesta=realizarPeticion(mensajePeticion);      
        	 System.out.println();
        	 System.out.println("Se genera la respuesta y se lanza");
        	 manejador.envioRespuesta(respuesta);
             
        }
     }
           
    /** Realiza la peticion que se le solicita dependiendo de la que sea
     * 
     * @param mensaje El mensaje SOAP en donde está la petición
     * @return respuesta El mensaje respuesta a la solicitud realizada
     * @throws SOAPException
     */	 
    public SOAPMessage realizarPeticion(MensajeSOAP mensaje) throws SOAPException{
    	
    	//Será el mensaje que devolveremos
    	SOAPMessage respuesta=null;
    	System.out.println("Entramos");
    	/*Obtenemos el documento guardado en el mensaje*/
    	SOAPMessage mySoapMessage=mensaje.getDocumentoSOAP();
    	/*DocumentoSOAP documento = mensaje.getDocumentoSOAP();
    	
    	SOAPMessage mySoapMessage = documento.devolverMensaje();*/
    	try{
        	mySoapMessage.writeTo(System.out);
        }catch(Exception e){}
    	
    	
    	String tipo_peticion = manejador.comprobacionPeticion(mySoapMessage);
    	System.out.println();            	
    	System.out.println("La petición era:"+tipo_peticion);
    	  
         /*Si la peticion recibida era registrar*/   	
		if (tipo_peticion.equals(REGISTRAR)) {
			String identificador=new String();
			
			System.out.println("Vamos a registrar en la base de datos");
			
			
				String []array=manejador.comprobarProductos(mySoapMessage);
				
				if(array[0].equals(ERROR)){
					identificador=ERROR;
				}else{
    				int i=0;
    				for(i=0;i<array.length;i++)
    					System.out.println(array[i]);
    				i=0;
    				int j=0;
    				String []aux=new String[array.length];
    				/*Lo anterior esta mal si hay mas de un elemento*/
    				/*boolean entrar=true;*/
    		
            		String []auxiliar=new String[array.length];
            		
            				
            		while(array[i]=="nuevo_producto"){
            		
            		 
            			i++;
            			/*Copiamos en aux cada producto que queremos registrar*/
            			for(j=0;array[i]!="atributo";i++,j++){
            				if(array[i]=="id_par")
            					array[i+1]=ident.identificadorCorrespondientePar(array[i+1]);
            				aux[j]=array[i];
            			}
            			int cont=0;
            			for(i=0;aux[i]!=null;i++){
            				cont++;
            			}
            			String []aux2=new String[cont];
            			for(i=0;i<cont;i++){
            				aux2[i]=aux[i];
            				System.out.println(aux2[i]);
            			}
            			i++;
            			String id=catalogos.insertarDatos(aux2);
            			/*Deberiamos comprobar lo que se devuelve*/
            			identificador=id+":"+"final2:";
            			auxiliar[0]=id; /*el primer elemento debe ser el identificador de producto*/
            			for(j=1;i<array.length;i++,j++){
            				if(array[i]!="nuevo_producto")
            					auxiliar[j]=array[i];
            			}
            			cont=0;
            			if(auxiliar!=null){ /*Si no era un nuevo producto*/
            				for(i=0;auxiliar[i]!=null;i++){
            					cont++;
            				}
            				String []auxiliar2=new String[cont];
            				for(i=0;i<cont;i++){
            					auxiliar2[i]=auxiliar[i];
            					System.out.println(auxiliar2[i]);
            				}
            				atributos.insertarDatos(auxiliar2);
            			}
            		}
    				
    				System.out.println("Se ha registrado en la base de datos");
    				log.apuntar("se han registrado un producto en la base de datos");
				}
				
				respuesta=manejador.crearRespuesta(identificador);
			
			/*Si la peticion recibida era buscar un elemento concreto*/
			}else if(tipo_peticion.equals(BUSCAR)){
				String devolucion=new String();
				
									
				try{
					String []busqueda=manejador.elementosBusqueda(mySoapMessage);
					if(busqueda[0].equals(ERROR)){
						devolucion=ERROR;
						log.apuntar(ERROR);
					}else{
    					String [] resp=catalogos.buscar(atributos,busqueda);
    					if(resp[0].equals("0")){
    						devolucion=ERRORBUSQUEDA;
    						log.apuntar(ERRORBUSQUEDA);
    					}else{
    						int j=0;
    						for(j=0;j<resp.length;j++){
    							String []datos=catalogos.seleccionarDatosCatalogo(resp[j],atributos);
    							int i=0;
    							int nomb=0;
    							for(i=0;i<datos.length;i++){
    								if(datos[i]=="id_par")       								
    									nomb=i+1;        							
    							}
    						
    							String []datos2=proveedor.seleccionarDatosProveedores(datos[nomb]);      								        				
    						
    						
    							for(i=0;datos[i]!="atributo";i++){
    								if(datos[i]=="id_par"){
    									datos[i+1]=ident.identificadorCorrespondienteJxta(datos[i+1]);
    						
    								}
    							}
    						
    						//datos2[1]=ident.identificadorCorrespondienteJxta(datos2[1]);
  
    							System.out.println("Se ha encontrado en la base de datos");
    							log.apuntar("se ha efectuado una búsqueda en la base de datos");
    							devolucion=devolucion+"nuevo_producto:";
    							for(i=0;i<datos.length;i++){
    								devolucion=devolucion+datos[i]+":";
    							}
    							devolucion=devolucion+"final:";
    							for(i=2;i<datos2.length;i++)
    								devolucion=devolucion+datos2[i]+":";
    								
    						}
    						devolucion=devolucion+"final2:";
    						       										
    					}
    					System.out.println(devolucion);
					}
				}catch(Exception e){
					e.printStackTrace(System.out);
					devolucion=EXCEPCION;
					log.apuntar(e.getMessage());
				}
				
				//respuesta=generarRespuestaCategoria(devolucion);
				
				respuesta=manejador.crearRespuesta(devolucion);
			
			/*Si la peticion recibida era eliminar un elemento concreto*/
			}else if(tipo_peticion.equals(ELIMINAR)) {       				
				int i=0;
				boolean entrar=true;
				String cadena=new String();
				String []identificadores_produc=manejador.elementosEliminar(mySoapMessage);
				if(identificadores_produc[0].equals(ERROR)){
					cadena=ERROR;
					log.apuntar(ERROR);
				}else{
    				String par=identificadores_produc[0];
    				String par_correspondiente=ident.identificadorCorrespondientePar(par);
    				System.out.println(par_correspondiente);
    				
    				/*Solo se permiten eliminar los elementos que pertenezcan a este par*/
    				for(i=1;i<identificadores_produc.length;i++){
    					if(entrar)
    						entrar=catalogos.quitarDatosCatalogos(identificadores_produc[i],par_correspondiente,atributos);
    				
    				}
    				if(entrar==true){
        				System.out.println("Se han eliminado los elementos de las bases de datos");
        				cadena=BIEN;
        				log.apuntar("se han eliminado elementos de la base de datos");
    				}else{
    					System.out.println("No ha podido eliminarse el elemento");
        				cadena=ERRORELIMINACION;
        				log.apuntar(ERRORELIMINACION);
    				}
				}
    			respuesta=manejador.crearRespuesta(cadena);
				
    		/*Si la peticion recibida era el cambio de nombre del par*/
			}else if(tipo_peticion.equals(IDENTIFICADOR)){
				String cadena=new String();
				String []identificadores=manejador.verIdentificadores(mySoapMessage);
				if(identificadores[0].equals(ERROR))
					cadena=null;
				else{
    				try{
    					if(identificadores[0].equals("0"))/*Es la primera vez que se conecta*/
    						ident.insertarDatos(identificadores[1]);
    					else /*El resto de las veces*/
    						ident.actualizarId(identificadores);
    					cadena=BIEN;
    				}catch(SQLException e){
    					e.printStackTrace(System.out);
    					cadena=EXCEPCION;
    				}
				}
				respuesta=manejador.crearRespuesta(cadena);
				
			/*Si la peticion es almacenar los datos del par para una operacionde comercio electrónico*/
			}else if(tipo_peticion.equals(PROVEEDOR)){
				String cadena=new String();
				int i=0;
				
				String[]datos=manejador.obtenerDatos(mySoapMessage);
				if(datos[0].equals(ERROR))
					cadena=ERROR;
				else{
    				for(i=0;i<datos.length;i++){
    					System.out.println(datos[i]);
    				}
    				datos[1]=ident.identificadorCorrespondientePar(datos[1]);
    				
    				try{
    					proveedor.insertarDatos(datos);
    					cadena=BIEN;
    				}catch(Exception e){
    					e.printStackTrace(System.out);
    					cadena=EXCEPCION;
    				}
				}
				respuesta=manejador.crearRespuesta(cadena);
				
			/*Si se pretende ver todas las categorías almacenadas en la base de datos*/
			}else if(tipo_peticion.equals(VERCATEGORIAS)){
				int i=0;
				String cadena=new String();
				
				System.out.println("Entramos en vercategorias");
				int contador=catalogos.devolverContador();
				String []id=new String[contador];
				for(i=0;i<contador;i++){
					Integer b=new Integer(i+1);
					id[i]=b.toString();
				}
				if(contador==0){
					cadena=ERRORBUSQUEDA;
				}else{
					try{
						String []resultado=catalogos.seleccionarCategorias(id);
						
						for(i=0;i<resultado.length;i++){
							String apoyo=resultado[i]+":";
							cadena=cadena+apoyo;
						}
						String ultimo="final2:";
						cadena=cadena+ultimo;
						System.out.println(cadena);
						log.apuntar("se han listado categorías");
						
					}catch(Exception e){
						e.printStackTrace(System.out);
						cadena=EXCEPCION;
						log.apuntar(e.getMessage());
					}
				}
				System.out.println("Salimos de vercategorias");
				respuesta=manejador.crearRespuesta(cadena);
				
			/*Si se pretende ver  todos los productos almacenados en la base de datos*/	
			}else if(tipo_peticion.equals(VERPRODUCTOS)){
				String cadena=new String();   				
				
				System.out.println("Entramos en verproductos");
				int contador=catalogos.devolverContador();
				int i=0;
				String []id=new String[contador];
				for(i=0;i<contador;i++){
					Integer b=new Integer(i+1);
					id[i]=b.toString();
				}
				if(contador==0){
					cadena=ERRORBUSQUEDA;
				}else{
					try{
						String []resultado=catalogos.seleccionarProductos(id);
						for(i=0;i<resultado.length;i++){
							String apoyo=resultado[i]+":";
							cadena=cadena+apoyo;
						}
						String ultimo="final2:";
						cadena=cadena+ultimo;
						System.out.println(cadena);
						log.apuntar("se han listado productos");
					}catch(Exception e){
						e.printStackTrace(System.out);
						cadena=EXCEPCION;
						log.apuntar(e.getMessage());
					}
				}
				System.out.println("Salimos de verProductos");
				respuesta=manejador.crearRespuesta(cadena);
				
			/*Si se pretende cer todos los atributos almacenados en la base de datos*/	
			}else if(tipo_peticion.equals(VERATRIBUTOS)){

				int i=0;
				String cadena=new String();
				
				System.out.println("Entramos en veratributos");
				int contador=atributos.devolverContador();
				if(contador==0){
					cadena=ERRORBUSQUEDA;
				}else{
					String []id=new String[contador];
					for(i=0;i<contador;i++){
						Integer b=new Integer(i+1);
						id[i]=b.toString();
					}
					try{
						String []resultado=atributos.seleccionarAtributos(id);
						String []valores=atributos.seleccionarValor(id);
						//String lanzar=new String();
						for(i=0;i<resultado.length;i++){
							String apoyo="atributo"+":"+resultado[i]+":"+"valor"+":"+valores[i]+":";
							cadena=cadena+apoyo;
						}
						String ultimo="final2:";
						cadena=cadena+ultimo;
						System.out.println(cadena);
						log.apuntar("se han listado atributos");
						
					}catch(Exception e){
						e.printStackTrace(System.out);
						cadena=EXCEPCION;
						log.apuntar(e.getMessage());
					}
				}
				
				respuesta=manejador.crearRespuesta(cadena);
			
			/* Se pretende obtener los productos para una determinada categoría*/
			}else if(tipo_peticion.equals(PRODUCTOCATEGORIA)){
				
				String cadena=new String();
				
				System.out.println("Entramos en PRODUCTOCATEGORIA");
				int i=0;
				String []categoria=manejador.elementosBusqueda(mySoapMessage);
				if(categoria[0].equals(ERROR))
					cadena=ERROR;
				else{
    				try{
    					String []resultado=catalogos.visualizarProductos(categoria[1]);
    					for(i=0;i<resultado.length;i++){
    						String apoyo=resultado[i]+":";
    						cadena=cadena+apoyo;
    					}
    					String ultimo="final2:";
    					cadena=cadena+ultimo;
    					System.out.println(cadena);
    				
    				}catch(Exception e){
    					e.printStackTrace(System.out);
    					cadena=EXCEPCION;
    					log.apuntar(e.getMessage());
    				}
				}
				respuesta=manejador.crearRespuesta(cadena);	
			
			/*Se pretende obtener los atributos para una categoría y producto dados*/	
			}else if(tipo_peticion.equals(ATRIBUTOSPRODUCTO)){
				String cadena=new String();
				
				System.out.println("Entramos en atributosproducto");
				int i=0;
				String []atributs=manejador.elementosBusqueda(mySoapMessage);
				if(atributs[0].equals(ERROR))
					cadena=ERROR;
				else{
    				try{
    					String []resultado=catalogos.visualizarAtributos(atributs,atributos);
    					for(i=0;i<resultado.length;i++){
    						String apoyo=resultado[i]+":";
    						cadena=cadena+apoyo;
    					}
    					String ultimo="final2:";
    					cadena=cadena+ultimo;
    					System.out.println(cadena);	
    					
    				}catch(Exception e){
    					e.printStackTrace(System.out);
    					cadena=EXCEPCION;
    					log.apuntar(e.getMessage());
    				}
				}
				respuesta=manejador.crearRespuesta(cadena);
			
			/*Se pretende obtener todos los atributos para un producto dado*/
			}else if(tipo_peticion.equals(PRODUCTOATRIBUTO)){
				String cadena=new String();
				int i=0;
				
				String []atributs=manejador.elementosBusqueda(mySoapMessage);
				if(atributs[0].equals(ERROR))
					cadena=ERROR;
				else{
					String []atri=new String[4];
    				try{
    					if(atributs[0].equals("producto")){
    						atri[0]="categoria";
    						atri[1]="0";
    						atri[2]=atributs[0];
    						atri[3]=atributs[1];
    					}
    					String []resultado=catalogos.visualizarAtributos(atri,atributos);
    					//String lanzar=new String();
    					for(i=0;i<resultado.length;i++){
    						String apoyo=resultado[i]+":";
    						cadena=cadena+apoyo;
    					}
    					String ultimo="final2:";
    					cadena=cadena+ultimo;
    					System.out.println(cadena);	
    				}catch(Exception e){
    					e.printStackTrace(System.out);
    					cadena=EXCEPCION;
    					log.apuntar(e.getMessage());
    				}
				}
				respuesta=manejador.crearRespuesta(cadena);	
			
			}else{
				System.out.println("Error en la peticion");
				String cadena=ERROR;
				log.apuntar(ERROR);
				respuesta=manejador.crearRespuesta(cadena);	
			}
		
		
        return respuesta; 
   
    }
                    
}