[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