001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_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 }