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.AddChunkRequestDelegate; import org.jactr.core.buffer.delegate.AddChunkTypeRequestDelegate; import org.jactr.core.buffer.six.AbstractActivationBuffer6; 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.ChunkRequest; import org.jactr.core.production.request.ChunkTypeRequest; import org.jactr.core.production.request.IRequest; import org.jactr.core.queue.ITimedEvent; import org.jactr.core.queue.timedevents.AbstractTimedEvent; import org.jactr.core.runtime.ACTRRuntime; /** * extends the {@link AddChunkRequestDelegate} to include to handling of * {@link IImaginalModule#getAddDelayTime()} * * @author harrison */ public class ImaginalAddChunkTypeRequestDelegate extends AddChunkTypeRequestDelegate { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ImaginalAddChunkTypeRequestDelegate.class); public ImaginalAddChunkTypeRequestDelegate() { super(); setAsynchronous(true); setUseBlockingTimedEvents(false); } protected boolean isValid(IRequest request, IActivationBuffer buffer) { 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; } return super.isValid(request, buffer); } 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 = ImaginalAddChunkRequestDelegate.computeTime(imaginal, startTime); IModel model = buffer.getModel(); if (Logger.hasLoggers(model)) Logger.log(model, Logger.Stream.IMAGINAL, "Will add " + ((ChunkTypeRequest) request).getChunkType() + " at " + rtn); return rtn; } protected Object startRequest(IRequest request, IActivationBuffer buffer, double requestTime) { Object rtn = super.startRequest(request, buffer, requestTime); // clear the current buffer.removeSourceChunk(buffer.getSourceChunk()); setBusy(buffer); return rtn; } protected void finishRequest(IRequest request, IActivationBuffer buffer, Object startValue) { super.finishRequest(request, buffer, startValue); } }