[jboss-svn-commits] JBL Code SVN: r14512 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/facttemplates and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Aug 23 23:47:17 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-08-23 23:47:16 -0400 (Thu, 23 Aug 2007)
New Revision: 14512
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.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/ReteooBuilder.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.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/reteoo/SchedulerTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java
Log:
JBRULES-1104 Inserted internal Objects (like InitialFactImpl) are lost if no matching ObjectTypeNodes
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -99,7 +99,19 @@
public boolean matches(final Object object) {
return getClassType().isInstance( object );
}
+
+ public boolean isAssignableFrom(Object object) {
+ return this.objectTypeClass.isAssignableFrom( (Class) object );
+ }
+ public boolean isAssignableFrom(ObjectType objectType) {
+ if ( !( objectType instanceof ClassObjectType ) ) {
+ return false;
+ } else {
+ return this.objectTypeClass.isAssignableFrom( ((ClassObjectType) objectType).getClassType() );
+ }
+ }
+
public ValueType getValueType() {
return this.valueType;
}
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+import org.drools.base.ClassObjectType;
import org.drools.base.ValueType;
import org.drools.spi.ObjectType;
@@ -73,20 +74,6 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
- * Determine if the passed <code>Class</code> matches to the object type
- * defined by this <code>objectType</code> instance.
- *
- * @param clazz
- * The <code>Class</code> to test.
- *
- * @return <code>true</code> if the <code>Class</code> matches this
- * object type, else <code>false</code>.
- */
- public boolean matchesClass(final Class clazz) {
- return FactImpl.class.isAssignableFrom( clazz );
- }
-
- /**
* Determine if the passed <code>Object</code> belongs to the object type
* defined by this <code>objectType</code> instance.
*
@@ -103,6 +90,18 @@
return false;
}
}
+
+ public boolean isAssignableFrom(Object object) {
+ return this.factTemplate.equals( object );
+ }
+
+ public boolean isAssignableFrom(ObjectType objectType) {
+ if ( ! ( objectType instanceof FactTemplateObjectType ) ) {
+ return false;
+ } else {
+ return this.factTemplate.equals( ((FactTemplateObjectType) objectType).getFactTemplate() );
+ }
+ }
public ValueType getValueType() {
return ValueType.FACTTEMPLATE_TYPE;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -126,19 +126,11 @@
public boolean matches(final Object object) {
return this.objectType.matches( object );
}
-
- /**
- * Tests the provided class to see if this <code>ObjectTypeNode</code> can receive instances of that class
- * for assertion and retraction propagations.
- *
- * @param object
- * @return
- * boolean value indicating whether the <code>ObjectTypeNode</code> can receive instances of the class.
- */
- public boolean matchesClass(final Class clazz) {
- return this.objectType.matchesClass( clazz );
+
+ public boolean isAssignableFrom(final Object object) {
+ return this.objectType.isAssignableFrom( object );
}
-
+
/**
* Propagate the <code>FactHandleimpl</code> through the <code>Rete</code> network. All
* <code>FactHandleImpl</code> should be remembered in the node memory, so that later runtime rule attachmnents
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-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -27,6 +27,7 @@
import org.drools.FactException;
import org.drools.RuleBaseConfiguration;
import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
import org.drools.base.ShadowProxy;
import org.drools.base.ShadowProxyFactory;
import org.drools.common.BaseNode;
@@ -37,10 +38,16 @@
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;
import org.drools.objenesis.ObjenesisStd;
import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.reteoo.builder.PatternBuilder;
+import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
+import org.drools.util.FactEntry;
+import org.drools.util.FactHashTable;
import org.drools.util.Iterator;
import org.drools.util.ObjectHashMap;
import org.drools.util.ObjectHashMap.ObjectEntry;
@@ -119,31 +126,32 @@
final InternalWorkingMemory workingMemory) {
final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
- final Object object = handle.getObject();
+ Object object = handle.getObject();
ObjectTypeConf ojectTypeConf;
if ( object instanceof FactImpl ) {
String key = ((Fact) object).getFactTemplate().getName();
ojectTypeConf = (ObjectTypeConf) memory.get( key );
if ( ojectTypeConf == null ) {
- ojectTypeConf = new ObjectTypeConf( null,
- this.ruleBase );
+ ojectTypeConf = new FactTemplateTypeConf( ((Fact) object).getFactTemplate(),
+ this.ruleBase );
memory.put( key,
ojectTypeConf,
false );
}
+ object = key;
} else {
Class cls = null;
if ( object instanceof ShadowProxy ) {
- cls = ((ShadowProxy)object).getShadowedObject().getClass();
+ cls = ((ShadowProxy) object).getShadowedObject().getClass();
} else {
cls = object.getClass();
}
ojectTypeConf = (ObjectTypeConf) memory.get( cls );
if ( ojectTypeConf == null ) {
- ojectTypeConf = new ObjectTypeConf( cls,
- this.ruleBase );
+ ojectTypeConf = new ClassObjectTypeConf( cls,
+ this.ruleBase );
memory.put( cls,
ojectTypeConf,
false );
@@ -162,7 +170,7 @@
}
}
- ObjectTypeNode[] cachedNodes = ojectTypeConf.getObjectTypeNodes( object );
+ ObjectTypeNode[] cachedNodes = ojectTypeConf.getObjectTypeNodes();
for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
cachedNodes[i].assertObject( handle,
@@ -189,12 +197,12 @@
ObjectTypeConf objectTypeConf;
if ( object instanceof ShadowProxy ) {
- objectTypeConf = (ObjectTypeConf) memory.get( ((ShadowProxy)object).getShadowedObject().getClass() );
+ objectTypeConf = (ObjectTypeConf) memory.get( ((ShadowProxy) object).getShadowedObject().getClass() );
} else {
objectTypeConf = (ObjectTypeConf) memory.get( object.getClass() );
}
- ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes( object );
+ ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes( );
if ( cachedNodes == null ) {
// it is possible that there are no ObjectTypeNodes for an object being retracted
@@ -224,7 +232,8 @@
}
protected void removeObjectSink(final ObjectSink objectSink) {
- this.objectTypeNodes.remove( objectSink );
+ final ObjectTypeNode node = (ObjectTypeNode) objectSink;
+ this.objectTypeNodes.remove( node.getObjectType() );
}
public void attach() {
@@ -280,24 +289,109 @@
// JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
Iterator it = memory.iterator();
+ final ObjectTypeNode node = (ObjectTypeNode) sink;
+
+ ObjectType newObjectType = node.getObjectType();
+
for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
- ((ObjectTypeConf) entry.getValue()).resetCache();
+ ObjectTypeConf objectTypeConf = (ObjectTypeConf) entry.getValue();
+ if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
+ objectTypeConf.resetCache();
+ ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
+ FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( sourceNode );
+ Iterator factIter = table.iterator();
+ for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
+ sink.assertObject( factEntry.getFactHandle(),
+ context,
+ workingMemory );
+ }
+ }
}
- final ObjectTypeNode node = (ObjectTypeNode) sink;
- it = workingMemory.getFactHandleMap().iterator();
- for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
- final InternalFactHandle handle = (InternalFactHandle) entry.getValue();
- if ( node.matches( handle.getObject() ) ) {
- node.assertObject( handle,
- context,
- workingMemory );
+ // ObjectType
+ // this.c
+
+ // final ObjectTypeNode node = (ObjectTypeNode) sink;
+ // it = workingMemory.getFactHandleMap().iterator();
+ // for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
+ // final InternalFactHandle handle = (InternalFactHandle) entry.getValue();
+ // if ( node.matches( handle.getObject() ) ) {
+ // node.assertObject( handle,
+ // context,
+ // workingMemory );
+ // }
+ // }
+ }
+
+ public static interface ObjectTypeConf {
+ public ObjectTypeNode[] getObjectTypeNodes();
+
+ public boolean isShadowEnabled();
+
+ public Object getShadow(final Object fact) throws RuntimeDroolsException;
+
+ public ObjectTypeNode getConcreteObjectTypeNode();
+
+ public void resetCache();
+
+ public boolean isAssignableFrom(Object object);
+ }
+
+ public static class FactTemplateTypeConf
+ implements
+ ObjectTypeConf,
+ Serializable {
+ private InternalRuleBase ruleBase;
+ private FactTemplate factTemplate;
+ private ObjectTypeNode concreteObjectTypeNode;
+ private ObjectTypeNode[] cache;
+
+ public FactTemplateTypeConf(FactTemplate factTemplate,
+ InternalRuleBase ruleBase) {
+ this.ruleBase = ruleBase;
+ this.factTemplate = factTemplate;
+ ObjectType objectType = new FactTemplateObjectType(factTemplate);
+ this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
+ if ( this.concreteObjectTypeNode == null ) {
+ // there must exist an ObjectTypeNode for this concrete class
+ this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( ruleBase.getRete(),
+ objectType );
+ }
+ this.cache = new ObjectTypeNode[] { this.concreteObjectTypeNode };
+ }
+
+ public ObjectTypeNode getConcreteObjectTypeNode() {
+ return this.concreteObjectTypeNode;
+ }
+
+ public ObjectTypeNode[] getObjectTypeNodes() {
+ if ( this.cache == null ) {
+ this.cache = new ObjectTypeNode[] { this.concreteObjectTypeNode };
}
+ return this.cache;
}
+
+ public Object getShadow(Object fact) throws RuntimeDroolsException {
+ return null;
+ }
+
+ public boolean isShadowEnabled() {
+ return false;
+ }
+
+ public boolean isAssignableFrom(Object object) {
+ return this.factTemplate.equals( object );
+ }
+
+ public void resetCache() {
+ this.cache = null;
+ }
+
}
- public static class ObjectTypeConf
+ public static class ClassObjectTypeConf
implements
+ ObjectTypeConf,
Serializable {
// Objenesis instance without cache (false)
private static final Objenesis OBJENESIS = new ObjenesisStd( false );
@@ -310,16 +404,32 @@
protected Class shadowClass;
protected transient ObjectInstantiator instantiator;
- //private final InternalRuleBase ruleBase;
+ private ObjectTypeNode concreteObjectTypeNode;
- public ObjectTypeConf(Class clazz,
- InternalRuleBase ruleBase) {
+ public ClassObjectTypeConf(Class clazz,
+ InternalRuleBase ruleBase) {
this.cls = clazz;
this.ruleBase = ruleBase;
+ ObjectType objectType = new ClassObjectType( clazz );
+ this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
+ if ( this.concreteObjectTypeNode == null ) {
+ // there must exist an ObjectTypeNode for this concrete class
+ this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( ruleBase.getRete(),
+ objectType );
+ }
+
defineShadowProxyData( clazz );
}
+ public boolean isAssignableFrom(Object object) {
+ return this.cls.isAssignableFrom( (Class) object );
+ }
+
+ public ObjectTypeNode getConcreteObjectTypeNode() {
+ return this.concreteObjectTypeNode;
+ }
+
private void defineShadowProxyData(Class clazz) {
Rete rete = this.ruleBase.getRete();
@@ -330,9 +440,9 @@
return;
}
-
//String pkgName = (pkg != null) ? pkg.getName() : "";
- String pkgName = getPackageName(clazz, clazz.getPackage());
+ String pkgName = getPackageName( clazz,
+ clazz.getPackage() );
if ( "org.drools.reteoo".equals( pkgName ) || "org.drools.base".equals( pkgName ) ) {
// We don't shadow internal classes
this.shadowEnabled = false;
@@ -367,21 +477,21 @@
* This will return the package name - if the package is null, it will
* work it out from the class name (this is in cases where funky classloading is used).
*/
- public static String getPackageName(Class clazz, Package pkg) {
- String pkgName = "";
- if (pkg == null) {
- int index = clazz.getName().lastIndexOf('.');
- if (index != -1)
- pkgName = clazz.getName().substring(0, index);
- }
- else {
- pkgName = pkg.getName();
- }
- return pkgName;
+ public static String getPackageName(Class clazz,
+ Package pkg) {
+ String pkgName = "";
+ if ( pkg == null ) {
+ int index = clazz.getName().lastIndexOf( '.' );
+ if ( index != -1 ) pkgName = clazz.getName().substring( 0,
+ index );
+ } else {
+ pkgName = pkg.getName();
+ }
+ return pkgName;
- }
+ }
- private Class loadOrGenerateProxy(Class clazz,
+ private Class loadOrGenerateProxy(Class clazz,
Rete rete) {
Class shadowClass = null;
final String shadowProxyName = ShadowProxyFactory.getProxyClassNameForClass( clazz );
@@ -413,7 +523,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].matchesClass( ret );
+ isOk = nodes[i].isAssignableFrom( ret );
}
}
@@ -424,15 +534,13 @@
isOk = interfaces.length > 0;
for ( int i = 0; notFound && i < interfaces.length; i++ ) {
ret = interfaces[i];
- isOk = interfaces[i] != Serializable.class &&
- interfaces[i] != Cloneable.class &&
- interfaces[i] != Comparable.class;
+ 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].matchesClass( ret );
+ isOk = nodes[j].isAssignableFrom( ret );
}
notFound = !isOk;
}
- if( notFound ) {
+ if ( notFound ) {
ret = null;
}
}
@@ -490,9 +598,9 @@
defineShadowProxyData( cls );
}
- public ObjectTypeNode[] getObjectTypeNodes(final Object object) {
+ public ObjectTypeNode[] getObjectTypeNodes() {
if ( this.objectTypeNodes == null ) {
- buildCache( object );
+ this.objectTypeNodes = getMatchingObjectTypes( this.cls );
}
return this.objectTypeNodes;
}
@@ -503,27 +611,13 @@
final Iterator it = ruleBase.getRete().getObjectTypeNodes().newIterator();
for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
- if ( node.matchesClass( clazz ) ) {
+ if ( node.isAssignableFrom( clazz ) ) {
cache.add( node );
}
}
return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
}
-
- private void buildCache(final Object object) throws FactException {
- final List cache = new ArrayList();
-
- final Iterator it = ruleBase.getRete().getObjectTypeNodes().newIterator();
- for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
- final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
- if ( node.matches( object ) ) {
- cache.add( node );
- }
- }
-
- this.objectTypeNodes = (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
- }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -121,6 +121,10 @@
terminals.toArray( new BaseNode[terminals.size()] ) );
}
+ public IdGenerator getIdGenerator() {
+ return this.idGenerator;
+ }
+
public void order() {
if ( ordered ) {
// we should only do this on first call, its expected the RuleBase should not change afterwards.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -171,6 +171,10 @@
public Rete getRete() {
return this.rete;
}
+
+ public ReteooBuilder getReteooBuilder() {
+ return this.reteooBuilder;
+ }
/**
* Assert a fact object.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -22,9 +22,14 @@
import org.drools.base.ClassObjectType;
import org.drools.common.InstanceNotEqualsConstraint;
+import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.AlphaNode;
import org.drools.reteoo.ObjectSource;
import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.Rete;
+import org.drools.reteoo.ReteooBuilder;
+import org.drools.reteoo.ReteooRuleBase;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.rule.Declaration;
import org.drools.rule.InvalidPatternException;
import org.drools.rule.Pattern;
@@ -32,6 +37,7 @@
import org.drools.rule.RuleConditionElement;
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.Constraint;
+import org.drools.spi.ObjectType;
/**
* A builder for patterns
@@ -139,6 +145,21 @@
}
}
}
+
+ public static ObjectTypeNode attachObjectTypeNode(Rete rete, ObjectType objectType) {
+ ReteooRuleBase ruleBase = ( ReteooRuleBase ) rete.getRuleBase();
+ ReteooBuilder builder = ruleBase.getReteooBuilder();
+
+ ObjectTypeNode otn = new ObjectTypeNode( builder.getIdGenerator().getNextId(),
+ objectType,
+ rete,
+ ruleBase.getConfiguration().getAlphaNodeHashingThreshold() );
+
+ InternalWorkingMemory[] wms = ruleBase.getWorkingMemories();
+ otn.attach( wms );
+
+ return otn;
+ }
public void attachAlphaNodes(final BuildContext context,
final BuildUtils utils,
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -18,6 +18,7 @@
import java.io.Serializable;
+import org.drools.base.ClassObjectType;
import org.drools.base.ValueType;
/**
@@ -31,18 +32,6 @@
extends
Serializable {
/**
- * Determine if the passed <code>Class</code> matches to the object type
- * defined by this <code>objectType</code> instance.
- *
- * @param clazz
- * The <code>Class</code> to test.
- *
- * @return <code>true</code> if the <code>Class</code> matches this
- * object type, else <code>false</code>.
- */
- boolean matchesClass(Class clazz);
-
- /**
* Determine if the passed <code>Object</code> belongs to the object type
* defined by this <code>objectType</code> instance.
*
@@ -53,6 +42,10 @@
* object type, else <code>false</code>.
*/
boolean matches(Object object);
+
+ boolean isAssignableFrom(Object object);
+
+ boolean isAssignableFrom(ObjectType objectType);
ValueType getValueType();
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -38,6 +38,7 @@
import org.drools.common.PropagationContextImpl;
import org.drools.common.RuleFlowGroupImpl;
import org.drools.conflict.DepthConflictResolver;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.rule.Rule;
import org.drools.spi.Activation;
import org.drools.spi.ActivationGroup;
@@ -1206,10 +1207,10 @@
* Test auto-deactivation of RuleFlowGroup.
*/
public void testRuleFlowGroup4() {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ final InternalWorkingMemory workingMemory = ( InternalWorkingMemory ) ruleBase.newStatefulSession(); ;
- final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
-
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
// create rule0
@@ -1226,8 +1227,8 @@
rule0.setRuleFlowGroup( "rule-flow-group-0" );
rule0.setConsequence( consequence0 );
- final RuleTerminalNode node0 = new RuleTerminalNode( 1,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node0 = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule0,
rule0.getLhs() );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -23,7 +23,9 @@
import org.drools.RuleBaseFactory;
import org.drools.common.BaseNode;
import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.spi.PropagationContext;
import org.drools.spi.Tuple;
import org.drools.util.FactHashTable;
@@ -113,17 +115,18 @@
*
* @throws Exception
*/
- public void testAssertObjectWithMemory() throws Exception {
+ public void testAssertObjectWithMemory() throws Exception {
final PropagationContext context = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
null );
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ final InternalWorkingMemory workingMemory = ( InternalWorkingMemory ) ruleBase.newStatefulSession();
- final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
- new MockObjectSource( 15 ) );
+ final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( idGenerator.getNextId(),
+ new MockObjectSource( idGenerator.getNextId() ));
final MockTupleSink sink = new MockTupleSink();
liaNode.addTupleSink( sink );
@@ -222,13 +225,12 @@
null,
null );
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ final InternalWorkingMemory workingMemory = ( InternalWorkingMemory ) ruleBase.newStatefulSession();
- final MockObjectSource source = new MockObjectSource( 15 );
-
- final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
- source );
+ final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( idGenerator.getNextId(),
+ new MockObjectSource( idGenerator.getNextId() ));
//force liaNode to have memory
final Field field = BaseNode.class.getDeclaredField( "hasMemory" );
field.setAccessible( true );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -31,7 +31,9 @@
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalAgenda;
import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.rule.Rule;
import org.drools.spi.Consequence;
import org.drools.spi.KnowledgeHelper;
@@ -40,11 +42,13 @@
public class LogicalAssertionTest extends DroolsTestCase {
public void testSingleLogicalRelationship() throws Exception {
- final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
final Rete rete = ruleBase.getRete();
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
@@ -53,8 +57,8 @@
objectTypeNode.addObjectSink( sink );
final Rule rule1 = new Rule( "test-rule1" );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -90,10 +94,10 @@
final String logicalString = new String( "logical" );
FactHandle logicalHandle = workingMemory.insert( logicalString,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// Retract the tuple and test the logically asserted fact was also retracted
node.retractTuple( tuple1,
context1,
@@ -116,10 +120,10 @@
context1,
workingMemory );
logicalHandle = workingMemory.insert( logicalString,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
agenda.fireNextItem( null );
@@ -143,9 +147,11 @@
// MockObjectSink so w can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- final Rete rete = new Rete( (InternalRuleBase) ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
@@ -153,12 +159,11 @@
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
-
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
final Agenda agenda = workingMemory.getAgenda();
@@ -192,17 +197,17 @@
final String logicalString1 = new String( "logical" );
FactHandle logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
final String logicalString2 = new String( "logical" );
FactHandle logicalHandle2 = workingMemory.insert( logicalString2,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
assertSame( logicalHandle1,
logicalHandle2 );
@@ -233,17 +238,19 @@
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- final Rete rete = new Rete( (InternalRuleBase) ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
@@ -280,10 +287,10 @@
String logicalString1 = new String( "logical" );
FactHandle logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// This assertion is stated and should override any previous justified
// "equals" objects.
@@ -320,19 +327,19 @@
// an equals STATED assertion.
logicalString1 = new String( "logical" );
logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
assertNull( logicalHandle1 );
// Already identify same so return previously assigned handle
logicalHandle1 = workingMemory.insert( logicalString2,
- false,
- false,
- rule1,
- tuple1.getActivation() );
+ false,
+ false,
+ rule1,
+ tuple1.getActivation() );
// return the matched handle
assertSame( logicalHandle2,
@@ -370,17 +377,19 @@
final Rule rule1 = new Rule( "test-rule1" );
RuleBaseConfiguration conf = new RuleBaseConfiguration();
conf.setLogicalOverride( LogicalOverride.PRESERVE );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase( conf );
- final Rete rete = new Rete( (InternalRuleBase) ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase(conf);
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -416,10 +425,10 @@
final String logicalString1 = new String( "logical" );
final FactHandle logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// This assertion is stated and should override any previous justified
// "equals" objects.
@@ -457,17 +466,19 @@
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- final Rete rete = new Rete( (InternalRuleBase)ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
@@ -504,14 +515,14 @@
// Assert the logical "logical" fact
final String logicalString1 = new String( "logical" );
final FactHandle logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// create the second activation to justify the "logical" fact
final Rule rule2 = new Rule( "test-rule2" );
- final RuleTerminalNode node2 = new RuleTerminalNode( 4,
+ final RuleTerminalNode node2 = new RuleTerminalNode( idGenerator.getNextId(),
new MockTupleSource( 3 ),
rule2,
rule2.getLhs() );
@@ -532,10 +543,10 @@
// Assert the logical "logical" fact
final String logicalString2 = new String( "logical" );
final FactHandle logicalHandle2 = workingMemory.insert( logicalString2,
- false,
- true,
- rule2,
- tuple2.getActivation() );
+ false,
+ true,
+ rule2,
+ tuple2.getActivation() );
// "logical" should only appear once
assertLength( 1,
@@ -552,20 +563,22 @@
public void testMultipleLogicalRelationships() throws FactException {
final Rule rule1 = new Rule( "test-rule1" );
- final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
final Rete rete = ruleBase.getRete();
// Create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -602,8 +615,8 @@
// Create the second justifer
final Rule rule2 = new Rule( "test-rule2" );
- final RuleTerminalNode node2 = new RuleTerminalNode( 4,
- new MockTupleSource( 3 ),
+ final RuleTerminalNode node2 = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule2,
rule2.getLhs() );
rule2.setConsequence( consequence );
@@ -625,18 +638,18 @@
// Create the first justifieable relationship
final String logicalString1 = new String( "logical" );
final FactHandle logicalHandle1 = workingMemory.insert( logicalString1,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// Create the second justifieable relationship
final String logicalString2 = new String( "logical" );
final FactHandle logicalHandle2 = workingMemory.insert( logicalString2,
- false,
- true,
- rule2,
- tuple2.getActivation() );
+ false,
+ true,
+ rule2,
+ tuple2.getActivation() );
// "logical" should only appear once
assertLength( 1,
@@ -683,17 +696,19 @@
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- final Rete rete = new Rete( (InternalRuleBase)ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
- rete,
+ rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
@@ -737,10 +752,10 @@
// This assertion is logical should fail as there is previous stated objects
final String logicalString3 = new String( "logical" );
FactHandle logicalHandle3 = workingMemory.insert( logicalString3,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// Checks that previous LogicalAssert failed
assertNull( logicalHandle3 );
@@ -753,10 +768,10 @@
workingMemory.retract( statedHandle2 );
logicalHandle3 = workingMemory.insert( logicalString3,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// Checks that previous LogicalAssert failed
assertNull( logicalHandle3 );
@@ -765,10 +780,10 @@
workingMemory.retract( statedHandle1 );
logicalHandle3 = workingMemory.insert( logicalString3,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
// Checks that previous LogicalAssert succeeded as there are no more
// stated strings in the working memory
@@ -783,17 +798,19 @@
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- final Rete rete = new Rete( (InternalRuleBase)ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ final Rete rete = ruleBase.getRete();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
rete,
3 );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
- final RuleTerminalNode node = new RuleTerminalNode( 2,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule1,
rule1.getLhs() );
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -830,10 +847,10 @@
final Cheese cheese = new Cheese( "brie",
10 );
final FactHandle cheeseHandle = workingMemory.insert( cheese,
- false,
- true,
- rule1,
- tuple1.getActivation() );
+ false,
+ true,
+ rule1,
+ tuple1.getActivation() );
cheese.setType( "cheddar" );
cheese.setPrice( 20 );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -1,16 +1,16 @@
package org.drools.reteoo;
-import org.drools.reteoo.Rete.ObjectTypeConf;
+import org.drools.reteoo.Rete.ClassObjectTypeConf;
import junit.framework.TestCase;
public class ObjectTypeConfTest extends TestCase {
public void testGetPackageName() {
- assertEquals("org.drools.reteoo", ObjectTypeConf.getPackageName(this.getClass(), null));
+ assertEquals("org.drools.reteoo", ClassObjectTypeConf.getPackageName(this.getClass(), null));
Package thispkg = this.getClass().getPackage();
assertNotNull(thispkg);
- assertEquals("org.drools.reteoo", ObjectTypeConf.getPackageName(this.getClass(), thispkg));
+ assertEquals("org.drools.reteoo", ClassObjectTypeConf.getPackageName(this.getClass(), thispkg));
}
}
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -33,6 +33,7 @@
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalRuleBase;
import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
import org.drools.util.FactHashTable;
@@ -41,17 +42,20 @@
public class ObjectTypeNodeTest extends DroolsTestCase {
public void testAttach() throws Exception {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
final Rete source = new Rete( (InternalRuleBase)ruleBase);
final ObjectType objectType = new ClassObjectType( String.class );
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ int id = idGenerator.getNextId();
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( id,
objectType,
source,
3 );
- assertEquals( 1,
+ assertEquals( id,
objectTypeNode.getId() );
final Field field = Rete.class.getDeclaredField( "objectTypeNodes" );
@@ -76,13 +80,14 @@
null,
null );
- final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- ruleBase );
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) ruleBase.newStatefulSession();
+
final Rete source = ruleBase.getRete();
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
source,
3 );
@@ -158,12 +163,12 @@
}
public void testMemory() {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- (ReteooRuleBase) ruleBase );
+ final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) ruleBase.newStatefulSession();
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
new Rete( (InternalRuleBase) ruleBase),
3 );
@@ -174,10 +179,11 @@
}
public void testMatches() {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
final Rete source = new Rete((InternalRuleBase) ruleBase);
- ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
source,
3 );
@@ -186,7 +192,7 @@
assertFalse( objectTypeNode.matches( new Integer( 5 ) ) );
assertTrue( objectTypeNode.matches( "string" ) );
- objectTypeNode = new ObjectTypeNode( 1,
+ objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( Object.class ),
source,
3 );
@@ -198,18 +204,18 @@
}
public void testRetractObject() throws Exception {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
final PropagationContext context = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
null );
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- (ReteooRuleBase) ruleBase );
+ final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory)ruleBase.newStatefulSession();
final Rete source = new Rete((InternalRuleBase) ruleBase);
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( String.class ),
source,
3 );
@@ -362,14 +368,14 @@
null,
null );
- final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
- final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- ruleBase );
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) ruleBase.newStatefulSession();
final Rete source = ruleBase.getRete();
final Class shadowClass = ShadowProxyFactory.getProxy( Person.class );
- final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+ final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( Person.class ),
source,
3 );
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -1,4 +1,4 @@
- package org.drools.reteoo;
+package org.drools.reteoo;
/*
* Copyright 2005 JBoss Inc
@@ -18,6 +18,7 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -26,13 +27,17 @@
import org.drools.Cheese;
import org.drools.DroolsTestCase;
import org.drools.FactException;
+import org.drools.FactHandle;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
import org.drools.base.ClassObjectType;
import org.drools.base.ShadowProxy;
import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.Rete.ClassObjectTypeConf;
import org.drools.reteoo.Rete.ObjectTypeConf;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.spi.PropagationContext;
import org.drools.util.ObjectHashMap;
@@ -132,13 +137,13 @@
workingMemory );
final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( rete );
- ObjectTypeConf conf = ( ObjectTypeConf ) map.get( ArrayList.class );
+ ClassObjectTypeConf conf = (ClassObjectTypeConf) map.get( ArrayList.class );
assertLength( 3,
- conf.getObjectTypeNodes( new ArrayList() ) );
+ conf.getObjectTypeNodes() );
- conf = ( ObjectTypeConf ) map.get( LinkedList.class );
- assertLength( 2,
- conf.getObjectTypeNodes( new LinkedList() ) );
+ conf = (ClassObjectTypeConf) map.get( LinkedList.class );
+ assertLength( 3,
+ conf.getObjectTypeNodes() );
}
@@ -169,7 +174,10 @@
string );
rete.assertObject( h1,
- null,
+ new PropagationContextImpl( 0,
+ PropagationContext.ASSERTION,
+ null,
+ null ),
workingMemory );
assertLength( 0,
@@ -193,9 +201,99 @@
final Object[] results = (Object[]) asserted.get( 0 );
assertSame( list,
- unwrapShadow( ((DefaultFactHandle) results[0]).getObject()) );
+ unwrapShadow( ((DefaultFactHandle) results[0]).getObject() ) );
}
+ public void testAssertObjectWithNoMatchingObjectTypeNode() {
+ final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
+
+ final Rete rete = ruleBase.getRete();
+ assertEquals( 0,
+ rete.getObjectTypeNodes().size() );
+
+ List list = new ArrayList();
+
+ workingMemory.insert( list );
+
+ assertEquals( 2,
+ rete.getObjectTypeNodes().size() );
+ }
+
+ public void testHierrchy() {
+ final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
+
+ final Rete rete = ruleBase.getRete();
+ final IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+
+ // Attach a List ObjectTypeNode
+ final ObjectTypeNode listOtn = new ObjectTypeNode( idGenerator.getNextId(),
+ new ClassObjectType( List.class ),
+ rete,
+ 3 );
+ listOtn.attach();
+
+ // Will automatically create an ArrayList ObjectTypeNode
+ FactHandle handle = workingMemory.insert( new ArrayList() );
+
+ // Check we have three ObjectTypeNodes, List, ArrayList and InitialFactImpl
+ assertEquals( 3,
+ rete.getObjectTypeNodes().size() );
+
+ // double check that the Listreference is the same as the one we created, i.e. engine should try and recreate it
+ assertSame( listOtn,
+ rete.getObjectTypeNodes().get( new ClassObjectType( List.class ) ) );
+
+ // ArrayConf should match two ObjectTypenodes for List and ArrayList
+ ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( rete );
+ ObjectTypeConf arrayConf = (ObjectTypeConf) memory.get( ArrayList.class );
+ final ObjectTypeNode arrayOtn = arrayConf.getConcreteObjectTypeNode();
+ assertEquals( 2,
+ arrayConf.getObjectTypeNodes().length );
+
+ // Check it contains List and ArrayList
+ List nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
+ assertEquals(2, nodes.size() );
+ assertTrue( nodes.contains( arrayOtn ) );
+ assertTrue( nodes.contains( listOtn ) );
+
+ // Nodes are there, retract the fact so we can check both nodes are populated
+ workingMemory.retract( handle );
+
+ // Add MockSinks so we can track assertions
+ final MockObjectSink listSink = new MockObjectSink();
+ listOtn.addObjectSink( listSink );
+
+ final MockObjectSink arraySink = new MockObjectSink();
+ listOtn.addObjectSink( arraySink );
+
+ workingMemory.insert( new ArrayList() );
+ assertEquals( 1,
+ listSink.getAsserted().size() );
+ assertEquals( 1,
+ arraySink.getAsserted().size() );
+
+ // Add a Collection ObjectTypeNode, so that we can check that the data from ArrayList is sent to it
+ final ObjectTypeNode collectionOtn = new ObjectTypeNode( idGenerator.getNextId(),
+ new ClassObjectType( Collection.class ),
+ rete,
+ 3 );
+ final MockObjectSink collectionSink = new MockObjectSink();
+ collectionOtn.addObjectSink( collectionSink );
+ collectionOtn.attach( new InternalWorkingMemory[]{workingMemory} );
+
+ assertEquals( 1,
+ collectionSink.getAsserted().size() );
+
+ // check that ArrayListConf was updated with the new ObjectTypeNode
+ nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
+ assertEquals(3, nodes.size() );
+ assertTrue( nodes.contains( arrayOtn ) );
+ assertTrue( nodes.contains( listOtn ) );
+ assertTrue( nodes.contains( collectionOtn ) );
+ }
+
/**
* All objects retracted from a RootNode must be propagated to all children
* ObjectTypeNodes.
@@ -221,10 +319,13 @@
string );
rete.assertObject( h1,
- null,
+ new PropagationContextImpl( 0,
+ PropagationContext.ASSERTION,
+ null,
+ null ),
workingMemory );
assertLength( 0,
- sink1.getAsserted() );
+ sink1.getAsserted() );
assertLength( 0,
sink1.getRetracted() );
@@ -256,7 +357,7 @@
assertSame( list,
unwrapShadow( ((DefaultFactHandle) results[0]).getObject() ) );
}
-
+
public void testIsShadowed() {
final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
@@ -274,7 +375,8 @@
// There are no String ObjectTypeNodes, make sure its not propagated
- final Cheese cheese = new Cheese("brie", 15);
+ final Cheese cheese = new Cheese( "brie",
+ 15 );
final DefaultFactHandle h1 = new DefaultFactHandle( 1,
cheese );
@@ -285,18 +387,19 @@
null ),
workingMemory );
- assertTrue( h1.isShadowFact() );
-
+ assertTrue( h1.isShadowFact() );
+
final Object[] results = (Object[]) sink1.getAsserted().get( 0 );
- assertTrue( ((DefaultFactHandle) results[0]).getObject() instanceof ShadowProxy );
+ assertTrue( ((DefaultFactHandle) results[0]).getObject() instanceof ShadowProxy );
}
-
+
public void testNotShadowed() {
-
+
Properties properties = new Properties();
- properties.setProperty( "drools.shadowProxyExcludes", "org.drools.Cheese" );
- RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
- final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( conf);
+ properties.setProperty( "drools.shadowProxyExcludes",
+ "org.drools.Cheese" );
+ RuleBaseConfiguration conf = new RuleBaseConfiguration( properties );
+ final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( conf );
final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
ruleBase );
@@ -312,7 +415,8 @@
// There are no String ObjectTypeNodes, make sure its not propagated
- final Cheese cheese = new Cheese("brie", 15);
+ final Cheese cheese = new Cheese( "brie",
+ 15 );
final DefaultFactHandle h1 = new DefaultFactHandle( 1,
cheese );
@@ -323,10 +427,10 @@
null ),
workingMemory );
- assertFalse( h1.isShadowFact() );
+ assertFalse( h1.isShadowFact() );
final Object[] results = (Object[]) sink1.getAsserted().get( 0 );
- assertFalse( ((DefaultFactHandle) results[0]).getObject() instanceof ShadowProxy );
- }
+ assertFalse( ((DefaultFactHandle) results[0]).getObject() instanceof ShadowProxy );
+ }
private Object unwrapShadow(Object object) {
if ( object instanceof ShadowProxy ) {
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/SchedulerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/SchedulerTest.java 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/SchedulerTest.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -25,7 +25,9 @@
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.ReteooBuilder.IdGenerator;
import org.drools.rule.Rule;
import org.drools.spi.Duration;
import org.drools.spi.KnowledgeHelper;
@@ -38,13 +40,13 @@
public class SchedulerTest extends DroolsTestCase {
public void testScheduledActivation() throws Exception {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
+ InternalWorkingMemory workingMemory = ( InternalWorkingMemory ) ruleBase.newStatefulSession();
- final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
-
final Rule rule = new Rule( "test-rule" );
- final RuleTerminalNode node = new RuleTerminalNode( 1,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule,
rule.getLhs() );
final List data = new ArrayList();
@@ -100,14 +102,15 @@
}
public void testDoLoopScheduledActivation() throws Exception {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
final Agenda agenda = workingMemory.getAgenda();
final Rule rule = new Rule( "test-rule" );
- final RuleTerminalNode node = new RuleTerminalNode( 1,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule,
rule.getLhs() );
final List data = new ArrayList();
@@ -177,7 +180,8 @@
}
public void testNoLoopScheduledActivation() throws Exception {
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+ IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
final Agenda agenda = workingMemory.getAgenda();
@@ -185,8 +189,8 @@
final Rule rule = new Rule( "test-rule" );
final List data = new ArrayList();
- final RuleTerminalNode node = new RuleTerminalNode( 1,
- new MockTupleSource( 2 ),
+ final RuleTerminalNode node = new RuleTerminalNode( idGenerator.getNextId(),
+ new MockTupleSource( idGenerator.getNextId() ),
rule,
rule.getLhs() );
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 2007-08-24 02:17:27 UTC (rev 14511)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java 2007-08-24 03:47:16 UTC (rev 14512)
@@ -1,5 +1,6 @@
package org.drools.spi;
+import org.drools.base.ClassObjectType;
import org.drools.base.ValueType;
/*
@@ -62,20 +63,6 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
- * Determine if the passed <code>Class</code> matches to the object type
- * defined by this <code>objectType</code> instance.
- *
- * @param clazz
- * The <code>Class</code> to test.
- *
- * @return <code>true</code> if the <code>Class</code> matches this
- * object type, else <code>false</code>.
- */
- public boolean matchesClass(final Class clazz) {
- return this.matches;
- }
-
- /**
* Determine if the passed <code>Object</code> belongs to the object type
* defined by this <code>objectType</code> instance.
*
@@ -88,6 +75,14 @@
public boolean matches(final Object object) {
return this.matches;
}
+
+ public boolean isAssignableFrom(Object object) {
+ return this.matches;
+ }
+
+ public boolean isAssignableFrom(ObjectType objectType) {
+ return this.matches;
+ }
public ValueType getValueType() {
return ValueType.OBJECT_TYPE;
More information about the jboss-svn-commits
mailing list