[jboss-svn-commits] JBL Code SVN: r11804 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed May 9 21:01:51 EDT 2007
Author: tirelli
Date: 2007-05-09 21:01:51 -0400 (Wed, 09 May 2007)
New Revision: 11804
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RetractModifyWithFunction.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixer.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixerTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/IdentityAssertMapComparator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
Log:
JBRULES-811:
* Adding methods to KnowledgeHelper to allow modify/retract of facts without passing the handler as a parameter.
* Fixing bug in IdentityAssertMapComparator.hashcodeOf() calculation
* Fixing bug in AbstractWorkingMemory logical override
* Fixing KnowledgeHelperFix pattern replacement
* Adding test case and fixing unit tests
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -84,7 +84,7 @@
final String text = TemplateInterpreter.evalToString( template,
vars );
- System.out.println( text );
+ //System.out.println( text );
final BufferedReader reader = new BufferedReader( new StringReader( text ) );
String line = null;
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixer.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixer.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -22,13 +22,13 @@
public class KnowledgeHelperFixer {
static String KNOWLEDGE_HELPER_PFX = ""; //could also be: "drools\\." for "classic" mode.
- static Pattern MODIFY = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "modify\\s*\\(([^)]+)\\)(.*)",
+ static Pattern MODIFY = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "modify\\s*\\(([^)]+)\\)(\\s*;.*)",
Pattern.DOTALL );
- static Pattern ASSERT = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "assert\\s*\\((.*)\\)(.*)",
+ static Pattern ASSERT = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "assert\\s*\\((.*)\\)(\\s*;.*)",
Pattern.DOTALL );
- static Pattern ASSERT_LOGICAL = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "assertLogical\\s*\\((.*)\\)(.*)",
+ static Pattern ASSERT_LOGICAL = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "assertLogical\\s*\\((.*)\\)(\\s*;.*)",
Pattern.DOTALL );
- static Pattern RETRACT = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "retract\\s*\\(([^)]+)\\)(.*)",
+ static Pattern RETRACT = Pattern.compile( "(.*)\\b" + KnowledgeHelperFixer.KNOWLEDGE_HELPER_PFX + "retract\\s*\\((.+)\\)(\\s*;.*)",
Pattern.DOTALL );
/**
@@ -147,7 +147,7 @@
}
public String getReplacement(final String guts) {
- return "drools.modifyObject(" + guts.trim() + "__Handle__, " + guts + ")";
+ return "drools.modifyObject( " + guts + " )";
}
}
@@ -163,7 +163,7 @@
}
public String getReplacement(final String guts) {
- return "drools.retractObject(" + guts.trim() + "__Handle__)";
+ return "drools.retractObject( " + guts.trim() + " )";
}
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -63,6 +63,7 @@
import org.drools.TestParam;
import org.drools.WorkingMemory;
import org.drools.Cheesery.Maturity;
+import org.drools.common.AbstractWorkingMemory;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsError;
import org.drools.compiler.DroolsParserException;
@@ -1505,9 +1506,9 @@
assertEquals( 2,
IteratorToList.convert( workingMemory.iterateObjects() ).size() );
assertEquals( bob,
+ IteratorToList.convert( workingMemory.iterateObjects() ).get( 1 ) );
+ assertEquals( new Person( "help" ),
IteratorToList.convert( workingMemory.iterateObjects() ).get( 0 ) );
- assertEquals( new Person( "help" ),
- IteratorToList.convert( workingMemory.iterateObjects() ).get( 1 ) );
}
public void testEmptyRule() throws Exception {
@@ -2526,8 +2527,8 @@
workingMemory.setGlobal( "list",
list );
- final Primitives p = new Primitives( );
- p.setStringArray( new String[] { "test1", "test3" } );
+ final Primitives p = new Primitives();
+ p.setStringArray( new String[]{"test1", "test3"} );
workingMemory.assertObject( p );
workingMemory.fireAllRules();
@@ -2540,7 +2541,7 @@
assertEquals( "ok2",
list.get( 1 ) );
}
-
+
public void testCollectNodeSharing() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_collectNodeSharing.drl" ) ) );
@@ -2554,8 +2555,10 @@
workingMemory.setGlobal( "results",
list );
- workingMemory.assertObject( new Cheese( "stilton", 10 ) );
- workingMemory.assertObject( new Cheese( "brie", 15 ) );
+ workingMemory.assertObject( new Cheese( "stilton",
+ 10 ) );
+ workingMemory.assertObject( new Cheese( "brie",
+ 15 ) );
workingMemory.fireAllRules();
@@ -2565,7 +2568,7 @@
assertEquals( 2,
((List) list.get( 0 )).size() );
}
-
+
public void testNodeSharingNotExists() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_nodeSharingNotExists.drl" ) ) );
@@ -2579,7 +2582,6 @@
workingMemory.setGlobal( "results",
list );
-
workingMemory.fireAllRules();
assertEquals( 1,
@@ -2587,16 +2589,17 @@
assertEquals( "rule1",
list.get( 0 ) );
-
- workingMemory.assertObject( new Cheese( "stilton", 10 ) );
+
+ workingMemory.assertObject( new Cheese( "stilton",
+ 10 ) );
workingMemory.fireAllRules();
-
+
assertEquals( 2,
list.size() );
assertEquals( "rule2",
list.get( 1 ) );
-
+
}
public void testNullBinding() throws Exception {
@@ -2612,7 +2615,7 @@
workingMemory.setGlobal( "results",
list );
- workingMemory.assertObject( new Person("bob") );
+ workingMemory.assertObject( new Person( "bob" ) );
workingMemory.assertObject( new Person( null ) );
workingMemory.fireAllRules();
@@ -2622,6 +2625,38 @@
assertEquals( "OK",
list.get( 0 ) );
-
+
}
+
+ public void testModifyRetractWithFunction() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_RetractModifyWithFunction.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final AbstractWorkingMemory workingMemory = (AbstractWorkingMemory) ruleBase.newStatefulSession();
+
+ final Cheese stilton = new Cheese( "stilton",
+ 7 );
+ final Cheese muzzarella = new Cheese( "muzzarella",
+ 9 );
+ final int sum = stilton.getPrice() + muzzarella.getPrice();
+ final FactHandle stiltonHandle = workingMemory.assertObject( stilton );
+ final FactHandle muzzarellaHandle = workingMemory.assertObject( muzzarella );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( sum,
+ stilton.getPrice() );
+ assertEquals( 1,
+ workingMemory.getFactHandleMap().size() );
+ assertNotNull( workingMemory.getObject( stiltonHandle ) );
+ assertNotNull( workingMemory.getFactHandle( stilton ) );
+
+ assertNull( workingMemory.getObject( muzzarellaHandle ) );
+ assertNull( workingMemory.getFactHandle( muzzarella ) );
+
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixerTest.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/KnowledgeHelperFixerTest.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -25,32 +25,32 @@
private static final KnowledgeHelperFixer fixer = new KnowledgeHelperFixer();
public void testAdd__Handle__Simple() {
- String result = KnowledgeHelperFixerTest.fixer.fix( "modify(myObject )" );
- assertEquals( "drools.modifyObject(myObject__Handle__, myObject)",
+ String result = KnowledgeHelperFixerTest.fixer.fix( "modify(myObject );" );
+ assertEquals( "drools.modifyObject( myObject );",
result );
- result = KnowledgeHelperFixerTest.fixer.fix( "modify ( myObject )" );
- assertEquals( "drools.modifyObject(myObject__Handle__, myObject)",
+ result = KnowledgeHelperFixerTest.fixer.fix( "modify ( myObject );" );
+ assertEquals( "drools.modifyObject( myObject );",
result );
}
public void testAdd__Handle__withNewLines() {
- final String result = KnowledgeHelperFixerTest.fixer.fix( "\n\t\n\tmodify(myObject )" );
- assertEquals( "\n\t\n\tdrools.modifyObject(myObject__Handle__, myObject)",
+ final String result = KnowledgeHelperFixerTest.fixer.fix( "\n\t\n\tmodify(myObject );" );
+ assertEquals( "\n\t\n\tdrools.modifyObject( myObject );",
result );
}
public void testAdd__Handle__rComplex() {
String result = KnowledgeHelperFixerTest.fixer.fix( "something modify(myObject ); other" );
- assertEquals( "something drools.modifyObject(myObject__Handle__, myObject); other",
+ assertEquals( "something drools.modifyObject( myObject ); other",
result );
- result = KnowledgeHelperFixerTest.fixer.fix( "something modify (myObject )" );
- assertEquals( "something drools.modifyObject(myObject__Handle__, myObject)",
+ result = KnowledgeHelperFixerTest.fixer.fix( "something modify (myObject );" );
+ assertEquals( "something drools.modifyObject( myObject );",
result );
- result = KnowledgeHelperFixerTest.fixer.fix( " modify(myObject ) x" );
- assertEquals( " drools.modifyObject(myObject__Handle__, myObject) x",
+ result = KnowledgeHelperFixerTest.fixer.fix( " modify(myObject ); x" );
+ assertEquals( " drools.modifyObject( myObject ); x",
result );
//should not touch, as it is not a stand alone word
@@ -60,12 +60,12 @@
}
public void testMultipleMatches() {
- String result = KnowledgeHelperFixerTest.fixer.fix( "modify(myObject) modify(myObject )" );
- assertEquals( "drools.modifyObject(myObject__Handle__, myObject) drools.modifyObject(myObject__Handle__, myObject)",
+ String result = KnowledgeHelperFixerTest.fixer.fix( "modify(myObject); modify(myObject );" );
+ assertEquals( "drools.modifyObject( myObject ); drools.modifyObject( myObject );",
result );
- result = KnowledgeHelperFixerTest.fixer.fix( "xxx modify(myObject ) modify(myObject ) modify(yourObject ) yyy" );
- assertEquals( "xxx drools.modifyObject(myObject__Handle__, myObject) drools.modifyObject(myObject__Handle__, myObject) drools.modifyObject(yourObject__Handle__, yourObject) yyy",
+ result = KnowledgeHelperFixerTest.fixer.fix( "xxx modify(myObject ); modify(myObject ); modify(yourObject ); yyy" );
+ assertEquals( "xxx drools.modifyObject( myObject ); drools.modifyObject( myObject ); drools.modifyObject( yourObject ); yyy",
result );
}
@@ -85,12 +85,12 @@
}
public void testAllActionsMushedTogether() {
- String result = KnowledgeHelperFixerTest.fixer.fix( "assert(myObject ) modify(ourObject);\t retract(herObject)" );
- assertEquals( "drools.assertObject(myObject ) drools.modifyObject(ourObject__Handle__, ourObject);\t drools.retractObject(herObject__Handle__)",
+ String result = KnowledgeHelperFixerTest.fixer.fix( "assert(myObject ); modify(ourObject);\t retract(herObject);" );
+ assertEquals( "drools.assertObject(myObject ); drools.modifyObject( ourObject );\t drools.retractObject( herObject );",
result );
- result = KnowledgeHelperFixerTest.fixer.fix( "assert(myObject ) modify(ourObject);\t retract(herObject)\nassert(myObject) modify(ourObject);\t retract(herObject)" );
- assertEquals( "drools.assertObject(myObject ) drools.modifyObject(ourObject__Handle__, ourObject);\t drools.retractObject(herObject__Handle__)\ndrools.assertObject(myObject) drools.modifyObject(ourObject__Handle__, ourObject);\t drools.retractObject(herObject__Handle__)",
+ result = KnowledgeHelperFixerTest.fixer.fix( "assert(myObject ); modify(ourObject);\t retract(herObject);\nassert(myObject); modify(ourObject);\t retract(herObject);" );
+ assertEquals( "drools.assertObject(myObject ); drools.modifyObject( ourObject );\t drools.retractObject( herObject);\ndrools.assertObject(myObject); drools.modifyObject( ourObject );\t drools.retractObject( herObject );",
result );
}
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RetractModifyWithFunction.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RetractModifyWithFunction.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RetractModifyWithFunction.drl 2007-05-10 01:01:51 UTC (rev 11804)
@@ -0,0 +1,29 @@
+package org.drools;
+
+function Cheese getMin(Cheese c1, Cheese c2) {
+ if (c1.getPrice() < c2.getPrice()) return c1;
+ else return c2;
+}
+
+rule "test modify"
+ salience 10
+ no-loop
+when
+ $c1 : Cheese( type == "stilton" )
+ $c2 : Cheese( type == "muzzarella" )
+then
+ Cheese x = getMin( $c1, $c2 );
+ x.setPrice( $c1.getPrice() + $c2.getPrice() );
+ modify( x );
+ // testing stuff after the ) ;
+end
+
+rule "test retract"
+when
+ $c1 : Cheese( type == "stilton" )
+ $c2 : Cheese( type == "muzzarella" )
+then
+ // stuff before the retract( getMin( $c1, $c2 ) );
+ retract( getMin( $c1, $c2 ) );
+ // stuff before the retract( getMin( $c1, $c2 ) );
+end
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -99,6 +99,18 @@
this.activation );
}
+ public void modifyObject( final Object object ) throws FactException {
+ FactHandle handle = this.workingMemory.getFactHandle( object );
+ if( handle == null ) {
+ throw new FactException("Modify error: handle not found for object: "+object+". Is it in the working memory?");
+ }
+ // only modify if this fact exists in the wm
+ this.workingMemory.modifyObject( handle,
+ object,
+ this.rule,
+ this.activation );
+ }
+
public void retractObject(final FactHandle handle) throws FactException {
this.workingMemory.retractObject( handle,
true,
@@ -107,6 +119,18 @@
this.activation );
}
+ public void retractObject(final Object object) throws FactException {
+ FactHandle handle = this.workingMemory.getFactHandle( object );
+ if( handle == null ) {
+ throw new FactException("Retract error: handle not found for object: "+object+". Is it in the working memory?");
+ }
+ this.workingMemory.retractObject( handle,
+ true,
+ true,
+ this.rule,
+ this.activation );
+ }
+
public Rule getRule() {
return this.rule;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -63,7 +63,6 @@
import org.drools.util.ObjectHashMap;
import org.drools.util.PrimitiveLongMap;
import org.drools.util.AbstractHashTable.HashTableIterator;
-import org.drools.util.ObjectHashMap.ObjectEntry;
import org.drools.util.concurrent.locks.Lock;
import org.drools.util.concurrent.locks.ReentrantLock;
@@ -662,7 +661,19 @@
// existing handle
key.setStatus( EqualityKey.STATED );
handle = key.getFactHandle();
- handle.setObject( object );
+
+ if ( this.ruleBase.getConfiguration().getAssertBehaviour() == AssertBehaviour.IDENTITY ) {
+ // as assertMap may be using an "identity" equality comparator,
+ // we need to remove the handle from the map, before replacing the object
+ // and then re-add the handle. Otherwise we may end up with a leak.
+ this.assertMap.remove( handle );
+ handle.setObject( object );
+ this.assertMap.put( handle,
+ handle,
+ false );
+ } else {
+ handle.setObject( object );
+ }
return handle;
} else {
// override, then instantiate new handle for assertion
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/IdentityAssertMapComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/IdentityAssertMapComparator.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/IdentityAssertMapComparator.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -32,10 +32,14 @@
}
public int hashCodeOf(final Object obj) {
- if ( obj instanceof FactHandle ) {
- return rehash( ((InternalFactHandle) obj).getObjectHashCode() );
+ Object realObject = obj;
+ if ( realObject instanceof FactHandle ) {
+ realObject = ((InternalFactHandle) obj).getObject();
}
- return rehash( obj.hashCode() );
+ if ( realObject instanceof ShadowProxy ) {
+ realObject = ((ShadowProxy)realObject).getShadowedObject();
+ }
+ return rehash( System.identityHashCode( realObject ) );
}
public int rehash(int h) {
@@ -55,10 +59,13 @@
if ( o1 instanceof FactHandle ) {
return ((InternalFactHandle) o1).getObject() == ((InternalFactHandle) o2).getObject();
}
-
+ Object left = o1;
+ if ( left instanceof ShadowProxy ) {
+ left = ((ShadowProxy)left).getShadowedObject();
+ }
final InternalFactHandle handle = ((InternalFactHandle) o2);
- return o1 == ((handle.isShadowFact()) ? ((ShadowProxy) handle.getObject()).getShadowedObject() : handle.getObject());
+ return left == ((handle.isShadowFact()) ? ((ShadowProxy) handle.getObject()).getShadowedObject() : handle.getObject());
}
public int compare(final Object o1,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java 2007-05-10 00:56:52 UTC (rev 11803)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java 2007-05-10 01:01:51 UTC (rev 11804)
@@ -76,8 +76,12 @@
void modifyObject(FactHandle handle,
Object newObject) throws FactException;
+ void modifyObject( Object newObject ) throws FactException;
+
void retractObject(FactHandle handle) throws FactException;
+ void retractObject(Object object) throws FactException;
+
public Object get(Declaration declaration);
/**
More information about the jboss-svn-commits
mailing list