﻿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());
		
}
    
}   


}
