package jadex.rules.rulesystem.rete;
import jadex.rules.rulesystem.AbstractAgenda;
import jadex.rules.rulesystem.IPatternMatcherFunctionality;
import jadex.rules.rulesystem.IPatternMatcherState;
import jadex.rules.rulesystem.IRule;
import jadex.rules.rulesystem.IRulebase;
import jadex.rules.rulesystem.IRulebaseListener;
import jadex.rules.rulesystem.rete.nodes.ReteMemory;
import jadex.rules.rulesystem.rete.nodes.ReteNode;
import jadex.rules.state.IOAVState;
import java.util.Iterator;
/**
* The static (reusable) part of a Rete matcher (i.e. the Rete network).
*/
public class RetePatternMatcherFunctionality
implements IPatternMatcherFunctionality, IRulebaseListener, Cloneable
{
//-------- attributes --------
/** The rulebase. */
protected IRulebase rulebase;
/** The rete node. */
protected ReteNode node;
//-------- constructors --------
/**
* Create a new Rete pattern matcher functionality.
*/
public RetePatternMatcherFunctionality(IRulebase rulebase)
{
this.rulebase = rulebase;
this.node = new ReteNode();
// Build existing rules of the rulebase.
for(Iterator it=rulebase.getRules().iterator(); it.hasNext(); )
node.addRule((IRule)it.next());
rulebase.addRulebaseListener(this);
}
/**
* Get the rulebase.
* @return The rulebase.
*/
public IRulebase getRulebase()
{
return rulebase;
}
/**
*
* /
public void setRulebase(IRulebase rulebase)
{
// Remove listener from old rulebase
if(this.rulebase!=null)
this.rulebase.removeRulebaseListener(this);
// Create executeable rules for new rulebase
this.rulebase = rulebase;
this.node = new ReteNode();
for(Iterator it=rulebase.getRules().iterator(); it.hasNext(); )
node.addRule((IRule)it.next());
// Track rulebase changes
rulebase.addRulebaseListener(this);
}*/
//-------- IRulebaseListener interface --------
/**
* Notification when a rule has been added.
* @param rule The added rule.
*/
public void ruleAdded(IRule rule)
{
node.addRule(rule);
}
/**
* Notification when a rule has been removed.
* @param rule The removed rule.
*/
public void ruleRemoved(IRule rule)
{
node.removeRule(rule);
}
//-------- IPatternMatcherFunctionality interface --------
/**
* Create a pattern matcher instance for a given state.
*/
public IPatternMatcherState createMatcherState(IOAVState state, AbstractAgenda agenda)
{
return new RetePatternMatcherState(node, state, new ReteMemory(state), agenda);
}
//-------- methods --------
/**
* Get the Rete node.
*/
public ReteNode getReteNode()
{
return node;
}
//-------- cloneable --------
/**
* Clone this object.
* @return A clone of this object.
*/
public Object clone()
{
RetePatternMatcherFunctionality ret = null;
try
{
ret = (RetePatternMatcherFunctionality)super.clone();
ret.rulebase = (IRulebase)rulebase.clone();
ret.rulebase.addRulebaseListener(ret);
ret.node = (ReteNode)node.clone();
}
catch(CloneNotSupportedException exception)
{
throw new RuntimeException("Cloning not supported: "+this);
}
return ret;
}
}