⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fibonaccinativetest.java

📁 rule engine drools-2.0-beta-18
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        // <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 + -