[jboss-svn-commits] JBL Code SVN: r19999 - in labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools: integrationtests and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat May 17 23:33:08 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-05-17 23:33:07 -0400 (Sat, 17 May 2008)
New Revision: 19999

Removed:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/persister/
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
Log:
JBRULES-1598 Efficient WorkingMemory serialization with binary protocol
-Some refactoring tidyups on various class names

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-05-18 03:11:26 UTC (rev 19998)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-05-18 03:33:07 UTC (rev 19999)
@@ -1,5 +1,7 @@
 package org.drools.integrationtests;
 
+import static org.drools.integrationtests.SerializationHelper.getSerialisedStatefulSession;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStreamReader;
@@ -15,7 +17,11 @@
 import junit.framework.TestCase;
 
 import org.drools.Address;
+import org.drools.Cell;
 import org.drools.Cheese;
+import org.drools.FactA;
+import org.drools.FactB;
+import org.drools.FactC;
 import org.drools.Person;
 import org.drools.Primitives;
 import org.drools.RuleBase;
@@ -23,11 +29,18 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassObjectType;
 import org.drools.base.MapGlobalResolver;
+import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.marshalling.DefaultMarshaller;
 import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.RuleBaseNodes;
+import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.RuleTerminalNode;
 import org.drools.rule.MapBackedClassLoader;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
@@ -473,7 +486,7 @@
 
         // serialize session and rulebase out
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new Marshaller();
+        Marshaller marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos, marshaller );
         GlobalResolver resolver = session.getGlobalResolver();
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
@@ -548,7 +561,7 @@
 
         GlobalResolver resolver = session.getGlobalResolver();
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new Marshaller();        
+        Marshaller marshaller = new DefaultMarshaller();        
         ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -620,7 +633,7 @@
 
         GlobalResolver resolver = session.getGlobalResolver();
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new Marshaller();          
+        Marshaller marshaller = new DefaultMarshaller();          
         ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -666,7 +679,7 @@
 
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
-        marshaller = new Marshaller();
+        marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos, marshaller );        
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -713,7 +726,7 @@
 
         resolver = session.getGlobalResolver();
         baos = new ByteArrayOutputStream();
-        marshaller = new Marshaller();
+        marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos, marshaller );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
         session.dispose();
@@ -788,7 +801,7 @@
         session.fireAllRules();
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Marshaller marshaller = new Marshaller();
+        Marshaller marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos, marshaller );
         byte[] serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -829,7 +842,7 @@
         serializedRulebase = null;
 
         baos = new ByteArrayOutputStream();
-        marshaller = new Marshaller();
+        marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos, marshaller );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -883,7 +896,7 @@
         byte[] serializedSession = null;
         serializedRulebase = null;
         baos = new ByteArrayOutputStream();
-        marshaller = new Marshaller();
+        marshaller = new DefaultMarshaller();
         ruleBase.writeStatefulSession( session, baos,marshaller  );
         serializedRulebase = DroolsStreamUtils.streamOut( ruleBase );
 
@@ -955,9 +968,946 @@
         Package p_ = (Package) DroolsStreamUtils.streamIn( ser,
                                                            loader );
         assertNotNull( p_ );
+    }
 
+    public void testEmptyRule() throws Exception {
+        String rule = "package org.test;\n";
+        rule += "global java.util.List list\n";
+        rule += "rule \"Rule 1\"\n";
+        rule += "when\n";
+        rule += "then\n";
+        rule += "    list.add( \"fired\" );\n";
+        rule += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule ) );
+        assertTrue( builder.getErrors().isEmpty() );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "InitialFact",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        session = getSerialisedStatefulSession( session );
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( "fired",
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
     }
 
+    public void testDynamicEmptyRule() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"fired1\" );\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "when\n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"fired2\" );\n";
+        rule2 += "end";
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "InitialFact",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+        StatefulSession session1 = getSerialisedStatefulSession( session );
+        session1.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session1.getGlobal( "list" )).size() );
+
+        WorkingMemory session2 = getSerialisedStatefulSession( session1,
+                                                               true );
+
+        session.dispose();
+        session1.dispose();
+
+        builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        pkg = builder.getPackage();
+
+        ruleBase.addPackage( pkg );
+
+        assertEquals( 2,
+                      ((List) session2.getGlobal( "list" )).size() );
+        assertEquals( "fired1",
+                      ((List) session2.getGlobal( "list" )).get( 0 ) );
+        assertEquals( "fired2",
+                      ((List) session2.getGlobal( "list" )).get( 1 ) );
+    }
+
+    public void testSinglePattern() throws Exception {
+        String rule = "package org.test;\n";
+        rule += "import org.drools.Person\n";
+        rule += "global java.util.List list\n";
+        rule += "rule \"Rule 1\"\n";
+        rule += "when\n";
+        rule += "    $p : Person( ) \n";
+        rule += "then\n";
+        rule += "    list.add( $p );\n";
+        rule += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 2,
+                      nodes.size() );
+        assertEquals( "Person",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        Person p = new Person( "bobba fet",
+                               32 );
+        session.insert( p );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( p,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+    }
+
+    public void testSingleRuleSingleJoinNodePattern() throws Exception {
+        String rule = "package org.test;\n";
+        rule += "import org.drools.Person\n";
+        rule += "import org.drools.Cheese\n";
+        rule += "global java.util.List list\n";
+        rule += "rule \"Rule 1\"\n";
+        rule += "when\n";
+        rule += "    $c : Cheese( ) \n";
+        rule += "    $p : Person( cheese == $c ) \n";
+        rule += "then\n";
+        rule += "    list.add( $p );\n";
+        rule += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        // Make sure the rete node map is created correctly
+        Map<Integer, BaseNode> nodes = RuleBaseNodes.getNodeMap( (InternalRuleBase) ruleBase );
+        assertEquals( 4,
+                      nodes.size() );
+        assertEquals( "Cheese",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "Person",
+                      ((ClassObjectType) ((ObjectTypeNode) nodes.get( 6 )).getObjectType()).getClassType().getSimpleName() );
+        assertEquals( "JoinNode",
+                      nodes.get( 7 ).getClass().getSimpleName() );
+        assertEquals( "Rule 1",
+                      ((RuleTerminalNode) nodes.get( 8 )).getRule().getName() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        Cheese stilton = new Cheese( "stilton",
+                                     25 );
+        Cheese brie = new Cheese( "brie",
+                                  49 );
+        Person bobba = new Person( "bobba fet",
+                                   32 );
+        bobba.setCheese( stilton );
+
+        Person vadar = new Person( "darth vadar",
+                                   32 );
+
+        session.insert( stilton );
+        session.insert( bobba );
+        session.insert( vadar );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 1,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+
+        Person c3po = new Person( "c3p0",
+                                  32 );
+        c3po.setCheese( stilton );
+        session.insert( c3po );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 2,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( c3po,
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
+
+        Person r2d2 = new Person( "r2d2",
+                                  32 );
+        r2d2.setCheese( brie );
+        session.insert( r2d2 );
+
+        System.out.println( "\n\njointpattern" );
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 3,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 2 ) );
+    }
+
+    public void testMultiRuleMultiJoinNodePatternsWithHalt() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Person\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "    $p : Person( cheese == $c ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( $p );\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Person\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "import org.drools.Cell\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "    $p : Person( cheese == $c ) \n";
+        rule2 += "    Cell( value == $p.age ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( $p );\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.FactA\n";
+        rule3 += "import org.drools.FactB\n";
+        rule3 += "import org.drools.FactC\n";
+        rule3 += "import org.drools.Person\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "when\n";
+        rule3 += "    $a : FactA( field2 > 10 ) \n";
+        rule3 += "    $b : FactB( f2 >= $a.field2 ) \n";
+        rule3 += "    $p : Person( name == \"darth vadar\" ) \n";
+        rule3 += "    $c : FactC( f2 >= $b.f2 ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( $c );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        Cheese stilton = new Cheese( "stilton",
+                                     25 );
+        Cheese brie = new Cheese( "brie",
+                                  49 );
+        Person bobba = new Person( "bobba fet",
+                                   30 );
+        bobba.setCheese( stilton );
+        Person vadar = new Person( "darth vadar",
+                                   38 );
+        Person c3po = new Person( "c3p0",
+                                  17 );
+        c3po.setCheese( stilton );
+        Person r2d2 = new Person( "r2d2",
+                                  58 );
+        r2d2.setCheese( brie );
+
+        session.insert( stilton );
+        session.insert( bobba );
+        session.insert( vadar );
+        session.insert( brie );
+        session.insert( c3po );
+        session.insert( r2d2 );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 3,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 2 ) );
+        assertEquals( c3po,
+                      ((List) session.getGlobal( "list" )).get( 1 ) );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.insert( new Cell( 30 ) );
+        session.insert( new Cell( 58 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 5,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( r2d2,
+                      ((List) session.getGlobal( "list" )).get( 3 ) );
+        assertEquals( bobba,
+                      ((List) session.getGlobal( "list" )).get( 4 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.insert( new FactA( 15 ) );
+        session.insert( new FactB( 20 ) );
+        session.insert( new FactC( 27 ) );
+        session.insert( new FactC( 52 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 6,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( new FactC( 52 ),
+                      ((List) session.getGlobal( "list" )).get( 5 ) );
+
+        session = getSerialisedStatefulSession( session );
+
+        session.fireAllRules();
+
+        assertEquals( 7,
+                      ((List) session.getGlobal( "list" )).size() );
+        assertEquals( new FactC( 27 ),
+                      ((List) session.getGlobal( "list" )).get( 6 ) );
+    }
+
+    public void testNot() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not rule test\"\n";
+        rule1 += "salience 10\n";
+        rule1 += "when\n";
+        rule1 += "    Person()\n";
+        rule1 += "    not Cheese( price >= 5 )\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( new Integer( 5 ) );\n";
+        rule1 += "end\n";     
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        // add a person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person bobba = new Person( "bobba fet",
+                                   50 );
+        session.insert( bobba );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 1,
+                      list.size() );
+
+        // add another person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person darth = new Person( "darth vadar",
+                                   200 );
+        session.insert( darth );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // add cheese 
+        session = getSerialisedStatefulSession( session );
+        Cheese stilton = new Cheese( "stilton",
+                                     5 );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // remove cheese
+        session = getSerialisedStatefulSession( session );
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // put 2 cheeses back in
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        Cheese brie = new Cheese( "brie",
+                                  18 );
+        session.insert( brie );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // now remove a cheese, should be no change
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+        
+        // now remove a person, should be no change
+        session.retract( session.getFactHandle( bobba ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );     
+        
+        //removal remaining cheese, should increase by one, as one person left
+        session.retract( session.getFactHandle( brie ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 5,
+                      list.size() );        
+    }
+    
+    public void testExists() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not rule test\"\n";
+        rule1 += "salience 10\n";
+        rule1 += "when\n";
+        rule1 += "    Person()\n";
+        rule1 += "    exists Cheese( price >= 5 )\n";
+        rule1 += "then\n";
+        rule1 += "    list.add( new Integer( 5 ) );\n";
+        rule1 += "end\n";     
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        // add a person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person bobba = new Person( "bobba fet",
+                                   50 );
+        session.insert( bobba );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        // add another person, no cheese
+        session = getSerialisedStatefulSession( session );
+        Person darth = new Person( "darth vadar",
+                                   200 );
+        session.insert( darth );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        // add cheese 
+        session = getSerialisedStatefulSession( session );
+        Cheese stilton = new Cheese( "stilton",
+                                     5 );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // remove cheese
+        session = getSerialisedStatefulSession( session );
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        // put 2 cheeses back in
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session = getSerialisedStatefulSession( session );
+        Cheese brie = new Cheese( "brie",
+                                  18 );
+        session.insert( brie );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+
+        // now remove a cheese, should be no change
+        session.retract( session.getFactHandle( stilton ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+        
+        // now remove a person, should be no change
+        session.retract( session.getFactHandle( bobba ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );     
+        
+        //removal remaining cheese, no
+        session.retract( session.getFactHandle( brie ) );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 4,
+                      list.size() );    
+        
+        // put one cheese back in, with one person should increase by one
+        session = getSerialisedStatefulSession( session );
+        session.insert( stilton );
+        session.fireAllRules();
+        assertEquals( 5,
+                      list.size() );        
+    }    
+
+    public void testTruthMaintenance() throws Exception {
+        String header = "package org.drools.test;\n";
+        header += "import java.util.List;\n";
+        header += "import org.drools.Person\n";
+        header += "import org.drools.Cheese\n";
+        header += "global Cheese cheese;\n";
+        header += "global Person person;\n";
+        header += "global java.util.List list;\n";
+
+        String rule1 = "rule \"not person then cheese\"\n";
+        rule1 += "when \n";
+        rule1 += "    not Person() \n";
+        rule1 += "then \n";
+        rule1 += "    if (list.size() < 3) { \n";
+        rule1 += "        list.add(new Integer(0)); \n";
+        rule1 += "        insertLogical( cheese ); \n" + "    }\n";
+        rule1 += "    drools.halt();\n" + "end\n";
+
+        String rule2 = "rule \"if cheese then person\"\n";
+        rule2 += "when\n";
+        rule2 += "    Cheese()\n";
+        rule2 += "then\n";
+        rule2 += "    if (list.size() < 3) {\n";
+        rule2 += "        list.add(new Integer(0));\n";
+        rule2 += "        insertLogical( person );\n";
+        rule2 += "    }\n" + "    drools.halt();\n";
+        rule2 += "end\n";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( header + rule1 ) );
+        builder.addPackageFromDrl( new StringReader( header + rule2 ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+
+        final Person person = new Person( "person" );
+        final Cheese cheese = new Cheese( "cheese",
+                                          0 );
+        session.setGlobal( "cheese",
+                           cheese );
+        session.setGlobal( "person",
+                           person );
+        session.setGlobal( "list",
+                           list );
+        session.fireAllRules();
+        assertEquals( 1,
+                      list.size() );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 2,
+                      list.size() );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 3,
+                      list.size() );
+
+        // should not grow any further
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( 3,
+                      list.size() );
+    }
+
+    public void testActivationGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    activation-group \"activation-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    activation-group \"activation-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    activation-group \"activation-group-1\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+        assertEquals( "rule4",
+                      list.get( 1 ) );
+    }
+
+    public void testAgendaGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    agenda-group \"agenda-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    agenda-group \"agenda-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    salience 10\n";
+        rule3 += "    agenda-group \"agenda-group-2\"\n";
+        rule3 += "    activation-group \"activation-group-2\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    agenda-group \"agenda-group-2\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.setFocus( "agenda-group-1" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.setFocus( "agenda-group-2" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule3",
+                      list.get( 1 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule1",
+                      list.get( 2 ) );
+    }
+
+    public void testRuleFlowGroups() throws Exception {
+        String rule1 = "package org.test;\n";
+        rule1 += "import org.drools.Cheese\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule \"Rule 1\"\n";
+        rule1 += "    ruleflow-group \"ruleflow-group-1\"\n";
+        rule1 += "when\n";
+        rule1 += "    $c : Cheese( ) \n";
+        rule1 += "then\n";
+        rule1 += "    list.add( \"rule1\" );\n";
+        rule1 += "    drools.halt();\n";
+        rule1 += "end";
+
+        String rule2 = "package org.test;\n";
+        rule2 += "import org.drools.Cheese\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule \"Rule 2\"\n";
+        rule2 += "    salience 10\n";
+        rule2 += "    ruleflow-group \"ruleflow-group-1\"\n";
+        rule2 += "when\n";
+        rule2 += "    $c : Cheese( ) \n";
+        rule2 += "then\n";
+        rule2 += "    list.add( \"rule2\" );\n";
+        rule2 += "    drools.halt();\n";
+        rule2 += "end";
+
+        String rule3 = "package org.test;\n";
+        rule3 += "import org.drools.Cheese\n";
+        rule3 += "global java.util.List list\n";
+        rule3 += "rule \"Rule 3\"\n";
+        rule3 += "    salience 10\n";
+        rule3 += "    ruleflow-group \"ruleflow-group-2\"\n";
+        rule3 += "    activation-group \"activation-group-2\"\n";
+        rule3 += "when\n";
+        rule3 += "    $c : Cheese( ) \n";
+        rule3 += "then\n";
+        rule3 += "    list.add( \"rule3\" );\n";
+        rule3 += "    drools.halt();\n";
+        rule3 += "end";
+
+        String rule4 = "package org.test;\n";
+        rule4 += "import org.drools.Cheese\n";
+        rule4 += "global java.util.List list\n";
+        rule4 += "rule \"Rule 4\"\n";
+        rule4 += "    ruleflow-group \"ruleflow-group-2\"\n";
+        rule4 += "    activation-group \"activation-group-2\"\n";
+        rule4 += "when\n";
+        rule4 += "    $c : Cheese( ) \n";
+        rule4 += "then\n";
+        rule4 += "    list.add( \"rule4\" );\n";
+        rule4 += "    drools.halt();\n";
+        rule4 += "end";
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( rule1 ) );
+        builder.addPackageFromDrl( new StringReader( rule2 ) );
+        builder.addPackageFromDrl( new StringReader( rule3 ) );
+        builder.addPackageFromDrl( new StringReader( rule4 ) );
+
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        session = getSerialisedStatefulSession( session );
+
+        final List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        session.insert( brie );
+
+        session = getSerialisedStatefulSession( session );
+        session.getAgenda().activateRuleFlowGroup( "ruleflow-group-1" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule2",
+                      list.get( 0 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.getAgenda().activateRuleFlowGroup( "ruleflow-group-2" );
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule3",
+                      list.get( 1 ) );
+
+        session = getSerialisedStatefulSession( session );
+        session.fireAllRules();
+        assertEquals( "rule1",
+                      list.get( 2 ) );
+    }
+    
+    
     protected RuleBase getRuleBase() throws Exception {
 
         return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2008-05-18 03:11:26 UTC (rev 19998)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java	2008-05-18 03:33:07 UTC (rev 19999)
@@ -2,6 +2,7 @@
 
 import org.drools.RuleBase;
 import org.drools.StatefulSession;
+import org.drools.marshalling.DefaultMarshaller;
 import org.drools.marshalling.Marshaller;
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.util.DroolsStreamUtils;
@@ -49,7 +50,7 @@
     public static StatefulSession getSerialisedStatefulSession(StatefulSession session,
                                                                RuleBase ruleBase,
                                                                boolean dispose) throws Exception {
-        Marshaller marshaller = new Marshaller();
+        Marshaller marshaller = new DefaultMarshaller();
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ruleBase.writeStatefulSession( session,
@@ -63,7 +64,7 @@
                                                                 marshaller );
 
         // write methods allways needs a new marshaller for Identity strategies
-        marshaller = new Marshaller();        
+        marshaller = new DefaultMarshaller();        
         baos = new ByteArrayOutputStream();
         ruleBase.writeStatefulSession( session2,
                                        baos,




More information about the jboss-svn-commits mailing list