[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