package org.jactr.tools.masterslave.slave;
/*
* default logging
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.model.IModel;
import org.jactr.core.production.VariableBindings;
import org.jactr.core.production.condition.AbstractSlotCondition;
import org.jactr.core.production.condition.CannotMatchException;
import org.jactr.core.production.condition.ICondition;
import org.jactr.core.production.condition.match.GeneralMatchFailure;
import org.jactr.core.production.request.SlotBasedRequest;
import org.jactr.core.slot.IConditionalSlot;
import org.jactr.core.slot.IUniqueSlotContainer;
import org.jactr.core.slot.ProxyUniqueSlotContainer;
import org.jactr.tools.masterslave.master.MasterExtension;
public class SlaveStateCondition extends AbstractSlotCondition
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(SlaveStateCondition.class);
static public final String IS_LOADED_SLOT = "is-loaded";
static public final String IS_RUNNING_SLOT = "is-running";
static public final String HAS_COMPLETED_SLOT = "has-completed";
static public final String ALIAS_SLOT = "alias";
static public final String MODEL_SLOT = "model";
private final IUniqueSlotContainer _slaveVariables;
private final String _alias;
public SlaveStateCondition()
{
setRequest(new SlotBasedRequest());
_slaveVariables = null;
_alias = null;
}
private SlaveStateCondition(SlaveStateCondition template, String alias,
IUniqueSlotContainer slaveVariables)
{
_alias = alias;
setRequest(new SlotBasedRequest(template.getSlots()));
_slaveVariables = slaveVariables;
}
public ICondition clone(IModel model, VariableBindings variableBindings)
throws CannotMatchException
{
String alias = null;
for (IConditionalSlot cSlot : getRequest().getConditionalSlots())
if (cSlot.getName().equalsIgnoreCase(ALIAS_SLOT)
&& cSlot.getCondition() == IConditionalSlot.EQUALS
&& cSlot.getValue() != null)
{
alias = cSlot.getValue().toString();
break;
}
IUniqueSlotContainer slaveContainer = null;
if (alias != null)
{
// assuming master
MasterExtension me = MasterExtension.getMaster(model);
if (me == null)
throw new CannotMatchException(new GeneralMatchFailure(this,
String.format("%s is not the master of %s", model, alias)));
slaveContainer = me.getSlaveVariables(alias);
if (slaveContainer == null)
throw new CannotMatchException(new GeneralMatchFailure(this,
String.format("Could not find variable container for %s", alias)));
}
else
{
// assuming slave
SlaveExtension se = SlaveExtension.getSlaveExtension(model);
if (se == null)
throw new CannotMatchException(new GeneralMatchFailure(this,
String.format("%s is not a slave", model)));
slaveContainer = se.getVariables();
if (slaveContainer == null)
throw new CannotMatchException(new GeneralMatchFailure(this,
String.format("Could not find variable container for %s", model)));
}
ProxyUniqueSlotContainer container = new ProxyUniqueSlotContainer(
slaveContainer);
// container.addSlotContainer(getRequest());
return new SlaveStateCondition(this, alias, container);
}
public int bind(IModel model, VariableBindings variableBindings,
boolean isIterative) throws CannotMatchException
{
try
{
return getRequest().bind(model, _alias, _slaveVariables,
variableBindings, isIterative);
}
catch (CannotMatchException cme)
{
throw cme;
}
catch (Exception e)
{
LOGGER.error("OOPS", e);
throw new CannotMatchException(e.getMessage());
}
}
@Override
public void dispose()
{
}
}