package fr.eisti.sql;


/**
 * classe DatabaseConnector
 * permet de se connecter/dÃ©connecter Ã  une base de donnÃ©es Oracle
 * assure l'unicitÃ© de la connection (inspirÃ© du singleton)
 *
 * Utiliser uniquement les mÃ©thodes de DatabaseConnector pour ouvrir une
 * nouvelle connexion (ou obtenir celle en cours) et fermer une
 * connexion :
 *
 * Connection connection = DatabaseConnector.getConnection();
 * // use connection
 * DatabaseConnector.closeConnection();
 *
 * @author Matthias Colin
 * version 2.4 (10/06/2012)
 *
 * version 2 : paramÃ¨trage login/passwd
 * version 2.2 : paramÃ¨trage driver,serveur,port, bddname
 * version 2.3 : par defaut sur Oracle, paramÃ©trable pour mysql
 * version 2.4 : renommage de la classe et de quelques variables 
 */


import java.sql.*;

public class DatabaseConnector {

		
    // champs nÃ©cessaires Ã  la connexion
    
	// url de connexion Ã  la base
    private static String url= null;

   // classe du pilote qui gÃ¨re la connexion vers une BDD Oracle
    private static String driverClass = null;

    // login et mot de passe sur le serveur de BDD
    private static String login= null;
    private static String passwd= null;

    // champs assurant l'unicitÃ© de la connexion et du chargement du driver
    private static Connection refUniqueConnection = null;
    private static boolean isDriverRegistered = false;

	// quelques paramÃ¨tres par dÃ©faut pour un SGBD Oracle XE 10g
    private static final String ORACLE_BASE_URL = "jdbc:oracle:thin:";
    private static final String LOCAL_SERVER = "localhost";
    private static final int DEFAULT_PORT = 1521;
    private static final String ORACLE_XE_BDD = "XE";
	private static final String ORACLE_DRIVER_CLASS = "oracle.jdbc.driver.OracleDriver";

 
	/**
 	 * ParamÃ¨tre le connecteur avec un login et un mot de passe
 	 * permettant d'accÃ©der Ã  un serveur Oracle XE local. 
 	 * A faire une fois dans l'application.
 	 */ 	
	public static void setOracleXeLocalParameters(String pLogin, String pPasswd) {
		setParameters(ORACLE_BASE_URL, LOCAL_SERVER, DEFAULT_PORT, ORACLE_XE_BDD,
            ORACLE_DRIVER_CLASS, pLogin, pPasswd);
	}
    
	/**
 	 * ParamÃ¨tre le connecteur avec un login et un mot de passe
 	 * permettant d'accÃ©der Ã  un serveur Oracle avec le protocole thin 
 	 * A faire une fois dans l'application.
 	 */ 	
	public static void setParametersOracle(String pServerName, int pPort,
			String pBddname, String pLogin, String pPasswd) {
		setParameters(ORACLE_BASE_URL, pServerName, pPort, pBddname,
            ORACLE_DRIVER_CLASS, pLogin, pPasswd);
	}
    
	/**
 	 * ParamÃ¨tre le connecteur avec un login et un mot de passe
 	 * permettant d'accÃ©der au serveur Oracle. 
 	 * A faire une fois dans l'application.
 	 */ 	
	public static void setParameters(String pBaseUrl, String pServerName, int pPort,
			String pBddname, String pDriverClass, String pLogin, String pPasswd) {
		url = pBaseUrl + "@" + pServerName + ":" + pPort + ":" + pBddname;
        driverClass = pDriverClass;
		login = pLogin;
		passwd = pPasswd;
	}

    /**
 	* renvoie une connexion unique vers une base de donnÃ©e.
 	*/ 
    public static Connection getConnection(){
		//on regarde si la connexion existe dÃ©jÃ 
		if(refUniqueConnection == null){
		    try{
		        // chargement du driver de la BDD si besoin
	        	if (!isDriverRegistered) {
        			// chargement du driver
        		    DriverManager.registerDriver((Driver) (Class.forName(driverClass).newInstance()));
        		    System.out.println("Driver O.K.");
        		    isDriverRegistered = true;        		  
	        	}
        		// crÃ©ation de la connection
		        refUniqueConnection = DriverManager.getConnection(url,login,passwd);
		        System.out.println("Connexion effective !"); 
		    } catch (Exception e) {
				// on renvoie une connection nulle en cas d'erreurs de connexion
				System.err.println("Erreur de connexion à  la base : "
					+e.getMessage());
				// TODO : comportement modifiable
				// en cas d'erreur la rÃ©fÃ©rence nulle est renvoyÃ©e
			    refUniqueConnection = null;
		    }	    
		   
		}
		 else {
				System.out.println("Connexion déjà existante");}
		
		//on renvoie la connexion
		return refUniqueConnection;
	}
    
	/**
 	 * ferme la connexion en cours.
 	 */ 
    public static void closeConnection() {
		try{
			// fermeture de la connexion
		    refUniqueConnection.close();
			// suppression de la rÃ©fÃ©rence vers la connexion close
		    refUniqueConnection = null;
		    System.out.println("Connexion fermée !");
		}catch (SQLException e) {
			System.err.println("Erreur de fermeture d'accès à  la base : "
				+ e.getMessage());
		}
    }   

}
