[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