package org.jactr.core.module.imaginal.six.buffer;
/*
* default logging
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.buffer.IActivationBuffer;
import org.jactr.core.buffer.delegate.AsynchronousRequestDelegate;
import org.jactr.core.buffer.six.AbstractActivationBuffer6;
import org.jactr.core.chunk.IChunk;
import org.jactr.core.chunk.ISymbolicChunk;
import org.jactr.core.chunktype.IllegalChunkTypeStateException;
import org.jactr.core.logging.Logger;
import org.jactr.core.model.IModel;
import org.jactr.core.module.imaginal.IImaginalModule;
import org.jactr.core.module.random.IRandomModule;
import org.jactr.core.production.request.IRequest;
import org.jactr.core.production.request.SlotBasedRequest;
import org.jactr.core.slot.IConditionalSlot;
import org.jactr.core.slot.IMutableSlot;
import org.jactr.core.slot.ISlot;
public class ImaginalSlotRequestDelegate extends AsynchronousRequestDelegate
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(ImaginalSlotRequestDelegate.class);
public ImaginalSlotRequestDelegate()
{
super();
setAsynchronous(true);
setUseBlockingTimedEvents(false);
}
public boolean willAccept(IRequest request)
{
return request instanceof SlotBasedRequest;
}
@Override
protected boolean isValid(IRequest request, IActivationBuffer buffer)
throws IllegalArgumentException
{
if (isBusy(buffer))
{
IModel model = buffer.getModel();
if (Logger.hasLoggers(model))
Logger.log(model, Logger.Stream.IMAGINAL,
"Ignoring request since currently busy : " + request);
return false;
}
IChunk chunk = buffer.getSourceChunk();
if (chunk == null)
throw new IllegalArgumentException("No chunk in " + buffer.getName());
ISymbolicChunk sc = chunk.getSymbolicChunk();
for (ISlot slot : ((SlotBasedRequest) request).getSlots())
{
boolean valid = false;
try
{
valid = null != sc.getSlot(slot.getName());
}
catch (IllegalChunkTypeStateException icse)
{
valid = false;
}
if (!valid)
throw new IllegalArgumentException("No slot named " + slot.getName()
+ " available in " + chunk);
}
return true;
}
protected double computeCompletionTime(double startTime, IRequest request,
IActivationBuffer buffer)
{
IImaginalModule imaginal = (IImaginalModule) buffer.getModule();
double rtn = super.computeCompletionTime(startTime, request, buffer);
if (imaginal.getAddDelayTime() > 0 || imaginal.isRandomizeDelaysEnabled())
rtn = computeTime(imaginal, startTime);
IModel model = buffer.getModel();
if (Logger.hasLoggers(model))
Logger.log(model, Logger.Stream.IMAGINAL, "Will modify "
+ buffer.getSourceChunk() + " at " + rtn);
return rtn;
}
@Override
protected Object startRequest(IRequest request, IActivationBuffer buffer, double requestTime)
{
setBusy(buffer);
return null;
}
@Override
protected void finishRequest(IRequest request, IActivationBuffer buffer,
Object startValue)
{
IChunk chunk = buffer.getSourceChunk();
if (chunk == null) return;
ISymbolicChunk sc = chunk.getSymbolicChunk();
for (IConditionalSlot slot : ((SlotBasedRequest) request)
.getConditionalSlots())
if (slot.getCondition() == IConditionalSlot.EQUALS)
((IMutableSlot) sc.getSlot(slot.getName())).setValue(slot.getValue());
flagAsFree(buffer);
}
private void flagAsFree(IActivationBuffer buffer)
{
AbstractActivationBuffer6 b = (AbstractActivationBuffer6) buffer;
b.setStateChunk(b.getFreeChunk());
}
private double computeTime(IImaginalModule imaginal, double currentTime)
{
double time = imaginal.getModifyDelayTime() + currentTime;
if (!imaginal.isRandomizeDelaysEnabled())
return time;
else
{
IRandomModule random = (IRandomModule) imaginal.getModel().getModule(
IRandomModule.class);
if (random == null)
return time;
else
return random.randomizedTime(time);
}
}
}