package org.jactr.core.buffer.delegate;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.buffer.six.AbstractRequestableBuffer6;
import org.jactr.core.chunk.IChunk;
import org.jactr.core.logging.Logger;
import org.jactr.core.model.IModel;
import org.jactr.core.module.IModule;
import org.jactr.core.production.condition.ChunkPattern;
import org.jactr.core.production.request.IRequest;
public abstract class DefaultDelegatedRequestableBuffer6 extends
AbstractRequestableBuffer6 implements IDelegatedRequestableBuffer
{
/**
* Logger definition
*/
private static final transient Log LOGGER = LogFactory
.getLog(DefaultDelegatedRequestableBuffer6.class);
private Collection<IRequestDelegate> _processors;
private IChunk _sourceChunk;
public DefaultDelegatedRequestableBuffer6(String name, IModule module)
{
super(name, module);
_processors = new ArrayList<IRequestDelegate>();
}
public void addRequestDelegate(IRequestDelegate processor)
{
_processors.add(processor);
}
public Collection<IRequestDelegate> getRequestDelegates()
{
return _processors;
}
public void removeRequestDelegate(IRequestDelegate processor)
{
_processors.remove(processor);
}
public boolean willAccept(IRequest request)
{
for (IRequestDelegate delegate : getRequestDelegates())
if (delegate.willAccept(request)) return true;
return false;
}
protected boolean requestInternal(IRequest request, double requestTime)
throws IllegalArgumentException
{
for (IRequestDelegate delegate : getRequestDelegates())
if (delegate.willAccept(request) && delegate.request(request, this, requestTime))
return true;
IModel model = getModel();
if (LOGGER.isWarnEnabled() || Logger.hasLoggers(model))
{
StringBuilder sb = new StringBuilder(getName());
sb.append(" has no clue how to handle this request:");
sb.append(request).append(" ignoring.");
String msg = sb.toString();
LOGGER.warn(msg);
Logger.log(model, Logger.Stream.BUFFER, msg);
}
return false;
}
protected void setSourceChunkInternal(IChunk sourceChunk)
{
_sourceChunk = sourceChunk;
}
@Override
protected IChunk addSourceChunkInternal(IChunk chunkToInsert)
{
IChunk currentSource = getSourceChunk();
IChunk errorChunk = getErrorChunk();
/*
* did something go wrong? set the states..
*/
if (errorChunk.equals(chunkToInsert))
{
if (currentSource != null) removeSourceChunk(currentSource);
setStateChunk(errorChunk);
chunkToInsert = null;
}
/*
* all is good, let's set the chunk
*/
if (chunkToInsert != null)
{
if (currentSource != null) removeSourceChunk(currentSource);
setSourceChunkInternal(chunkToInsert);
setStateChunk(getFreeChunk());
setBufferChunk(getFullChunk());
}
return chunkToInsert;
}
@Override
protected IChunk getSourceChunkInternal()
{
return _sourceChunk;
}
@SuppressWarnings("unchecked")
@Override
protected Collection<IChunk> getSourceChunksInternal()
{
if (_sourceChunk == null)
return Collections.EMPTY_LIST;
else
return Collections.singleton(_sourceChunk);
}
@Override
protected boolean removeSourceChunkInternal(IChunk chunkToRemove)
{
if (chunkToRemove == null) return false;
IChunk current = getSourceChunk();
if (current != null && current.equals(chunkToRemove))
{
setSourceChunkInternal(null);
setStateChunk(getFreeChunk());
setBufferChunk(getEmptyChunk());
return true;
}
return false;
}
protected Collection<IChunk> clearInternal()
{
for(IRequestDelegate delegate : _processors)
delegate.clear();
Collection<IChunk> rtn = super.clearInternal();
return rtn;
}
}