📄 fibonaccinativetest.java
字号:
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( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f1 = (Fibonacci) tuple.get( f1Declaration );
Fibonacci f2 = (Fibonacci) tuple.get( f2Declaration );
return f2.getSequence( ) == f1.getSequence( ) + 1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{f1Declaration, f2Declaration};
}
public String toString()
{
return "f2.getSequence() == (f1.getSequence()+1)";
}
};
calculateRule.addCondition( conditionCalculateA );
// <java:condition>f3.getSequence() ==
// (f2.getSequence()+1)</java:condition>
final Condition conditionCalculateB = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f2 = (Fibonacci) tuple.get( f2Declaration );
Fibonacci f3 = (Fibonacci) tuple.get( f3Declaration );
return f3.getSequence( ) == f2.getSequence( ) + 1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{f2Declaration, f3Declaration};
}
public String toString()
{
return "f3.getSequence() == (f2.getSequence()+1)";
}
};
calculateRule.addCondition( conditionCalculateB );
// <java:condition>f1.getValue() != -1</java:condition>
final Condition conditionCalculateC = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f1 = (Fibonacci) tuple.get( f1Declaration );
return f1.getValue( ) != -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{f1Declaration};
}
public String toString()
{
return "f1.getValue() != -1";
}
};
calculateRule.addCondition( conditionCalculateC );
// <java:condition>f2.getValue() != -1</java:condition>
final Condition conditionCalculateD = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f2 = (Fibonacci) tuple.get( f2Declaration );
return f2.getValue( ) != -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{f2Declaration};
}
public String toString()
{
return "f2.getValue() != -1";
}
};
calculateRule.addCondition( conditionCalculateD );
// <java:condition>f3.getValue() == -1</java:condition>
final Condition conditionCalculateE = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Fibonacci f3 = (Fibonacci) tuple.get( f3Declaration );
return f3.getValue( ) == -1;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{f3Declaration};
}
public String toString()
{
return "f3.getValue() == -1";
}
};
calculateRule.addCondition( conditionCalculateE );
// <java:consequence>
// f3.setValue( f1.getValue() + f2.getValue() );
// System.err.println( f3.getSequence() + " == " + f3.getValue() );
// drools.modifyObject( f3 );
// drools.retractObject( f1 );
// </java:consequence>
final Consequence calculateConsequence = new Consequence( )
{
public void invoke(Tuple tuple) throws ConsequenceException
{
WorkingMemory workingMemory = tuple.getWorkingMemory( );
Fibonacci f1 = (Fibonacci) tuple.get( f1Declaration );
Fibonacci f2 = (Fibonacci) tuple.get( f2Declaration );
Fibonacci f3 = (Fibonacci) tuple.get( f3Declaration );
f3.setValue( f1.getValue( ) + f2.getValue( ) );
try
{
workingMemory.modifyObject( tuple.getFactHandleForObject( f3 ),
f3 );
workingMemory.retractObject( tuple.getFactHandleForObject( f1 ) );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
FibTotal total = (FibTotal) workingMemory.getApplicationData( "fibtotal" );
total.setTotal( total.getTotal( ) + 1 );
}
};
calculateRule.setConsequence( calculateConsequence );
ruleSet.addRule( calculateRule );
// Build the RuleSet.
RuleBaseBuilder builder = new RuleBaseBuilder( ruleBaseContext );
builder.addRuleSet( ruleSet );
RuleBase ruleBase = builder.build( );
// test context before serlisation
assertSame( urlClassLoader,
ruleBase.getRuleBaseContext( ).get( "java-classLoader" ) );
// test context before serlisation
WorkingMemory workingMemory = ruleBase.newWorkingMemory( );
assertSame( urlClassLoader,
workingMemory.getRuleBase( ).getRuleBaseContext( ).get( "java-classLoader" ) );
// Dumper dumper = new Dumper( ruleBase );
// dumper.dumpReteToDot( System.err );
workingMemory = getWorkingMemory( ruleBase );
workingMemory.addEventListener( new TestWorkingMemoryEventListener( ) );
workingMemory.setApplicationData( "fibtotal",
new FibTotal( ) );
// Assert the facts, and fire the rules.
Fibonacci fibonacci = new Fibonacci( 50 );
workingMemory.assertObject( fibonacci );
// test serialization
workingMemory = serializeWorkingMemory( workingMemory );
workingMemory = serializeWorkingMemory( workingMemory );
workingMemory.fireAllRules( );
// test serialization
workingMemory = serializeWorkingMemory( workingMemory );
workingMemory = serializeWorkingMemory( workingMemory );
// test context after serlisation
assertNull( workingMemory.getRuleBase( ).getRuleBaseContext( ).get( "java-classLoader" ) );
// test application ran correctly
assertEquals( 2,
workingMemory.getObjects( ).size( ) );
Fibonacci a = (Fibonacci) workingMemory.getObjects( ).get( 0 );
Fibonacci b = (Fibonacci) workingMemory.getObjects( ).get( 1 );
assertEquals( 50,
a.getSequence( ) );
assertEquals( 49,
b.getSequence( ) );
assertEquals( 12586269025L,
a.getValue( ) );
assertEquals( 7778742049L,
b.getValue( ) );
// test application data
FibTotal total = (FibTotal) workingMemory.getApplicationData( "fibtotal" );
assertEquals( 50,
total.getTotal( ) );
// test listener
TestWorkingMemoryEventListener listener = (TestWorkingMemoryEventListener) workingMemory.getEventListeners( ).get( 0 );
assertEquals( 50,
listener.asserted );
assertEquals( 48,
listener.retracted );
assertEquals( 50,
listener.modified );
// can't test this as it changes on each run
// assertEquals(2024, listener.tested);
assertEquals( 100,
listener.created );
assertEquals( 99,
listener.fired );
assertEquals( 1,
listener.cancelled );
}
public static class Fibonacci
implements
Serializable
{
private int sequence;
private long value;
public Fibonacci(int sequence)
{
this.sequence = sequence;
this.value = -1;
}
public int getSequence()
{
return this.sequence;
}
public void setValue(long value)
{
this.value = value;
}
public long getValue()
{
return this.value;
}
public String toString()
{
return "Fibonacci(" + this.sequence + "/" + this.value + ")";
}
}
public static class FibTotal
implements
Serializable
{
int total;
public void setTotal(int total)
{
this.total = total;
}
public int getTotal()
{
return this.total;
}
}
private static WorkingMemory getWorkingMemory(RuleBase ruleBase) throws Exception
{
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream( );
ObjectOutput out = new ObjectOutputStream( bos );
out.writeObject( ruleBase.newWorkingMemory( ) );
out.close( );
// Get the bytes of the serialized object
byte[] bytes = bos.toByteArray( );
// Deserialize from a byte array
ObjectInput in = new ObjectInputStream( new ByteArrayInputStream( bytes ) );
WorkingMemory workingMemoryOut = (WorkingMemory) in.readObject( );
in.close( );
return workingMemoryOut;
}
private static WorkingMemory serializeWorkingMemory(WorkingMemory workingMemoryIn) throws Exception
{
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream( );
ObjectOutput out = new ObjectOutputStream( bos );
out.writeObject( workingMemoryIn );
out.close( );
// Get the bytes of the serialized object
byte[] bytes = bos.toByteArray( );
// Deserialize from a byte array
ObjectInput in = new ObjectInputStream( new ByteArrayInputStream( bytes ) );
WorkingMemory workingMemoryOut = (WorkingMemory) in.readObject( );
in.close( );
return workingMemoryOut;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -