/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ /* * Cr�� le 24 mars 05 * * Pour changer le mod�le de ce fichier g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ package org.squale.welcom.outils.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.Hashtable; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.GenericValidator; import org.squale.welcom.outils.Util; /** * @author M327837 Gere un collection de connection lors du possage de Welcom en Mode : MJDBC (Multiple connexion JDBC) */ public class WConnectionPool { /** logger */ private static Log logStartup = LogFactory.getLog( "Welcom" ); /** Liste de connexion disponible ... */ private static Hashtable connectionPool = new Hashtable(); /** Connection par defautl a inclure automatiquement dans les WAction, WDispatchAction */ private static WConnectionPool defaultConnection = null; /** Chaine de connection */ private WConnectionString connectionString; /** * Instancie une connection et verifie son bon fonctionnement * * @param pConnectionString Chaine de connexion */ private WConnectionPool( final WConnectionString pConnectionString ) { this.connectionString = pConnectionString; testConnection(); } /** * Ajoute une nouvelle connexion JDBC * * @param connectionString : Chaine de connexion */ public static void initDataSource( final WConnectionString connectionString ) { final WConnectionPool wConnectionPool = new WConnectionPool( connectionString ); connectionPool.put( connectionString.getName(), wConnectionPool ); if ( Util.isTrue( connectionString.getParDefault() ) ) { defaultConnection = wConnectionPool; } } /** * Retourne la connexion par default * * @return Retourne la connection par default ou la premiere connnexion si aucune definit * @throws SQLException : Aucune connection disponnible */ public static Connection getConnection() throws SQLException { if ( defaultConnection == null ) { if ( connectionPool.size() > 0 ) { defaultConnection = (WConnectionPool) connectionPool.elements().nextElement(); } else { throw new SQLException( "Aucune connexion definit par default dans le struts-config.xml, plugin Welcom" ); } } return defaultConnection.getInternalConnection(); } /** * Retourne la connexion en fonction du NAME definit lors de la creation de la connexion * * @param name nom de la connexion * @return Retourne la connexion * @throws SQLException : Aucune connexion disponnible sous ce nom */ public static Connection getConnection( final String name ) throws SQLException { if ( GenericValidator.isBlankOrNull( name ) ) { return getConnection(); } if ( !connectionPool.containsKey( name ) ) { throw new SQLException( "Aucune dataSource declar� sous le nom de " + name + ", verifier votre struts config" ); } return ( (WConnectionPool) connectionPool.get( name ) ).getInternalConnection(); } /** * Verfie que le connection fonctionne correctiement * * @return true si correcte et affiche les parametres de connexion */ private boolean testConnection() { try { final Connection conn = getInternalConnection(); logStartup.info( "URL : " + conn.getMetaData().getURL() ); logStartup.info( "User : " + conn.getMetaData().getUserName() ); return true; } catch ( final Exception e ) { logStartup.error( "Impossible d'�tablir une connexion � la base de donn�es sous le nom " + connectionString.getName() ); logStartup.error( "La declaration dans le fichier struts-config est du type : " ); logStartup.error( " <set-property property=\"dataSource(0).connectionString\" value=\"URL=jdbc/vidcco;PASS=jdbc;USER=LOLO;NAME=popo;DESCRIPTION=Hello\"/>" ); logStartup.error( e.getMessage(), e ); return false; } } /** * Returns a JDBC connection from a connection pool or other resource, to be used and closed promptly. * <p> * * @return JDBC connection from resource layer. * @exception SQLException on SQL or other errors. May wrap other exceptions depending on implementation. Will not * return null. */ private Connection getInternalConnection() throws SQLException { // la datasource genere DataSource ds = null; try { if ( ds == null ) { // create parameter list to access naming system final java.util.Hashtable parms = new java.util.Hashtable(); // Ajoute les parametres necessaire pour le jndi addJNDICompatabiliteMode( parms ); if ( !GenericValidator.isBlankOrNull( connectionString.getProviderUrl() ) ) { parms.put( javax.naming.Context.PROVIDER_URL, connectionString.getProviderUrl() ); } final javax.naming.Context ctx = new javax.naming.InitialContext( parms ); ds = (javax.sql.DataSource) ctx.lookup( connectionString.getJndiDataSource() ); } // use DataSource factory to get data server connection Connection conn = null; if ( !GenericValidator.isBlankOrNull( connectionString.getUserName() ) ) { conn = ds.getConnection( connectionString.getUserName(), connectionString.getUserPassword() ); } else { conn = ds.getConnection(); } return conn; } catch ( final Exception ex ) { logStartup.error( "WConnectionPool : Echec connexion : " + ex.getMessage() ); if ( ( ex == null ) || ( ex.getMessage() == null ) ) { logStartup.error( "Verifier la version de votre classes12.zip" ); logStartup.error( " ou Verifier la version de votre odbcj14.jar" ); } return null; } } /** * Ajoute dans les parametres pour recupere la connexion si on est en WAS 3.5 * * @param parms : Parametres pour rechercher la connexion dans le dictionnaire JNDI */ private void addJNDICompatabiliteMode( final java.util.Hashtable parms ) { try { Class.forName( "com.ibm.websphere.naming.WsnInitialContextFactory" ); parms.put( javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory" ); } catch ( final ClassNotFoundException e ) { logStartup.error( "Passage en mode compatibilit� WAS 3.5 " ); } } }