📄 fibonaccinativetest.java
字号:
// <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( ) { 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, WorkingMemory workingMemory) throws ConsequenceException { 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( ); builder.addRuleSet( ruleSet ); RuleBase ruleBase = builder.build( ); //Dumper dumper = new Dumper( ruleBase ); //dumper.dumpReteToDot( System.err ); WorkingMemory 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 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 + -