/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
**
** $Id$
**
** Class History
**
** Date Name Description
** ---------|------------|-----------------------------------------------
** 19Aug98 subtle start of recorded history
**
*/
package key;
import key.util.FilteredEnumeration;
import java.util.Enumeration;
import java.util.NoSuchElementException;
public final class ReferenceEnumeratorFilter implements key.util.FilteredEnumeration.Filter
{
EnumeratedThing container;
boolean resolve;
public ReferenceEnumeratorFilter( EnumeratedThing c, boolean r )
{
container = c;
resolve = r;
}
public boolean isValid( Object element, Enumeration enum )
{
Reference r = (Reference)element;
boolean v = r.isValid();
if( !v )
{
try
{
container.noSideEffectRemove( r );
}
catch( Exception e )
{
Log.error( "during isValid() in ReferenceEnumeratorFilter", e );
}
}
return( v );
}
public Object replace( Object element, Enumeration enum )
{
if( resolve )
{
try
{
return( ((Reference)element).get() );
}
catch( OutOfDateReferenceException e )
{
// this only occurs when the atom is
// deleted -during- our scan through
// this container, which is rare. In
// any case, start up again...
// (RECURSIVE code, beware)
return( enum.nextElement() );
}
}
else
return( element );
}
public static interface EnumeratedThing
{
void noSideEffectRemove( Reference r ) throws NonUniqueKeyException,NoSuchElementException,BadKeyException;
}
}