[jboss-svn-commits] JBL Code SVN: r15301 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Sep 23 07:57:03 EDT 2007
Author: tirelli
Date: 2007-09-23 07:57:01 -0400 (Sun, 23 Sep 2007)
New Revision: 15301
Added:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/PersonFinal.java
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass.drl
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass2.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EmptyObjectSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
Log:
JBRULES-1203: fixing shadow fact problems for final classes like JDK proxy usage
Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/PersonFinal.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/PersonFinal.java (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/PersonFinal.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -0,0 +1,5 @@
+package org.drools;
+
+public final class PersonFinal extends Person {
+
+}
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-09-23 11:05:52 UTC (rev 15300)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -52,6 +52,7 @@
import org.drools.Order;
import org.drools.OrderItem;
import org.drools.Person;
+import org.drools.PersonFinal;
import org.drools.PersonInterface;
import org.drools.PersonWithEquals;
import org.drools.Primitives;
@@ -4166,4 +4167,40 @@
}
}
+
+ public void testFinalClass() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FinalClass.drl" ) ) );
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( builder.getPackage() );
+
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List list = new ArrayList();
+ workingMemory.setGlobal( "results",
+ list );
+
+ final PersonFinal bob = new PersonFinal();
+ bob.setName( "bob" );
+ bob.setStatus( null );
+
+ workingMemory.insert( bob );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( 1,
+ list.size() );
+
+ // Dynamic addition of rules which use the final class are not supported yet
+// final PackageBuilder builder2 = new PackageBuilder();
+// builder2.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FinalClass2.drl" ) ) );
+// ruleBase.addPackage( builder2.getPackage() );
+//
+// // it will automatically fire the rule
+// assertEquals( 2,
+// list.size() );
+ }
+
+
}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass.drl 2007-09-23 11:57:01 UTC (rev 15301)
@@ -0,0 +1,24 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test final class 1"
+ dialect "mvel"
+ salience 10
+ when
+ $p : Person( name == "bob", status == null )
+ then
+ $p.status = "OK";
+ results.add("OK");
+ update( $p );
+end
+
+rule "test final class 2"
+ dialect "mvel"
+ when
+ $p : Person( name == "bob", status == null )
+ then
+ # this rule should not fire
+ $p.status = "NOT OK";
+ results.add("NOT OK");
+end
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass2.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass2.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FinalClass2.drl 2007-09-23 11:57:01 UTC (rev 15301)
@@ -0,0 +1,13 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test final class 3"
+ dialect "mvel"
+ salience 10
+ when
+ $p : PersonFinal( name == "bob" )
+ then
+ results.add("Final OK");
+end
+
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EmptyObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EmptyObjectSinkAdapter.java 2007-09-23 11:05:52 UTC (rev 15300)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EmptyObjectSinkAdapter.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -7,7 +7,12 @@
public class EmptyObjectSinkAdapter
implements
ObjectSinkPropagator {
+
+ private static final long serialVersionUID = -631743913176779720L;
+
private static final EmptyObjectSinkAdapter instance = new EmptyObjectSinkAdapter();
+
+ private static final ObjectSink[] SINK_LIST = new ObjectSink[0];
public static EmptyObjectSinkAdapter getInstance() {
return instance;
@@ -29,7 +34,11 @@
}
public ObjectSink[] getSinks() {
- return new ObjectSink[]{};
+ return SINK_LIST;
}
+
+ public int size() {
+ return 0;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java 2007-09-23 11:05:52 UTC (rev 15300)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -19,4 +19,6 @@
boolean useHash);
public ObjectSink[] getSinks();
+
+ public int size();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2007-09-23 11:05:52 UTC (rev 15300)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -38,7 +38,6 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.common.NodeMemory;
import org.drools.facttemplates.Fact;
-import org.drools.facttemplates.FactImpl;
import org.drools.facttemplates.FactTemplate;
import org.drools.facttemplates.FactTemplateObjectType;
import org.drools.objenesis.Objenesis;
@@ -345,6 +344,8 @@
public void resetCache();
public boolean isAssignableFrom(Object object);
+
+ public boolean isActive();
}
public static class FactTemplateTypeConf
@@ -409,6 +410,10 @@
this.cache = null;
}
+ public boolean isActive() {
+ return true;
+ }
+
}
public static class ClassObjectTypeConf
@@ -561,7 +566,7 @@
boolean isOk = ret != null && ret != Object.class; // we don't want to shadow java.lang.Object
if ( isOk ) {
for ( int i = 0; isOk && ret != null && i < nodes.length; i++ ) {
- isOk = nodes[i].isAssignableFrom( ret );
+ isOk = nodes[i].getSinkPropagator().size() == 0 || nodes[i].isAssignableFrom( ret );
}
}
@@ -574,7 +579,7 @@
ret = interfaces[i];
isOk = interfaces[i] != Serializable.class && interfaces[i] != Cloneable.class && interfaces[i] != Comparable.class;
for ( int j = 0; isOk && j < nodes.length; j++ ) {
- isOk = nodes[j].isAssignableFrom( ret );
+ isOk = nodes[j].getSinkPropagator().size() == 0 || nodes[j].isAssignableFrom( ret );
}
notFound = !isOk;
}
@@ -656,6 +661,10 @@
return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
}
+
+ public boolean isActive() {
+ return getConcreteObjectTypeNode().getSinkPropagator().getSinks().length > 0;
+ }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java 2007-09-23 11:05:52 UTC (rev 15300)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java 2007-09-23 11:57:01 UTC (rev 15301)
@@ -8,6 +8,8 @@
implements
ObjectSinkPropagator {
+ private static final long serialVersionUID = 873985743021L;
+
private ObjectSink sink;
public SingleObjectSinkAdapter(final ObjectSink sink) {
@@ -36,5 +38,9 @@
public ObjectSink[] getSinks() {
return new ObjectSink[]{this.sink};
}
+
+ public int size() {
+ return 1;
+ }
}
More information about the jboss-svn-commits
mailing list