package org.jactr.core.utils.recyclable;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public abstract class AbstractThreadLocalRecyclableFactory<T> implements
RecyclableFactory<T>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(AbstractThreadLocalRecyclableFactory.class);
private int _size = 10;
private ThreadLocal<List<T>> _local = new ThreadLocal<List<T>>();
public AbstractThreadLocalRecyclableFactory()
{
this(10);
}
public AbstractThreadLocalRecyclableFactory(int maxCapacity)
{
setRecycleBinSize(maxCapacity);
}
public T newInstance(Object... params)
{
List<T> bin = getRecycleBin();
if (bin.size() > 0) return bin.remove(0);
return instantiate(params);
}
public void recycle(T obj)
{
cleanUp(obj);
List<T> bin = getRecycleBin();
if (bin.size() < _size)
bin.add(obj);
else
release(obj);
}
public int getRecycleBinSize()
{
return _size;
}
public void setRecycleBinSize(int size)
{
if (size <= 0) size = 10;
_size = size;
}
/**
* reset this object to its clean state
*
* @param obj
*/
abstract protected void cleanUp(T obj);
/**
* called if we are just going to release this to GC. last chance to cleanup
* resources, etc.
*
* @param obj
*/
abstract protected void release(T obj);
/**
* instantiate a new T
*
* @return
*/
abstract protected T instantiate(Object... params);
protected List<T> getRecycleBin()
{
List<T> rtn = _local.get();
if (rtn == null)
{
rtn = new ArrayList<T>(_size);
_local.set(rtn);
}
return rtn;
}
}