package org.jactr.modules.pm.aural.delegate;
/*
* default logging
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.commonreality.identifier.IIdentifier;
import org.jactr.core.chunk.IChunk;
import org.jactr.core.logging.Logger;
import org.jactr.core.model.IModel;
import org.jactr.core.module.asynch.delegate.BasicAsynchronousModuleDelegate;
import org.jactr.core.production.request.IRequest;
import org.jactr.modules.pm.aural.AbstractAuralModule;
import org.jactr.modules.pm.aural.IAuralModule;
import org.jactr.modules.pm.aural.event.AuralModuleEvent;
import org.jactr.modules.pm.common.memory.PerceptualSearchResult;
public class AuralAttendingDelegate extends
BasicAsynchronousModuleDelegate<AbstractAuralModule, IChunk>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(AuralAttendingDelegate.class);
public AuralAttendingDelegate(AbstractAuralModule module)
{
super(module, module.getErrorChunk());
}
/**
* returns the contents of the perceptual search
*
* @param searchResult
* @param auralModule
* @param streamName
* @return
*/
public IChunk getSearchResult(PerceptualSearchResult searchResult,
IAuralModule auralModule, String streamName)
{
IModel model = auralModule.getModel();
IChunk errorChunk = model.getDeclarativeModule().getErrorChunk();
IChunk audioEvent = searchResult.getLocation();
IChunk auralPercept = searchResult.getPercept();
if (auralPercept == null || auralPercept.hasBeenDisposed())
{
// object has moved too far..
if (LOGGER.isDebugEnabled() || Logger.hasLoggers(model))
{
String msg = "Result of search found at " + audioEvent
+ " has changed too much since search occured, returning error";
if (LOGGER.isDebugEnabled()) LOGGER.debug(msg);
if (Logger.hasLoggers(model) && streamName != null)
Logger.log(model, streamName, msg);
}
return errorChunk;
}
/*
* this shouldnt occur. the id should be set as long as the visual object
* has not been disposed or encoded (removed from the visual buffer)
*/
IIdentifier afferentId = searchResult.getPerceptIdentifier();
if (afferentId == null)
{
if (LOGGER.isDebugEnabled() || Logger.hasLoggers(model))
{
String msg = "Result of search found at " + audioEvent
+ " has no identifier associated with it, returning error";
if (LOGGER.isWarnEnabled()) LOGGER.warn(msg);
if (Logger.hasLoggers(model) && streamName != null)
Logger.log(model, streamName, msg);
}
return errorChunk;
}
return auralPercept;
}
@Override
protected IChunk processInternal(IRequest request, double requestTime,
Object... parameters)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("Requesting attending " + request + " @ " + requestTime
+ " with " + getModule().getAuralMemory().getPendingUpdates()
+ " pending updates");
PerceptualSearchResult searchResult = (PerceptualSearchResult) parameters[0];
return getSearchResult(searchResult, getModule(), Logger.Stream.AURAL
.toString());
}
@Override
protected void processInternalCompleted(IRequest request, IChunk visualChunk,
Object... parameters)
{
AbstractAuralModule module = getModule();
if (module.hasListeners())
module.dispatch(new AuralModuleEvent(module,
AuralModuleEvent.Type.ENCODED, visualChunk));
}
@Override
protected boolean shouldProcess(IRequest request, Object... parameters)
{
AbstractAuralModule module = getModule();
IModel model = module.getModel();
PerceptualSearchResult searchResult = (PerceptualSearchResult) parameters[0];
/*
* make sure vis loc is valid
*/
if (searchResult == null)
{
String message = "Cannot encode without first having performed a search";
if (LOGGER.isWarnEnabled()) LOGGER.warn(message);
if (Logger.hasLoggers(model))
Logger.log(model, Logger.Stream.AURAL, message);
return false;
}
/*
* make sure vis loc is valid
*/
if (!searchResult.getLocation().isA(module.getAudioEventChunkType()))
{
String message = "An invalid move-attention was used, event does not contain a audio-event chunk ("
+ searchResult.getLocation() + ")";
if (LOGGER.isWarnEnabled()) LOGGER.warn(message);
if (Logger.hasLoggers(model))
Logger.log(model, Logger.Stream.AURAL, message);
return false;
}
return true;
}
}