[jboss-svn-commits] JBL Code SVN: r6602 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base main/java/org/drools/facttemplates main/java/org/drools/spi main/java/org/drools/util test/java/org/drools/reteoo test/java/org/drools/spi

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Oct 4 14:43:05 EDT 2006


Author: tirelli
Date: 2006-10-04 14:42:52 -0400 (Wed, 04 Oct 2006)
New Revision: 6602

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ShadowProxyFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java
Log:
JBRULES-44: Adding tests and integrating shadow facts into core



Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.InvocationTargetException;
+
+import org.drools.RuntimeDroolsException;
 import org.drools.spi.ObjectType;
 
 /**
@@ -42,19 +45,42 @@
 
     protected ValueType       valueType;
 
+    protected boolean         shadowEnabled;
+
+    protected Class           shadowClass;
+
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
 
     /**
-     * Construct.
+     * Creates a new class object type with shadow disabled.
      * 
      * @param objectTypeClass
      *            Java object class.
      */
     public ClassObjectType(final Class objectTypeClass) {
+        this( objectTypeClass,
+              null );
+    }
+
+    /**
+     * Creates a new class object type with the given class
+     * as its shadow class.
+     * 
+     * @param objectTypeClass
+     *            Java object class.
+     * @param shadowClass
+     *            The shadow class for the given objectTypeClass
+     */
+    public ClassObjectType(final Class objectTypeClass,
+                           final Class shadowClass) {
         this.objectTypeClass = objectTypeClass;
         this.valueType = ValueType.determineValueType( objectTypeClass );
+        if ( shadowClass != null ) {
+            this.shadowClass = shadowClass;
+            this.shadowEnabled = true;
+        }
     }
 
     // ------------------------------------------------------------
@@ -92,6 +118,22 @@
         return this.valueType;
     }
 
+    public Object getShadow(Object fact) throws RuntimeDroolsException {
+        ShadowProxy proxy = null;
+        if ( isShadowEnabled() ) {
+            try {
+                proxy = (ShadowProxy) shadowClass.getConstructor( new Class[]{this.objectTypeClass} ).newInstance( new Object[]{fact} );
+            } catch ( Exception e ) {
+                throw new RuntimeDroolsException("Error creating shadow fact for object: "+fact, e);
+            }
+        }
+        return proxy;
+    }
+
+    public boolean isShadowEnabled() {
+        return this.shadowEnabled;
+    }
+
     public String toString() {
         return "[ClassObjectType class=" + getClassType().getName() + "]";
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ShadowProxyFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ShadowProxyFactory.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ShadowProxyFactory.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -43,7 +43,8 @@
 
     public static Class getProxy(final Class clazz) {
         try {
-            final ClassFieldInspector inspector = new ClassFieldInspector( clazz, false );
+            final ClassFieldInspector inspector = new ClassFieldInspector( clazz,
+                                                                           false );
             final String className = Type.getInternalName( clazz ) + "ShadowProxy";
             // generating byte array to create target class
             final byte[] bytes = dump( clazz,
@@ -116,7 +117,7 @@
     protected static void buildClassHeader(final Class clazz,
                                            final String className,
                                            final ClassWriter cw) {
-        if( clazz.isInterface() ) {
+        if ( clazz.isInterface() ) {
             cw.visit( Opcodes.V1_2,
                       Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
                       className,
@@ -182,7 +183,7 @@
                                 l0 );
             mv.visitVarInsn( Opcodes.ALOAD,
                              0 );
-            if(clazz.isInterface()) {
+            if ( clazz.isInterface() ) {
                 mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
                                     Type.getInternalName( Object.class ),
                                     "<init>",
@@ -195,7 +196,7 @@
                                     Type.getMethodDescriptor( Type.VOID_TYPE,
                                                               new Type[]{} ) );
             }
-            
+
             // this.delegate = delegate
             Label l1 = new Label();
             mv.visitLabel( l1 );
@@ -289,7 +290,7 @@
                            className,
                            DELEGATE_FIELD_NAME,
                            Type.getDescriptor( clazz ) );
-        if(clazz.isInterface()) {
+        if ( clazz.isInterface() ) {
             mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
                                 Type.getInternalName( clazz ),
                                 method.getName(),
@@ -347,7 +348,7 @@
         MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
                                            "resetProxy",
                                            Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                                     new Type[] { } ),
+                                                                     new Type[]{} ),
                                            null,
                                            null );
         mv.visitCode();
@@ -362,7 +363,7 @@
             mv.visitLabel( l1 );
             mv.visitVarInsn( Opcodes.ALOAD,
                              0 );
-            if( fieldType.isPrimitive() ) {
+            if ( fieldType.isPrimitive() ) {
                 if ( fieldType.equals( Long.TYPE ) ) {
                     mv.visitInsn( Opcodes.LCONST_0 );
                 } else if ( fieldType.equals( Double.TYPE ) ) {
@@ -405,6 +406,49 @@
         mv.visitEnd();
     }
 
+    protected static void buildEqualsMethod(Class clazz,
+                                            String className,
+                                            ClassWriter cw) {
+        MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
+                                           "equals",
+                                           "(Ljava/lang/Object;)Z",
+                                           null,
+                                           null );
+        mv.visitCode();
+        Label l0 = new Label();
+        mv.visitLabel( l0 );
+        mv.visitVarInsn( Opcodes.ALOAD,
+                         0 );
+        mv.visitFieldInsn( Opcodes.GETFIELD,
+                           className,
+                           DELEGATE_FIELD_NAME,
+                           Type.getDescriptor( clazz ) );
+        mv.visitVarInsn( Opcodes.ALOAD,
+                         1 );
+        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
+                            Type.getInternalName( clazz ),
+                            "equals",
+                            "(Ljava/lang/Object;)Z" );
+        mv.visitInsn( Opcodes.IRETURN );
+        Label l1 = new Label();
+        mv.visitLabel( l1 );
+        mv.visitLocalVariable( "this",
+                               "L"+className+";",
+                               null,
+                               l0,
+                               l1,
+                               0 );
+        mv.visitLocalVariable( "object",
+                               Type.getDescriptor( Object.class ),
+                               null,
+                               l0,
+                               l1,
+                               1 );
+        mv.visitMaxs( 0,
+                      0 );
+        mv.visitEnd();
+    }
+
     /**
      * Simple classloader
      * @author Michael Neale

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -96,6 +96,16 @@
         return ValueType.FACTTEMPLATE_TYPE;
     }
 
+    public Object getShadow(Object fact) {
+        // @TODO: shadow not implemented for templates yet
+        return null;
+    }
+
+    public boolean isShadowEnabled() {
+        // @TODO: shadow not implemented for templates yet
+        return false;
+    }
+    
     public String toString() {
         return "[ClassObjectType class=" + this.factTemplate.getName() + "]";
     }
@@ -126,5 +136,4 @@
     public int hashCode() {
         return this.factTemplate.hashCode();
     }
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -43,5 +43,21 @@
     boolean matches(Object object);
 
     ValueType getValueType();
+
+    /**
+     * If shadow facts are enabled, returns the shadow fact,
+     * otherwise returns null
+     * 
+     * @param fact the fact to be shadowed
+     * 
+     * @return the shadow fact for the given fact or null
+     * if shadow facts are disabled
+     */
+    Object getShadow(Object fact);
     
+    /**
+     * Returns true in case shadow facts are enabled
+     * @return true if shadow facts are enabled, false otherwise
+     */
+    boolean isShadowEnabled();
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -6,7 +6,6 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.ObjectHashTable;
 import org.drools.reteoo.ReteTuple;
-import org.drools.spi.Tuple;
 
 public class FactHashTable extends AbstractHashTable implements ObjectHashTable {
     private static final long serialVersionUID = 320L;    

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -19,10 +19,13 @@
 import java.lang.reflect.Field;
 import java.util.List;
 
+import org.drools.Cheese;
 import org.drools.DroolsTestCase;
 import org.drools.FactException;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassObjectType;
+import org.drools.base.ShadowProxy;
+import org.drools.base.ShadowProxyFactory;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.PropagationContextImpl;
@@ -30,7 +33,6 @@
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactHashTable;
 import org.drools.util.ObjectHashMap;
-import org.drools.util.PrimitiveLongMap;
 
 public class ObjectTypeNodeTest extends DroolsTestCase {
 
@@ -257,5 +259,52 @@
                       sink2.getAsserted().size() );
 
     }
+    
+    public void testAssertObjectWithShadowEnabled() throws Exception {
+        final PropagationContext context = new PropagationContextImpl( 0,
+                                                                       PropagationContext.ASSERTION,
+                                                                       null,
+                                                                       null );
 
+        ReteooRuleBase ruleBase  = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+                                                                           ruleBase );
+
+        final Rete source = ruleBase.getRete();
+
+        Class shadowClass = ShadowProxyFactory.getProxy( Cheese.class );
+        final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  new ClassObjectType( Cheese.class,
+                                                                                       shadowClass ),
+                                                                  source );
+
+        final MockObjectSink sink = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink );
+
+        final Object cheese = new Cheese("muzzarela", 5);
+
+        final InternalFactHandle handle1 = (InternalFactHandle) workingMemory.assertObject( cheese );
+
+        // should assert as ObjectType matches
+        objectTypeNode.assertObject( handle1,
+                                     context,
+                                     workingMemory );
+
+        // make sure just string1 was asserted 
+        final List asserted = sink.getAsserted();
+        assertLength( 1,
+                      asserted );
+        assertTrue( ((InternalFactHandle) ((Object[]) asserted.get( 0 ))[0]).getObject() instanceof ShadowProxy );
+        assertEquals( cheese,
+                      ((InternalFactHandle) ((Object[]) asserted.get( 0 ))[0]).getObject() );
+
+        // check asserted object was added to memory
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        assertEquals( 1,
+                      memory.size() );
+        assertTrue( memory.contains( handle1 ) );
+    }
+
+    
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -19,10 +19,8 @@
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 import org.drools.DroolsTestCase;
 import org.drools.FactException;

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java	2006-10-04 18:29:27 UTC (rev 6601)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java	2006-10-04 18:42:52 UTC (rev 6602)
@@ -78,5 +78,13 @@
     public ValueType getValueType() {
         return ValueType.OBJECT_TYPE;
     }
+    
+    public Object getShadow(Object fact) {
+        return null;
+    }
 
+    public boolean isShadowEnabled() {
+        return false;
+    }
+
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list