/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.frameworkset.common.poolman.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.frameworkset.common.poolman.PoolManConstants;
import com.frameworkset.common.poolman.sql.PrimaryKeyCacheManager;
/**
* An object that manages several pools of objects.
* @see SQLManager
*/
public class PoolManager {
private static Logger log = Logger.getLogger(PoolManager.class);
protected HashMap pools;
protected List<String> poolnames;
protected JDBCPool defaultpool;
protected PoolManager() {
this.pools = new HashMap(1);
this.defaultpool = null;
poolnames = new ArrayList<String>();
}
/**
*
* @return
* @deprecated use method public List<String> getAllPoolNames()
*/
// public Enumeration getAllPoolnames() {
// return pools.keys();
// }
public List<String> getAllPoolNames() {
return poolnames;
}
public JDBCPool getPool(String name) {
if (name == null)
return this.defaultpool;
if (pools.containsKey(name)) {
try {
return (JDBCPool) pools.get(name);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
log.info("ERROR: Could not locate " + name +
". This usually means that the " +
PoolManConstants.XML_CONFIG_FILE +
" file could not be found, or that it " +
"does not contain configuration data for a " +
"pool with a name equal to " + name);
return null;
}
public JDBCPool getPoolIfExist(String name) {
if (name == null)
return this.defaultpool;
if (pools.containsKey(name)) {
try {
return (JDBCPool) pools.get(name);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
return null;
// throw new NullPointerException("ERROR: Could not locate " + name +
// ". This usually means that the " +
// PoolManConstants.XML_CONFIG_FILE +
// " file could not be found, or that it " +
// "does not contain configuration data for a " +
// "pool with a name equal to " + name);
}
public boolean exist(String name)
{
return this.pools.containsKey(name);
}
public void addPool(String id, JDBCPool newpool) {
// if (this.pools.containsKey(id)) {
// System.out.println("ERROR: A pool identified by the id " + id +
// " already exists, ignoring it.");
// }
// else
this.pools.put(id, newpool);
if(!poolnames.contains(id))
poolnames.add(id);
if (this.defaultpool == null)
{
this.defaultpool = newpool;
}
else
{
if(defaultpool.getDBName() .equals( newpool.getDBName()))
{
try {
defaultpool.stopPool();
} catch (Exception e) {
log.error(e.getMessage(),e);
}
this.defaultpool = newpool;
}
}
}
public void removePool(String id) {
if (pools.containsKey(id)) {
int th = this.defaultpool.hashCode();
int oh = pools.get(id).hashCode();
if (th == oh)
this.defaultpool = null;
pools.remove(id);
poolnames.remove(id);
}
}
public Object requestObject() {
try {
return defaultpool.requestConnection();
} catch (Exception e) {
System.out.println("ERROR: Could not request object, returning NULL:");
}
return null;
}
public Object requestObject(String poolname) {
JDBCPool pool = null;
try {
pool = (JDBCPool) pools.get(poolname);
} catch (NullPointerException ne) {
}
if (pool != null) {
try {
return pool.requestConnection();
} catch (Exception e) {
log.error("Could not request object, returning NULL:",e);
}
}
return null;
}
// public void returnObject(Object o) {
//// defaultpool.returnConnection(o);
// }
// public void returnObject(Object o, String poolname) {
// JDBCPool pool = null;
// try {
// pool = (JDBCPool) pools.get(poolname);
// } catch (NullPointerException ne) {
// }
// if (pool != null)
// pool.returnConnection(o);
// }
public void destroyPools() {
if (this.pools != null) {
for (Iterator enum_ = pools.entrySet().iterator(); enum_.hasNext();) {
Map.Entry entry = (Map.Entry)enum_.next();
JDBCPool pool = (JDBCPool) entry.getValue();
try {
pool.closeAllResources();
} catch (Exception e) {
// TODO Auto-generated catch block
log.error(e.getMessage(),e);
}
}
pools.clear();
pools = null;
}
this.defaultpool = null;
this.poolnames = null;
try {
PrimaryKeyCacheManager.destroy();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}