package com.idega.util;
/**
* Title: idega default
* Description:
* Copyright: Copyright (c) 2001
* Company: idega
* @author <a href="tryggvi@idega.is">Tryggvi Larusson</a>, borrowed and modified from www.javaworld.com
* @version 1.0
*/
import java.util.Hashtable;
import java.util.Enumeration;
public abstract class ObjectPool
{
public ObjectPool()
{
this.expirationTime = 30000; // 30 seconds
this.locked = new Hashtable();
this.unlocked = new Hashtable();
}
private long expirationTime;
private Hashtable locked, unlocked;
abstract Object create();
abstract boolean validate( Object o );
abstract void expire( Object o );
synchronized Object checkOut()
{
long now = System.currentTimeMillis();
Object o;
if( this.unlocked.size() > 0 )
{
Enumeration e = this.unlocked.keys();
while( e.hasMoreElements() )
{
o = e.nextElement();
if( ( now - ( ( Long ) this.unlocked.get( o ) ).longValue() ) > this.expirationTime )
{
// object has expired
this.unlocked.remove( o );
expire( o );
o = null;
}
else
{
if( validate( o ) )
{
this.unlocked.remove( o );
this.locked.put( o, new Long( now ) );
return( o );
}
else
{
// object failed validation
this.unlocked.remove( o );
expire( o );
o = null;
}
}
}
}
// no objects available, create a new one
o = create();
this.locked.put( o, new Long( now ) );
return( o );
}
synchronized void checkIn( Object o )
{
this.locked.remove( o );
this.unlocked.put( o, new Long( System.currentTimeMillis() ) );
}
/**
* @todo implement
*
* checkIn(Object o, Object key)
*
* checkOut(Object key)
*
*/
}