// Build the declaration and specify it as a parameter of the Bootstrap1
// Rule
// <parameter identifier="f">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration fDeclaration1 = bootstrap1Rule.addParameterDeclaration( "f",
fibonacciType );
// Build and Add the Condition to the Bootstrap1 Rule
// <java:condition>f.getSequence() == 1</java:condition>
final Condition conditionBootstrap1A = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f = (Fibonacci) tuple.get( fDeclaration1 );
return f.getSequence( ) == 1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{fDeclaration1};
}
public String toString()
{
return "f.getSequence() == 1";
}
};
bootstrap1Rule.addCondition( conditionBootstrap1A );
// <java:condition>f.getValue() == -1</java:condition>
final Condition conditionBootstrap1B = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f = (Fibonacci) tuple.get( fDeclaration1 );
return f.getValue( ) == -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{fDeclaration1};
}
public String toString()
{
return "f.getValue() == -1";
}
};
bootstrap1Rule.addCondition( conditionBootstrap1B );
// Build and Add the Consequence to the Bootstrap1 Rule
// <java:consequence>
// f.setValue( 1 );
// System.err.println( f.getSequence() + " == " + f.getValue() );
// drools.modifyObject( f );
// </java:consequence>
final Consequence bootstrapConsequence = new Consequence( )
{
public void invoke(Tuple tuple) throws ConsequenceException
{
WorkingMemory workingMemory = tuple.getWorkingMemory( );
Fibonacci f = (Fibonacci) tuple.get( fDeclaration1 );
f.setValue( 1 );
try
{
workingMemory.modifyObject( tuple.getFactHandleForObject( f ),
f );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
FibTotal total = (FibTotal) workingMemory.getApplicationData( "fibtotal" );
total.setTotal( total.getTotal( ) + 1 );
}
};
bootstrap1Rule.setConsequence( bootstrapConsequence );
ruleSet.addRule( bootstrap1Rule );
// <rule name="Bootstrap 2">
final Rule bootstrap2Rule = new Rule( "Bootstrap 2" );
// Specify the declaration as a parameter of the Bootstrap2 Rule
// <parameter identifier="f">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration fDeclaration2 = bootstrap2Rule.addParameterDeclaration( "f",
fibonacciType );
// Build and Add the Conditions to the Bootstrap1 Rule
// <java:condition>f.getSequence() == 2</java:condition>
final Condition conditionBootstrap2A = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f = (Fibonacci) tuple.get( fDeclaration2 );
return f.getSequence( ) == 2;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{fDeclaration2};
}
public String toString()
{
return "f.getSequence() == 2";
}
};
bootstrap2Rule.addCondition( conditionBootstrap2A );
// <java:condition>f.getValue() == -1</java:condition>
final Condition conditionBootstrap2B = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f = (Fibonacci) tuple.get( fDeclaration2 );
return f.getValue( ) == -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{fDeclaration2};
}
public String toString()
{
return "f.getValue() == -1";
}
};
bootstrap2Rule.addCondition( conditionBootstrap2B );
// Build and Add the Consequence to the Bootstrap1 Rule
// <java:consequence>
// f.setValue( 1 );
// System.err.println( f.getSequence() + " == " + f.getValue() );
// drools.modifyObject( f );
// </java:consequence>
final Consequence bootstrap2Consequence = new Consequence( )
{
public void invoke(Tuple tuple) throws ConsequenceException
{
WorkingMemory workingMemory = tuple.getWorkingMemory( );
Fibonacci f = (Fibonacci) tuple.get( fDeclaration2 );
f.setValue( 1 );
try
{
workingMemory.modifyObject( tuple.getFactHandleForObject( f ),
f );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
FibTotal total = (FibTotal) workingMemory.getApplicationData( "fibtotal" );
total.setTotal( total.getTotal( ) + 1 );
}
};
bootstrap2Rule.setConsequence( bootstrap2Consequence );
ruleSet.addRule( bootstrap2Rule );
// <rule name="Recurse" salience="10">
final Rule recurseRule = new Rule( "Recurse" );
recurseRule.setSalience( 10 );
// <parameter identifier="f">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration fDeclarationRecurse = recurseRule.addParameterDeclaration( "f",
fibonacciType );
// <java:condition>f.getValue() == -1</java:condition>
final Condition conditionRecurse = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f = (Fibonacci) tuple.get( fDeclarationRecurse );
return f.getValue( ) == -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{fDeclarationRecurse};
}
public String toString()
{
return "f.getValue() == -1";
}
};
recurseRule.addCondition( conditionRecurse );
// <java:consequence>
// System.err.println( "recurse for " + f.getSequence() );
// drools.assertObject( new Fibonacci( f.getSequence() - 1 ) );
// </java:consequence>
final Consequence recurseConsequence = new Consequence( )
{
public void invoke(Tuple tuple) throws ConsequenceException
{
WorkingMemory workingMemory = tuple.getWorkingMemory( );
Fibonacci f = (Fibonacci) tuple.get( fDeclarationRecurse );
try
{
workingMemory.assertObject( new Fibonacci( f.getSequence( ) - 1 ) );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
}
};
recurseRule.setConsequence( recurseConsequence );
ruleSet.addRule( recurseRule );
// <rule name="Calculate">
final Rule calculateRule = new Rule( "Calculate" );
// <parameter identifier="f1">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration f1Declaration = calculateRule.addParameterDeclaration( "f1",
fibonacciType );
// <parameter identifier="f2">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration f2Declaration = calculateRule.addParameterDeclaration( "f2",
fibonacciType );
// <parameter identifier="f3">
// <class>org.drools.examples.fibonacci.Fibonacci</class>
// </parameter>
final Declaration f3Declaration = calculateRule.addParameterDeclaration( "f3",
fibonacciType );
// <java:condition>f2.getSequence() ==
// (f1.getSequence()+1)</java:condition>
final Condition conditionCalculateA = new Condition( )