[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