package org.huihoo.jfox.pool;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class SimpleObjectPool extends AbstractObjectPool {
private volatile int numWorking = 0;
private List pool = Collections.synchronizedList(new ArrayList());
private int maxRest = 10;
private int initNum = 5;
public SimpleObjectPool(ObjectFactory factory) {
this(factory,5,10);
}
public SimpleObjectPool(ObjectFactory factory, int initNum, int maxRest){
super(factory);
this.factory = factory;
this.initNum = initNum;
this.maxRest = maxRest;
}
public SimpleObjectPool(String objectFactoryClassName, String poolableClassName) {
super(objectFactoryClassName, poolableClassName);
}
public SimpleObjectPool(String objectFactoryClassName, String poolableClassName, int initNum, int maxRest) {
super(objectFactoryClassName, poolableClassName);
this.initNum = initNum;
this.maxRest = maxRest;
}
public synchronized PoolableObject retrieveObject() throws Exception {
logger.debug("retrieve object, pool size is " + pool.size() + ", max rest is " + maxRest);
PoolableObject obj = null;
synchronized(pool) {
if(pool.size() > 0){
obj = (PoolableObject)pool.remove(0);
}
}
if(obj == null){ obj = factory.makeObject();
}
if(obj != null) {
obj.activate();
}
numWorking++;
return obj;
}
public boolean restoreObject(PoolableObject obj) {
logger.debug("restore object " + obj + ", pool size " + pool.size());
numWorking--;
PoolableObject realObject = obj;
if(factory.validateObject(realObject)) {
try {
obj.passivate();
synchronized(pool){
if(pool.size() < initNum || (pool.size() < maxRest && numWorking > 0)) {
pool.add(realObject);
return true;
}
else {
factory.destroyObject(realObject);
return false;
}
}
}
catch(Exception e){
try {
factory.destroyObject(realObject);
}
catch(Exception ex) {
logger.warn(e);
}
return false;
}
}
else {
try {
factory.destroyObject(realObject);
}
catch(Exception e){
logger.warn(e.getMessage(),e);
}
return false;
}
}
public boolean removeObject(PoolableObject obj) {
logger.debug("remove object " + obj);
return pool.remove(obj);
}
public synchronized void clear() {
logger.debug("clear object pool");
Iterator iter = pool.iterator();
while(iter.hasNext()) {
try {
factory.destroyObject((PoolableObject)iter.next());
}
catch(Exception e) {
logger.warn(e);
}
}
synchronized (pool){
pool.clear();
}
}
public int getWorking() {
return numWorking;
}
public int getRest() {
return pool.size();
}
protected void doInit() throws Exception {
logger.debug("make " + initNum + " poolable object");
int i = initNum;
while(i-- > 0){
try {
pool.add(factory.makeObject());
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
protected void doDestroy() throws Exception {
this.clear();
}
public int getInitNum() {
return initNum;
}
public int getMaxRest() {
return maxRest;
}
public static void main(String[] args) {
}
}