001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: ConnectionPoolManager.java 468638 2006-10-28 06:52:06Z minchau $
020 */
021
022
023 package org.apache.xalan.lib.sql;
024
025 import java.util.Hashtable;
026
027 import org.apache.xalan.res.XSLMessages;
028 import org.apache.xalan.res.XSLTErrorResources;
029
030 /**
031 */
032 public class ConnectionPoolManager
033 {
034 /**
035 */
036 private static Hashtable m_poolTable = null;
037
038 /**
039 */
040 public ConnectionPoolManager( )
041 {
042 init();
043 }
044
045 /**
046 * Initialize the internal structures of the Pool Manager
047 *
048 */
049 private synchronized void init( )
050 {
051 /**
052 * Only do this process once
053 * Initialize the pool table
054 */
055 if (m_poolTable == null)
056 m_poolTable = new Hashtable();
057 }
058
059 /**
060 * Register a nuew connection pool to the global pool table.
061 * If a pool by that name currently exists, then throw an
062 * IllegalArgumentException stating that the pool already
063 * exist.
064 * @param name
065 * @param pool
066 *
067 * @link org.apache.xalan.lib.sql.ConnectionPool}
068 *
069 * @throws <code>IllegalArgumentException</code>, throw this exception
070 * if a pool with the same name currently exists.
071 */
072 public synchronized void registerPool( String name, ConnectionPool pool )
073 {
074 if ( m_poolTable.containsKey(name) )
075 {
076 throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_POOL_EXISTS, null)); //"Pool already exists");
077 }
078
079 m_poolTable.put(name, pool);
080 }
081
082 /**
083 * Remove a pool from the global table. If the pool still has
084 * active connections, then only mark this pool as inactive and
085 * leave it around until all the existing connections are closed.
086 * @param name
087 *
088 */
089 public synchronized void removePool( String name )
090 {
091 ConnectionPool pool = getPool(name);
092
093 if (null != pool)
094 {
095 //
096 // Disable future use of this pool under the Xalan
097 // extension only. This flag should only exist in the
098 // wrapper and not in the actual pool implementation.
099 pool.setPoolEnabled(false);
100
101
102 //
103 // Remove the pool from the Hashtable if we don'd have
104 // any active connections.
105 //
106 if ( ! pool.hasActiveConnections() ) m_poolTable.remove(name);
107 }
108
109 }
110
111
112 /**
113 * Return the connection pool referenced by the name
114 * @param name
115 *
116 * @return <code>ConnectionPool</code> a reference to the ConnectionPool
117 * object stored in the Pool Table. If the named pool does not exist, return
118 * null
119 */
120 public synchronized ConnectionPool getPool( String name )
121 {
122 return (ConnectionPool) m_poolTable.get(name);
123 }
124
125 }