001    //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/io/sdeapi/SDEConnectionPool.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2006 by: M.O.S.S. Computer Grafik Systeme GmbH
006     Hohenbrunner Weg 13
007     D-82024 Taufkirchen
008     http://www.moss.de/
009    
010     This library is free software; you can redistribute it and/or
011     modify it under the terms of the GNU Lesser General Public
012     License as published by the Free Software Foundation; either
013     version 2.1 of the License, or (at your option) any later version.
014    
015     This library is distributed in the hope that it will be useful,
016     but WITHOUT ANY WARRANTY; without even the implied warranty of
017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
018     Lesser General Public License for more details.
019    
020     You should have received a copy of the GNU Lesser General Public
021     License along with this library; if not, write to the Free Software
022     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
023    
024     ---------------------------------------------------------------------------*/
025    package org.deegree.io.sdeapi;
026    
027    import java.util.HashMap;
028    import java.util.Map;
029    
030    import org.deegree.io.DBPoolException;
031    
032    /**
033     * class to manage a pool of sde connections.
034     * 
035     * @author <a href="mailto:cpollmann@moss.de">Christoph Pollmann</a>
036     * @version 2.0
037     */
038    public class SDEConnectionPool {
039    
040        private static volatile SDEConnectionPool instance = null;
041    
042        private Map<String, SDEPool> pools = null;
043    
044        /**
045         * Creates a new SDEConnectionPool object.
046         */
047        private SDEConnectionPool() {
048            pools = new HashMap<String, SDEPool>();
049        }
050    
051        /**
052         * realize singelton pattern using double checked locking pattern.
053         * 
054         * @return an instance of the data base pool. it is gauranteed that there exists only one
055         *         instance of pool for each submitted class name.
056         * 
057         */
058        public static SDEConnectionPool getInstance() {
059            if ( instance == null ) {
060                synchronized ( SDEConnectionPool.class ) {
061                    if ( instance == null ) {
062                        instance = new SDEConnectionPool();
063                    }
064                }
065            }
066    
067            return instance;
068        }
069    
070        /**
071         * get an object from the object pool
072         * 
073         * @param server
074         * @param instance
075         * @param database
076         * @param version
077         * @param user
078         * @param password
079         * @return the connection
080         * @throws Exception
081         */
082        public synchronized SDEConnection acquireConnection( final String server, final int instance,
083                                                             final String database, final String version,
084                                                             final String user, final String password )
085                                throws Exception {
086            String q = server + instance + database + version + user;
087            SDEPool pool = pools.get( q );
088            if ( pool == null ) {
089                pool = new SDEPool( server, instance, database, version, user, password );
090                pools.put( q, pool );
091            }
092            return (SDEConnection) pool.acquireObject();
093        }
094    
095        /**
096         * releases a connection back to the pool
097         * 
098         * @param con
099         * @param server
100         * @param instance
101         * @param database
102         * @param version
103         * @param user
104         * @throws DBPoolException
105         */
106        public synchronized void releaseConnection( final SDEConnection con, final String server, final int instance,
107                                                    final String database, final String version, final String user )
108                                throws DBPoolException {
109            String q = server + instance + database + version + user;
110            SDEPool pool = pools.get( q );
111            try {
112                pool.releaseObject( con );
113            } catch ( Exception e ) {
114                throw new DBPoolException( "could not release connection", e );
115            }
116        }
117    }