package org.jactr.modules.pm.motor.command; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.TreeMap; import javax.naming.OperationNotSupportedException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.commonreality.agents.IAgent; import org.commonreality.efferent.IEfferentCommand; import org.commonreality.identifier.IIdentifier; import org.commonreality.modalities.motor.MotorUtilities; import org.commonreality.object.IEfferentObject; import org.commonreality.object.delta.DeltaTracker; import org.commonreality.object.manager.IEfferentObjectManager; import org.jactr.core.model.IModel; import org.jactr.core.production.request.ChunkTypeRequest; import org.jactr.core.runtime.ACTRRuntime; public class DefaultCommandTranslator implements ICommandTranslator { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(DefaultCommandTranslator.class); private Collection<ICommandTranslatorDelegate> _delegates; private Map<String, IIdentifier> _muscleCache; public DefaultCommandTranslator() { _delegates = new ArrayList<ICommandTranslatorDelegate>(); _muscleCache = new TreeMap<String, IIdentifier>(); } public void add(ICommandTranslatorDelegate delegate) { _delegates.add(delegate); } public void remove(ICommandTranslatorDelegate delegate) { _delegates.remove(delegate); } public Collection<ICommandTranslatorDelegate> getDelegates() { return new ArrayList<ICommandTranslatorDelegate>(_delegates); } protected ICommandTranslatorDelegate getDelegate(ChunkTypeRequest request) throws IllegalArgumentException { for (ICommandTranslatorDelegate delegate : _delegates) if (delegate.handles(request)) return delegate; throw new IllegalArgumentException( "No ICommandTranslatorDelegate can handle " + request); } public IEfferentObject getMuscle(ChunkTypeRequest request, IModel model) throws IllegalArgumentException { return getDelegate(request).getMuscle(request, model); } public IEfferentCommand translate(ChunkTypeRequest request, IEfferentObject muscle, IModel model) throws IllegalArgumentException { return getDelegate(request).translate(request, muscle, model); } public void adjust(ChunkTypeRequest request, DeltaTracker tracker, IEfferentCommand command, IModel model) throws IllegalArgumentException, OperationNotSupportedException { getDelegate(request).adjust(request, tracker, command, model); } public IEfferentObject getMuscle(String muscleName, IModel model) throws IllegalArgumentException { IAgent agent = ACTRRuntime.getRuntime().getConnector().getAgent(model); IEfferentObjectManager manager = agent.getEfferentObjectManager(); IEfferentObject rtn = null; IIdentifier mid = _muscleCache.get(muscleName.toLowerCase()); if (mid == null) for (IIdentifier id : manager.getIdentifiers()) { rtn = manager.get(id); if (MotorUtilities.isMotor(rtn) && muscleName.equalsIgnoreCase(MotorUtilities.getName(rtn))) { _muscleCache.put(muscleName.toLowerCase(), id); break; } else rtn = null; } else rtn = manager.get(mid); if (rtn == null) throw new IllegalArgumentException("No muscle named " + muscleName + " found."); return rtn; } }