001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/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 public SDEPool( final String server, final int instance, final String database,
052 final String version, final String user, final String password ) {
053
054 this.server = server;
055 this.instance = instance;
056 this.database = database;
057 this.version = version;
058 this.user = user;
059 this.password = password;
060 }
061
062 /**
063 * get an object from the object pool
064 */
065 public synchronized Object acquireObject()
066 throws Exception {
067 try {
068 // if the maximum amount of instances are in use
069 // wait until an instance has been released back
070 // to the pool or 20 seconds has passed
071 long timediff = 0;
072 while ( in_use.size() == getMaxInstances() && timediff < 20000 ) {
073 Thread.sleep( 100 );
074 timediff += 100;
075 }
076 // if no instance has been released within 20 seconds
077 // or can newly be instantiated return null
078 if ( timediff >= 20000 )
079 return null;
080
081 // if a none used is available from the pool
082 if ( available.size() > 0 ) {
083
084 // get/remove ojebct from the pool
085 Object o = available.remove( available.size() - 1 );
086 if ( ( (SDEConnection) o ).isClosed() ) {
087 o = acquireObject();
088 }
089
090 // add it to 'in use' container
091 in_use.add( o );
092
093 // reset its start life time
094 startLifeTime.put( o, new Long( System.currentTimeMillis() ) );
095 // set the start of its usage
096 startUsageTime.put( o, new Long( System.currentTimeMillis() ) );
097
098 // return the object
099 return o;
100
101 }
102 // else instatiate a new object
103 Object connection = new SDEConnection( server, instance, database, version, user,
104 password );
105
106 existingInstances++;
107
108 // add it to 'in use' container
109 in_use.add( connection );
110 // set the start of its life time
111 startLifeTime.put( connection, new Long( System.currentTimeMillis() ) );
112 // set the start of its usage
113 startUsageTime.put( connection, new Long( System.currentTimeMillis() ) );
114 // return the object
115 return connection;
116 } catch ( Exception e ) {
117 e.printStackTrace();
118 throw new Exception( "Error while acquiring connection: " + e.getMessage(), e );
119 }
120 }
121
122 /**
123 * will be called when the object is removed from the pool
124 */
125 public void onObjectKill( Object o ) {
126 try {
127 ( (SDEConnection) o ).close();
128 } catch ( Exception e ) {
129 e.printStackTrace();
130 }
131 }
132
133 }
134 /***************************************************************************************************
135 * Changes to this class. What the people have been up to:
136 * $Log$
137 * Revision 1.1 2006/05/21 19:11:43 poth
138 * initial load up
139 *
140 * Revision 1.1 2006/05/09 14:57:16 polli
141 * SDE datastore added
142 *
143 **************************************************************************************************/
144