[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