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()));
        		    isDriverRegistered = true;
	        	}
        		// création de la connection
		        refUniqueConnection = DriverManager.getConnection(url,login,passwd);
		    } 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;
		    }
		}
		//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;
		}catch (SQLException e) {
			System.err.println("Erreur de fermeture d'accès à la base : "
				+ e.getMessage());
		}
    }   

}
