package org.jactr.tools.experiment.actions.jactr; /* * default logging */ import java.lang.reflect.Method; 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.IActivationBuffer; import org.jactr.core.model.IModel; import org.jactr.core.module.IModule; import org.jactr.core.queue.ITimedEvent; import org.jactr.core.queue.timedevents.IBufferBasedTimedEvent; import org.jactr.tools.experiment.IExperiment; import org.jactr.tools.experiment.actions.IAction; import org.jactr.tools.experiment.impl.IVariableContext; import org.jactr.tools.experiment.impl.VariableResolver; import org.jactr.tools.experiment.misc.ExperimentUtilities; import org.jactr.tools.experiment.misc.ModelUtilities; /** * clears a model (or all) buffer contents and any pending actions related to * the buffers * * @author harrison */ public class ClearAction implements IAction { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ClearAction.class); private String _models; private String _buffers; private String _modules; private IExperiment _experiment; public ClearAction(String models, String buffers, String modules, IExperiment experiment) { _experiment = experiment; _models = models; _buffers = buffers; _modules = modules; } public void fire(IVariableContext context) { Collection<IModel> models = null; if (!_models.equals("")) models = VariableResolver.getModels(_models, _experiment.getVariableResolver(), context); else { IModel model = ExperimentUtilities.getExperimentsModel(_experiment); if (model != null) models = Collections.singleton(model); } if (models.size() == 0) LOGGER.error("No clue what models to reward. " + _models + " did not resolve to any recognized models."); Collection<String> buffers = new ArrayList<String>(); for (String bufferName : _buffers.split(",")) { bufferName = bufferName.trim(); if (bufferName.equalsIgnoreCase("all")) break; if (bufferName.length() > 0) buffers.add(bufferName.toLowerCase()); } for (IModel model : models) clear(model, buffers); } private void resetModules(IModel model) { if (_modules == null || _modules.length() == 0) return; for (IModule module : model.getModules()) { /* * we are looking for an empty method matches _modules */ try { Method method = module.getClass().getMethod(_modules); method.invoke(module); } catch (NoSuchMethodException e) { if (LOGGER.isDebugEnabled()) LOGGER.debug( String.format("Could not find %1$s.%2$s, ignoring.", module.getClass(), _modules), e); } catch (Exception e) { LOGGER.error(String.format("Failed to invoke %1$s.%2$s", module.getClass(), _modules), e); } } } protected void clear(final IModel model, final Collection<String> buffers) { ModelUtilities.executeNow(model, new Runnable() { public void run() { if (LOGGER.isDebugEnabled()) LOGGER.debug("Attempting to reset modules for " + model); /* * */ resetModules(model); Collection<ITimedEvent> firing = model.getTimedEventQueue() .getFiringEvents(); Collection<ITimedEvent> pending = model.getTimedEventQueue() .getPendingEvents(); for (IActivationBuffer buffer : model.getActivationBuffers()) if (buffers.size() == 0 || buffers.contains(buffer.getName().toLowerCase())) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Clearing " + model + "." + buffer.getName()); // clear the buffer proper buffer.clear(); // and now any pending events for (ITimedEvent event : firing) if (event instanceof IBufferBasedTimedEvent) if (buffer == ((IBufferBasedTimedEvent) event).getBuffer()) if (!event.hasFired() && !event.hasAborted()) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Aborting " + event); event.abort(); } for (ITimedEvent event : pending) if (event instanceof IBufferBasedTimedEvent) if (buffer == ((IBufferBasedTimedEvent) event).getBuffer()) if (!event.hasFired() && !event.hasAborted()) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Aborting " + event); event.abort(); } } } }); } }