package org.jactr.tools.masterslave.slave; /* * default logging */ import java.util.Collection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.model.IModel; import org.jactr.core.production.CannotInstantiateException; import org.jactr.core.production.IInstantiation; import org.jactr.core.production.VariableBindings; import org.jactr.core.production.action.DefaultSlotAction; import org.jactr.core.production.action.IAction; import org.jactr.core.slot.BasicSlot; import org.jactr.core.slot.IMutableSlot; import org.jactr.core.slot.ISlot; import org.jactr.core.slot.IUniqueSlotContainer; import org.jactr.tools.masterslave.master.MasterExtension; /** * for the setting of variables in the slave state * * @author harrison */ public class SlaveVariableAction extends DefaultSlotAction { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(SlaveVariableAction.class); static private final String ALIAS_SLOT = SlaveStateCondition.ALIAS_SLOT; private final IUniqueSlotContainer _slaveVariables; public SlaveVariableAction() { _slaveVariables = null; } private SlaveVariableAction(IModel model, VariableBindings variableBindings, Collection<? extends ISlot> slots) throws CannotInstantiateException { super(variableBindings, slots); IUniqueSlotContainer slotContainer = null; ISlot aliasSlot = getSlot(ALIAS_SLOT); /* * if alias is defined, we are manipulating from the master */ if (aliasSlot != null && aliasSlot.getValue() != null) { String alias = aliasSlot.getValue().toString(); MasterExtension me = MasterExtension.getMaster(model); if (me == null) throw new CannotInstantiateException(String.format( "%s is not the master of %s", model, alias)); slotContainer = me.getSlaveVariables(alias); if (slotContainer == null) throw new CannotInstantiateException(String.format( "Could not find variable container for %s", alias)); } else { SlaveExtension se = SlaveExtension.getSlaveExtension(model); if (se == null) throw new CannotInstantiateException(String.format("%s is not a slave", model)); slotContainer = se.getVariables(); if (slotContainer == null) throw new CannotInstantiateException(String.format( "Could not find variable container for %s", model)); } _slaveVariables = slotContainer; } public IAction bind(VariableBindings variableBindings) throws CannotInstantiateException { return new SlaveVariableAction((IModel) variableBindings.get("=model"), variableBindings, getSlots()); } @Override public void dispose() { } @Override public double fire(IInstantiation instantiation, double firingTime) { /* * set some values.. */ for (ISlot slot : getSlots()) { String name = slot.getName(); // ignore system variables if (name.equalsIgnoreCase(SlaveStateCondition.ALIAS_SLOT) || name.equalsIgnoreCase(SlaveStateCondition.IS_LOADED_SLOT) || name.equalsIgnoreCase(SlaveStateCondition.IS_RUNNING_SLOT) || name.equalsIgnoreCase(SlaveStateCondition.HAS_COMPLETED_SLOT)) continue; IMutableSlot mSlot = (IMutableSlot) _slaveVariables.getSlot(name); if (mSlot != null) mSlot.setValue(slot.getValue()); else _slaveVariables.addSlot(new BasicSlot(name, slot.getValue())); } return 0; } }