/*
 * Fichero:     BaseDeDatosId.java
 * Fecha:       20/10/06
 * Autor:       Alvaro Sarmiento Losada
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Es una clase para la creación y modificación  de una tabla
 * 				denominada "id". En ella se guardará la identificación
 * 				de los distintos proveedores de productos y el identificador 
 * 				propio que éste posee dentro de nuestro sistema de bases de 
 * 				datos.
 *
 * 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.bases;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * Tabla en donde se almacena el identificador que tienen los pares en nuestro sistema de bases de datos y el nombre que tienen los pares en la red JXTA. Se almacenan todos llos pares que interactúen con nuestra  aplicación
 * @author  Alvaro Sarmiento Losada
 */
public class BaseDeDatosId {
	Connection conn=null;
	int contador=0;


	public BaseDeDatosId() {

		String userName = "root";
		String password = "osito69";
		String url ="jdbc:mysql://localhost/test";
		try{
			Class.forName ("com.mysql.jdbc.Driver").newInstance();
				        	
			conn = DriverManager.getConnection(url, userName, password);
			System.out.println ("Conexion con la base de datos establecida");
			if(crearBaseDeDatos())
				System.out.println("Se ha creado la base de  datos");
		}catch (Exception E){
			System.out.println("No se puede conectar con el servidor de la Base de Datos");
		}
	}
	
	
	/**Permite la creación de la tabla
	 * 
	 * @return True si todo fue correcto. Eoc false
	 * @throws SQLException
	 */
	public boolean crearBaseDeDatos() throws SQLException{
		/*Crea la tabla*/
		 Statement s= conn.createStatement();
		 s.executeUpdate ("DROP TABLE IF EXISTS id");
		 s.executeUpdate(
		     "CREATE TABLE id("
		     + "id_par CHAR (40), id_jxta CHAR(80))");
		        
		    	
		 return true;
	}
		
	
	/** Devuelve el conector de la base de datos
	 * 
	 * @return El conector deseado
	 */
	Connection devolverConector(){
		return conn;
	}
		 
	
	/** Permite insertar nuevos pares en nuestra tabla
	 * 
	 * @param array El nombre de nuestro par
	 */
	public void insertarDatos(String array){
		/*Actualiza la tabla*/
		int count=0;
		
			
		try{
			
			contador++;
			Integer b=new Integer(contador);
			String contador_string=b.toString();
			
			PreparedStatement s = conn.prepareStatement (
					"INSERT INTO id(id_par,id_jxta) VALUES (?,?)");/*Esto son los valores que debemos pasarle al metodo*/
			s.setString(1,contador_string);
			s.setString(2,array);			
			count=s.executeUpdate();
			s.close();
			System.out.println(count + " filas que que han sido insertadas");
			
		}catch(SQLException e){
			System.out.println("Se ha producido un error en una sentencia SQL");
		}
	}

	/** Permite desconectarse de la base de datos*/
	public void desconectarseCatalogos(){
		/*Desconectarse de la base de datos*/
		
		if(conn != null){
			try{
				conn.close();
				System.out.println("Conexion con la Base de DAtos terminada");
			}catch(Exception E){}

		}
	}

	/** Eliminar un elemento de la tabla
	 * 
	 * @param identificador Identifica al par
	 * @return El número de elementos eliminados
	 */
	public int quitarDatosId(String identificador){
		int count=0;
		try{	
			PreparedStatement s = conn.prepareStatement (
					"DELETE FROM id WHERE id_par=?");
			s.setString(1,identificador);
			count=s.executeUpdate();
			if(count!=0){
				s.close();
			}else
				System.out.println("No ha podido efectuarse la eliminacion del elemento ");
		}catch(SQLException e){}
			
		return count;
	}
		
	
	/** Actualiza el registro de la tabla al nuevo nombre que tenga el par. Se le pasa el anterior
	 * 	y el nuevo nombre
	 * @param array Arreglo que contiene el anterior y el nuevo de los nombres
	 * @return True si fué correcto
	 * @throws SQLException
	 */
	public boolean actualizarId(String []array) throws SQLException{
		boolean resultado=false;
		String identificador=null;
		ResultSet auxiliar=null;
		
		System.out.println(array[0]);
		System.out.println(array[1]);
		
		Statement s=conn.createStatement();
		PreparedStatement p= conn.prepareStatement("SELECT id_par FROM id WHERE id_jxta=?");
		p.setString (1,array[0]);
		auxiliar= p.executeQuery();
		
		
		while(auxiliar.next()){			
			identificador=auxiliar.getString(1);
		}
		
		PreparedStatement h = conn.prepareStatement (
			"DELETE FROM id WHERE id_par=?");
		h.setString(1,identificador);
		int count=h.executeUpdate();
		System.out.println("Elementos eliminados:"+count);
		
		PreparedStatement g = conn.prepareStatement (
			"INSERT INTO id(id_par,id_jxta) VALUES (?,?)");/*Esto son los valores que debemos pasarle al metodo*/
		g.setString(1,identificador);
		g.setString(2,array[1]);			
		count=g.executeUpdate();
		System.out.println("Elementos introducidos:"+count);
		
		
		System.out.println("Se ha ejecutado el cambio de identificador");
		resultado=true;
			
		
		
		p.close();
		h.close();
		g.close();
		
		auxiliar.close();
		s.close();
	
		return resultado; /*si devuelve true es pq todas han sido encontradas*/
	}
	
	
	/** Permite obtener el identificador del par en nuestro sistema de bases de datos
	 * 	a partir de su nombre
	 * 
	 * @param id El nombre que tiene el par en la red JXTA
	 * @return El identificador en nuestra base de datos
	 */

		public String identificadorCorrespondientePar(String id){
			String resultado=null;
			
			ResultSet auxiliar=null;
			try{
			Statement s=conn.createStatement();
			PreparedStatement p= conn.prepareStatement("SELECT id_par FROM id WHERE id_jxta=?");
			p.setString (1,id);
			auxiliar= p.executeQuery();
		
			if(auxiliar.next())			
				resultado=auxiliar.getString(1);
			
			auxiliar.close();
			p.close();
			s.close();
			}catch(SQLException e){}
			
			return resultado;
			
		}
		
		
		/** Permite obtener su nombre en la red JXTA a partir del identificador que 
		 * tiene en la base de datos. Es la operación inversa al método anterior
		 * 
		 * @param id Identificador del par en la base de datos 
		 * @return El nombre que tiene en la red JXTA
		 */
		public String identificadorCorrespondienteJxta(String id){
			String resultado=null;
			
			ResultSet auxiliar=null;
			try{
			Statement s=conn.createStatement();
			PreparedStatement p= conn.prepareStatement("SELECT id_jxta FROM id WHERE id_par=?");
			p.setString (1,id);
			auxiliar= p.executeQuery();
		
			if(auxiliar.next())			
				resultado=auxiliar.getString(1);
			
			auxiliar.close();
			p.close();
			s.close();
			}catch(SQLException e){}
			
			return resultado;
			
		}
}
