001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/io/sdeapi/SDEPool.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 org.deegree.framework.util.ObjectPool;
028    
029    /**
030     * class to manage a pool of sde connections.
031     * 
032     * 
033     * @author <a href="mailto:cpollmann@moss.de">Christoph Pollmann</a>
034     * @version 2.0
035     */
036    public class SDEPool extends ObjectPool {
037    
038        private String server = null;
039    
040        private String database = null;
041    
042        private int instance = 5151;
043    
044        private String version = null;
045    
046        private String user = null;
047    
048        private String password = null;
049    
050        // private constructor to protect initializing
051        /**
052         * @param server
053         * @param instance
054         * @param database
055         * @param version
056         * @param user
057         * @param password
058         */
059        public SDEPool( final String server, final int instance, final String database, final String version,
060                        final String user, final String password ) {
061    
062            this.server = server;
063            this.instance = instance;
064            this.database = database;
065            this.version = version;
066            this.user = user;
067            this.password = password;
068        }
069    
070        /**
071         * get an object from the object pool
072         * 
073         * @return an object from the object pool
074         * @throws Exception
075         */
076        public synchronized Object acquireObject()
077                                throws Exception {
078            try {
079                // if the maximum amount of instances are in use
080                // wait until an instance has been released back
081                // to the pool or 20 seconds has passed
082                long timediff = 0;
083                while ( in_use.size() == getMaxInstances() && timediff < 20000 ) {
084                    Thread.sleep( 100 );
085                    timediff += 100;
086                }
087                // if no instance has been released within 20 seconds
088                // or can newly be instantiated return null
089                if ( timediff >= 20000 )
090                    return null;
091    
092                // if a none used is available from the pool
093                if ( available.size() > 0 ) {
094    
095                    // get/remove ojebct from the pool
096                    Object o = available.remove( available.size() - 1 );
097                    if ( ( (SDEConnection) o ).isClosed() ) {
098                        o = acquireObject();
099                    }
100    
101                    // add it to 'in use' container
102                    in_use.add( o );
103    
104                    // reset its start life time
105                    startLifeTime.put( o, new Long( System.currentTimeMillis() ) );
106                    // set the start of its usage
107                    startUsageTime.put( o, new Long( System.currentTimeMillis() ) );
108    
109                    // return the object
110                    return o;
111    
112                }
113                // else instatiate a new object
114                Object connection = new SDEConnection( server, instance, database, version, user, password );
115    
116                existingInstances++;
117    
118                // add it to 'in use' container
119                in_use.add( connection );
120                // set the start of its life time
121                startLifeTime.put( connection, new Long( System.currentTimeMillis() ) );
122                // set the start of its usage
123                startUsageTime.put( connection, new Long( System.currentTimeMillis() ) );
124                // return the object
125                return connection;
126            } catch ( Exception e ) {
127                e.printStackTrace();
128                throw new Exception( "Error while acquiring connection: " + e.getMessage(), e );
129            }
130        }
131    
132        /**
133         * will be called when the object is removed from the pool
134         */
135        @Override
136        public void onObjectKill( Object o ) {
137            try {
138                ( (SDEConnection) o ).close();
139            } catch ( Exception e ) {
140                e.printStackTrace();
141            }
142        }
143    
144    }