[jboss-svn-commits] JBL Code SVN: r9822 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Feb 27 17:01:17 EST 2007


Author: tirelli
Date: 2007-02-27 17:01:17 -0500 (Tue, 27 Feb 2007)
New Revision: 9822

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderItem.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_SelfReference.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
Log:
JBRULES-653: adding support to self references using the 'this' keyword

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools;
+
+
+/**
+ * @author etirelli
+ *
+ */
+public class Order {
+
+    private int number;
+    
+    public Order() {
+        this( 0 );
+    }
+    
+    public Order( int number ) {
+        this.number = number;
+    }
+
+    /**
+     * @return the number
+     */
+    public int getNumber() {
+        return number;
+    }
+
+    /**
+     * @param number the number to set
+     */
+    public void setNumber(int number) {
+        this.number = number;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + number;
+        return result;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final Order other = (Order) obj;
+        if ( number != other.number ) return false;
+        return true;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderItem.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderItem.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderItem.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools;
+
+/**
+ * @author etirelli
+ *
+ */
+public class OrderItem {
+    private int seq;
+    private Order order;
+    
+    public OrderItem() {
+        this( null, 0 );
+    }
+    
+    public OrderItem( Order order, int seq ) {
+        this.order = order;
+        this.seq = seq;
+    }
+    /**
+     * @return the order
+     */
+    public Order getOrder() {
+        return order;
+    }
+    /**
+     * @param order the order to set
+     */
+    public void setOrder(Order order) {
+        this.order = order;
+    }
+    /**
+     * @return the seq
+     */
+    public int getSeq() {
+        return seq;
+    }
+    /**
+     * @param seq the seq to set
+     */
+    public void setSeq(int seq) {
+        this.seq = seq;
+    }
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((order == null) ? 0 : order.hashCode());
+        result = PRIME * result + seq;
+        return result;
+    }
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final OrderItem other = (OrderItem) obj;
+        if ( order == null ) {
+            if ( other.order != null ) return false;
+        } else if ( !order.equals( other.order ) ) return false;
+        if ( seq != other.seq ) return false;
+        return true;
+    }
+    
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderItem.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-02-27 20:20:16 UTC (rev 9821)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -50,6 +50,8 @@
 import org.drools.FactHandle;
 import org.drools.FromTestClass;
 import org.drools.IndexedNumber;
+import org.drools.Order;
+import org.drools.OrderItem;
 import org.drools.Person;
 import org.drools.PersonInterface;
 import org.drools.Precondition;
@@ -4042,5 +4044,41 @@
         }
     }
 
+    public void testSelfReference() throws Exception {
+        try {
+            final PackageBuilder builder = new PackageBuilder();
+            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_SelfReference.drl" ) ) );
+            final Package pkg = builder.getPackage();
 
+            final RuleBase ruleBase = getRuleBase();
+            ruleBase.addPackage( pkg );
+            final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+            
+            List results = new ArrayList();
+            workingMemory.setGlobal( "results", results );
+
+            Order order = new Order( 10 );
+            OrderItem item1 = new OrderItem( order, 1 );
+            OrderItem item2 = new OrderItem( order, 2 );
+            OrderItem anotherItem1 = new OrderItem( null, 3 );
+            OrderItem anotherItem2 = new OrderItem( null, 4 );
+            workingMemory.assertObject( order );
+            workingMemory.assertObject( item1 );
+            workingMemory.assertObject( item2 );
+            workingMemory.assertObject( anotherItem1 );
+            workingMemory.assertObject( anotherItem2 );
+
+            workingMemory.fireAllRules();
+            
+            assertEquals( 2, results.size() );
+            assertTrue( results.contains( item1 ) );
+            assertTrue( results.contains( item2 ) );
+
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail("Should not raise any exception");
+        }
+    }
+
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_SelfReference.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_SelfReference.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_SelfReference.drl	2007-02-27 22:01:17 UTC (rev 9822)
@@ -0,0 +1,11 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "reversed references"
+when
+    $item : OrderItem( $order : order )
+    Order( this == $order )
+then
+    results.add( $item );
+end 
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_SelfReference.drl
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2007-02-27 20:20:16 UTC (rev 9821)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -33,6 +33,27 @@
 
     private final ValueType valueType;
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseClassFieldExtractor(final int index,
+                                   final Class fieldType,
+                                   final ValueType valueType) {
+        this.index = index;
+        this.fieldType = fieldType;
+        this.valueType = valueType;
+    }
+
+    /**
+     * This is the constructor to be used
+     * 
+     * @param clazz
+     * @param fieldName
+     */
     public BaseClassFieldExtractor(final Class clazz,
                                    final String fieldName) {
         try {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-02-27 20:20:16 UTC (rev 9821)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -36,6 +36,7 @@
 import org.drools.base.extractors.BaseLongClassFieldExtractors;
 import org.drools.base.extractors.BaseObjectClassFieldExtractor;
 import org.drools.base.extractors.BaseShortClassFieldExtractor;
+import org.drools.base.extractors.SelfReferenceClassFieldExtractor;
 import org.drools.util.asm.ClassFieldInspector;
 
 /**
@@ -50,6 +51,8 @@
 public class ClassFieldExtractorFactory {
 
     private static final String BASE_PACKAGE = "org/drools/base";
+    
+    private static final String SELF_REFERENCE_FIELD = "this";
 
     private static final ProtectionDomain PROTECTION_DOMAIN;
 
@@ -64,26 +67,33 @@
     public static BaseClassFieldExtractor getClassFieldExtractor(final Class clazz,
                                                                  final String fieldName) {
         try {
-            final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
-            final Class fieldType = (Class) inspector.getFieldTypes().get( fieldName );
-            final Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
-            final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
+            // if it is a self reference
+            if( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
+                // then just create an instance of the special class field extractor
+                return new SelfReferenceClassFieldExtractor(clazz, fieldName);
+            } else {
+                // otherwise, bytecode generate a specific extractor
+                final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
+                final Class fieldType = (Class) inspector.getFieldTypes().get( fieldName );
+                final Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
+                final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
 
-            // generating byte array to create target class
-            final byte[] bytes = dump( clazz,
-                                       className,
-                                       getterMethod,
-                                       fieldType,
-                                       clazz.isInterface() );
-            // use bytes to get a class 
-            final ByteArrayClassLoader classLoader = new ByteArrayClassLoader( Thread.currentThread().getContextClassLoader() );
-            final Class newClass = classLoader.defineClass( className.replace( '/',
-                                                                               '.' ),
-                                                            bytes,
-                                                            PROTECTION_DOMAIN);
-            // instantiating target class
-            final Object[] params = {clazz, fieldName};
-            return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
+                // generating byte array to create target class
+                final byte[] bytes = dump( clazz,
+                                           className,
+                                           getterMethod,
+                                           fieldType,
+                                           clazz.isInterface() );
+                // use bytes to get a class 
+                final ByteArrayClassLoader classLoader = new ByteArrayClassLoader( Thread.currentThread().getContextClassLoader() );
+                final Class newClass = classLoader.defineClass( className.replace( '/',
+                                                                                   '.' ),
+                                                                bytes,
+                                                                PROTECTION_DOMAIN);
+                // instantiating target class
+                final Object[] params = {clazz, fieldName};
+                return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
+            }
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( e );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-02-27 20:20:16 UTC (rev 9821)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -4,11 +4,20 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseObjectClassFieldExtractor extends BaseClassFieldExtractor {
 
     private static final long serialVersionUID = 91214567753008212L;
 
+    protected BaseObjectClassFieldExtractor(final int index,
+                                            final Class fieldType,
+                                            final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public BaseObjectClassFieldExtractor(final Class clazz,
                                          final String fieldName) {
         super( clazz,
@@ -99,15 +108,17 @@
 
     public Method getNativeReadMethod() {
         try {
-            return this.getClass().getDeclaredMethod( "getValue", new Class[] { Object.class } );
+            return this.getClass().getDeclaredMethod( "getValue",
+                                                      new Class[]{Object.class} );
         } catch ( Exception e ) {
-            throw new RuntimeDroolsException("This is a bug. Please report to development team: "+e.getMessage(), e);
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
         }
     }
-    
+
     public int getHashCode(Object object) {
-        Object value = getValue( object ); 
+        Object value = getValue( object );
         return (value != null) ? value.hashCode() : 0;
     }
-    
+
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import org.drools.base.ShadowProxy;
+import org.drools.base.ValueType;
+
+/**
+ * A special field extractor for the self reference "this".
+ *  
+ * @author etirelli
+ */
+public class SelfReferenceClassFieldExtractor extends BaseObjectClassFieldExtractor {
+
+    private static final long serialVersionUID = 3258380877818552472L;
+
+    public SelfReferenceClassFieldExtractor(Class clazz,
+                                            String fieldName) {
+        super( -1, // index
+               clazz, // fieldType
+               ValueType.determineValueType( clazz ) ); // value type
+    }
+
+    public Object getValue(Object object) {
+        return ( object instanceof ShadowProxy ) ? ((ShadowProxy)object).getShadowedObject() : object;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2007-02-27 20:20:16 UTC (rev 9821)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2007-02-27 22:01:17 UTC (rev 9822)
@@ -25,7 +25,7 @@
 import org.drools.util.asm.TestInterface;
 import org.drools.util.asm.TestInterfaceImpl;
 
-public abstract class BaseClassFieldExtractorFactoryTest extends TestCase {
+public class BaseClassFieldExtractorFactoryTest extends TestCase {
 
     public void testIt() throws Exception {
         FieldExtractor ex = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class,
@@ -38,8 +38,8 @@
                                                                 "age" );
         assertEquals( 1,
                       ex.getIndex() );
-        assertEquals( new Integer( 42 ),
-                      ex.getValue( new TestBean() ) );
+        assertEquals( 42,
+                      ((Number)ex.getValue( new TestBean() )).intValue() );
 
     }
 
@@ -68,4 +68,12 @@
                       ex.getValue( new BeanInherit() ) );
     }
 
+    public void testSelfReference() throws Exception {
+        final FieldExtractor ex = ClassFieldExtractorFactory.getClassFieldExtractor( BeanInherit.class,
+                                                                                     "this" );
+        TestBean bean = new TestBean();
+        assertEquals( bean,
+                      ex.getValue( bean ) );
+    }
+
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list