package org.jactr.extensions.cached.procedural.listeners;
/*
* default logging
*/
import java.util.Collection;
import javolution.util.FastList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.buffer.IActivationBuffer;
import org.jactr.core.buffer.event.ActivationBufferEvent;
import org.jactr.core.buffer.event.ActivationBufferListenerAdaptor;
import org.jactr.extensions.cached.procedural.invalidators.IInvalidator;
public class BufferListener extends ActivationBufferListenerAdaptor
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(BufferListener.class);
private final IActivationBuffer _buffer;
/**
* invalidators that are flipped on any change to the buffer contents
*/
private Collection<IInvalidator> _generalInvalidators;
public BufferListener(IActivationBuffer buffer)
{
_generalInvalidators = new FastList<IInvalidator>();
_buffer = buffer;
_buffer.addListener(this, null);
}
public void dispose()
{
_generalInvalidators.clear();
_buffer.removeListener(this);
}
public IActivationBuffer getBuffer()
{
return _buffer;
}
@Override
public void sourceChunkAdded(ActivationBufferEvent abe)
{
invalidateAll();
}
@Override
public void sourceChunkRemoved(ActivationBufferEvent abe)
{
invalidateAll();
}
@Override
public void sourceChunksCleared(ActivationBufferEvent abe)
{
invalidateAll();
}
@Override
public void statusSlotChanged(ActivationBufferEvent abe)
{
/*
* we could use this for the slot change handling, but instead we'll use the
* general slot listener
*/
}
synchronized public void register(IInvalidator invalidator)
{
_generalInvalidators.add(invalidator);
}
synchronized public void unregister(IInvalidator invalidator)
{
_generalInvalidators.remove(invalidator);
}
synchronized private FastList<IInvalidator> getInvalidators()
{
FastList<IInvalidator> invalidators = FastList.newInstance();
invalidators.addAll(_generalInvalidators);
return invalidators;
}
private void invalidateAll()
{
FastList<IInvalidator> invalidators = getInvalidators();
try
{
if (invalidators.size() > 0)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(String.format(
"Invalidating due to content change of %s", _buffer));
for (IInvalidator invalidator : invalidators)
invalidator.invalidate();
}
}
catch (Exception e)
{
LOGGER.error("failed to invalidate ", e);
}
FastList.recycle(invalidators);
}
}