[jboss-svn-commits] JBL Code SVN: r17492 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/ruleflow/instance/impl and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jan 2 07:49:48 EST 2008


Author: mark.proctor at jboss.com
Date: 2008-01-02 07:49:48 -0500 (Wed, 02 Jan 2008)
New Revision: 17492

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/CreateNewNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ReuseNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ConfFileUtils.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/EndNodeInstanceImplTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNode.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstanceFactory.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/StartNodeInstanceImplTest.java
   labs/jbossrules/trunk/drools-core/src/test/resources/META-INF/
   labs/jbossrules/trunk/drools-core/src/test/resources/META-INF/mockProcessNodeInstanceFactory.conf
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ActionNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/EndNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/JoinNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/MilestoneNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SplitNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/StartNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SubFlowNodeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/TaskNodeConf.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java
Log:
JBRULES-1394 RuleFlow Nodes should be pluggable
-PackageBuilder node builders are now pluggable, although not yet discoverable
-RuleBase node instance factories and pluggeable and discoverable
-added unit tests for start and end nodes

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2008-01-02 12:49:25 UTC (rev 17491)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -22,15 +22,22 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Map.Entry;
 
 import org.drools.common.AgendaGroupFactory;
 import org.drools.common.ArrayAgendaGroupFactory;
 import org.drools.common.PriorityQueueAgendaGroupFactory;
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactory;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactoryRegistry;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactoryTest;
 import org.drools.spi.ConflictResolver;
 import org.drools.spi.ConsequenceExceptionHandler;
 import org.drools.temporal.SessionClock;
 import org.drools.temporal.SessionPseudoClock;
 import org.drools.util.ChainedProperties;
+import org.drools.util.ConfFileUtils;
+import org.mvel.MVEL;
 
 /**
  * RuleBaseConfiguration
@@ -73,39 +80,41 @@
 public class RuleBaseConfiguration
     implements
     Serializable {
-    private static final long              serialVersionUID = 400L;
+    private static final long                  serialVersionUID = 400L;
 
-    private ChainedProperties              chainedProperties;
+    private ChainedProperties                  chainedProperties;
 
-    private boolean                        immutable;
+    private boolean                            immutable;
 
-    private boolean                        sequential;
-    private SequentialAgenda               sequentialAgenda;
+    private boolean                            sequential;
+    private SequentialAgenda                   sequentialAgenda;
 
-    private boolean                        maintainTms;
-    private boolean                        removeIdentities;
-    private boolean                        shareAlphaNodes;
-    private boolean                        shareBetaNodes;
-    private boolean                        alphaMemory;
-    private int                            alphaNodeHashingThreshold;
-    private int                            compositeKeyDepth;
-    private boolean                        indexLeftBetaMemory;
-    private boolean                        indexRightBetaMemory;
-    private AssertBehaviour                assertBehaviour;
-    private LogicalOverride                logicalOverride;
-    private String                         executorService;
-    private ConsequenceExceptionHandler    consequenceExceptionHandler;
-    private String                         ruleBaseUpdateHandler;
-    private Class< ? extends SessionClock> sessionClockClass;
+    private boolean                            maintainTms;
+    private boolean                            removeIdentities;
+    private boolean                            shareAlphaNodes;
+    private boolean                            shareBetaNodes;
+    private boolean                            alphaMemory;
+    private int                                alphaNodeHashingThreshold;
+    private int                                compositeKeyDepth;
+    private boolean                            indexLeftBetaMemory;
+    private boolean                            indexRightBetaMemory;
+    private AssertBehaviour                    assertBehaviour;
+    private LogicalOverride                    logicalOverride;
+    private String                             executorService;
+    private ConsequenceExceptionHandler        consequenceExceptionHandler;
+    private String                             ruleBaseUpdateHandler;
+    private Class< ? extends SessionClock>     sessionClockClass;
 
-    private ConflictResolver               conflictResolver;
+    private ConflictResolver                   conflictResolver;
 
-    private boolean                        shadowProxy;
-    private Map                            shadowProxyExcludes;
-    private static final String            STAR             = "*";
+    private boolean                            shadowProxy;
+    private Map                                shadowProxyExcludes;
+    private static final String                STAR             = "*";
 
-    private transient ClassLoader          classLoader;
+    private ProcessNodeInstanceFactoryRegistry processNodeInstanceFactoryRegistry;
 
+    private transient ClassLoader              classLoader;
+
     /**
      * Creates a new rulebase configuration using the provided properties
      * as configuration options. Also, if a Thread.currentThread().getContextClassLoader()
@@ -468,6 +477,56 @@
         this.sequentialAgenda = sequentialAgenda;
     }
 
+    public ProcessNodeInstanceFactoryRegistry getProcessNodeInstanceFactoryRegistry() {
+        if ( this.processNodeInstanceFactoryRegistry == null ) {
+            initProcessNodeInstanceFactoryRegistry();
+        }
+        return this.processNodeInstanceFactoryRegistry;
+
+    }
+
+    private void initProcessNodeInstanceFactoryRegistry() {
+        this.processNodeInstanceFactoryRegistry = new ProcessNodeInstanceFactoryRegistry();
+
+        // split on each space
+        String locations[] = this.chainedProperties.getProperty( "processNodeInstanceFactoryRegistry",
+                                                                 "" ).split( "\\s" );
+
+        int i = 0;
+        // load each SemanticModule
+        for ( String factoryLocation : locations ) {
+            // trim leading/trailing spaces and quotes
+            factoryLocation = factoryLocation.trim();
+            if ( factoryLocation.startsWith( "\"" ) ) {
+                factoryLocation = factoryLocation.substring( 1 );
+            }
+            if ( factoryLocation.endsWith( "\"" ) ) {
+                factoryLocation = factoryLocation.substring( 0,
+                                                             factoryLocation.length() - 1 );
+            }
+            if ( !factoryLocation.equals( "" ) ) {
+                loadProcessNodeInstanceFactoryRegistry( factoryLocation );
+            }
+        }
+    }
+
+    private void loadProcessNodeInstanceFactoryRegistry(String factoryLocation) {
+        String content = ConfFileUtils.URLContentsToString( ConfFileUtils.getURL( factoryLocation,
+                                                                                  null,
+                                                                                  RuleBaseConfiguration.class ) );
+        
+        Map<Class< ? extends Node>, ProcessNodeInstanceFactory> map = (Map<Class< ? extends Node>, ProcessNodeInstanceFactory>) MVEL.eval( content,
+                                                                                                                                           new HashMap() );
+
+        if ( map != null ) {
+            for ( Entry<Class< ? extends Node>, ProcessNodeInstanceFactory> entry : map.entrySet() ) {
+                this.processNodeInstanceFactoryRegistry.register( entry.getKey(),
+                                                                  entry.getValue() );
+            }
+        }
+
+    }
+
     private boolean determineShadowProxy(String userValue) {
         if ( this.isSequential() ) {
             // sequential never needs shadowing, so always override

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactory.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,8 @@
+package org.drools.ruleflow.instance.impl;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+
+public interface ProcessNodeInstanceFactory {
+	RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryRegistry.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryRegistry.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,61 @@
+package org.drools.ruleflow.instance.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.WorkItemNode;
+import org.drools.ruleflow.core.impl.ActionNodeImpl;
+import org.drools.ruleflow.core.impl.EndNodeImpl;
+import org.drools.ruleflow.core.impl.JoinImpl;
+import org.drools.ruleflow.core.impl.MilestoneNodeImpl;
+import org.drools.ruleflow.core.impl.RuleSetNodeImpl;
+import org.drools.ruleflow.core.impl.SplitImpl;
+import org.drools.ruleflow.core.impl.StartNodeImpl;
+import org.drools.ruleflow.core.impl.SubFlowNodeImpl;
+import org.drools.ruleflow.instance.impl.factories.CreateNewNodeFactory;
+import org.drools.ruleflow.instance.impl.factories.ReuseNodeFactory;
+import org.drools.ruleflow.instance.impl.factories.RuleSetNodeFactory;
+import org.drools.util.ConfFileUtils;
+import org.mvel.MVEL;
+
+public class ProcessNodeInstanceFactoryRegistry {
+    public static final ProcessNodeInstanceFactoryRegistry          instance = new ProcessNodeInstanceFactoryRegistry();
+
+    private Map<Class< ? extends Node>, ProcessNodeInstanceFactory> registry;
+
+    public ProcessNodeInstanceFactoryRegistry() {
+        this.registry = new HashMap<Class< ? extends Node>, ProcessNodeInstanceFactory>();
+
+        // hard wired nodes:
+        register( RuleSetNodeImpl.class,
+                  new RuleSetNodeFactory() );
+        register( SplitImpl.class,
+                  new ReuseNodeFactory( RuleFlowSplitInstanceImpl.class ) );
+        register( JoinImpl.class,
+                  new ReuseNodeFactory( RuleFlowJoinInstanceImpl.class ) );
+        register( StartNodeImpl.class,
+                  new ReuseNodeFactory( StartNodeInstanceImpl.class ) );
+        register( EndNodeImpl.class,
+                  new CreateNewNodeFactory( EndNodeInstanceImpl.class ) );
+        register( MilestoneNodeImpl.class,
+                  new CreateNewNodeFactory( MilestoneNodeInstanceImpl.class ) );
+        register( SubFlowNodeImpl.class,
+                  new CreateNewNodeFactory( SubFlowNodeInstanceImpl.class ) );
+        register( ActionNodeImpl.class,
+                  new CreateNewNodeFactory( ActionNodeInstanceImpl.class ) );
+        register( WorkItemNode.class,
+                  new CreateNewNodeFactory( TaskNodeInstanceImpl.class ) );
+    }
+
+    public void register(Class< ? extends Node> cls,
+                         ProcessNodeInstanceFactory factory) {
+        this.registry.put( cls,
+                           factory );
+    }
+
+    public ProcessNodeInstanceFactory getRuleFlowNodeFactory(Node node) {
+        return this.registry.get( node.getClass() );
+    }
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeConf.java	2008-01-02 12:49:25 UTC (rev 17491)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,8 +0,0 @@
-package org.drools.ruleflow.instance.impl;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-
-public interface PvmNodeConf {
-	RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance);
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeRegistry.java	2008-01-02 12:49:25 UTC (rev 17491)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/PvmNodeRegistry.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,22 +0,0 @@
-package org.drools.ruleflow.instance.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.ruleflow.core.Node;
-
-public class PvmNodeRegistry {
-	private Map<Class<? extends Node>, PvmNodeConf> registry;
-	
-	public PvmNodeRegistry() {
-		this.registry = new HashMap<Class<? extends Node>, PvmNodeConf>();
-	}
-	
-	public void  register(Class<? extends Node> cls, PvmNodeConf conf) {
-		this.registry.put(cls, conf);
-	}
-	
-	public PvmNodeConf getRuleFlowNodeConf(Node node) {
-		return this.registry.get( node.getClass() );
-	}
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowProcessInstanceImpl.java	2008-01-02 12:49:25 UTC (rev 17491)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowProcessInstanceImpl.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -19,8 +19,11 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.drools.Agenda;
 import org.drools.WorkingMemory;
@@ -54,9 +57,11 @@
 import org.drools.ruleflow.core.impl.SubFlowNodeImpl;
 import org.drools.ruleflow.instance.RuleFlowNodeInstance;
 import org.drools.ruleflow.instance.RuleFlowProcessInstance;
-import org.drools.ruleflow.instance.impl.configuration.CreateNewNodeConf;
-import org.drools.ruleflow.instance.impl.configuration.ReuseNodeConf;
-import org.drools.ruleflow.instance.impl.configuration.RuleSetNodeConf;
+import org.drools.ruleflow.instance.impl.factories.CreateNewNodeFactory;
+import org.drools.ruleflow.instance.impl.factories.ReuseNodeFactory;
+import org.drools.ruleflow.instance.impl.factories.RuleSetNodeFactory;
+import org.drools.util.ConfFileUtils;
+import org.mvel.MVEL;
 
 /**
  * Default implementation of a RuleFlow process instance.
@@ -69,10 +74,11 @@
     AgendaEventListener,
     RuleFlowEventListener {
 
-    private static final long     serialVersionUID = 400L;
+    private static final long                  serialVersionUID = 400L;
 
-    private InternalWorkingMemory workingMemory;
-    private final List            nodeInstances    = new ArrayList();
+    private InternalWorkingMemory              workingMemory;
+    private final List                         nodeInstances    = new ArrayList();
+    private ProcessNodeInstanceFactoryRegistry nodeRegistry;
 
     public RuleFlowProcess getRuleFlowProcess() {
         return (RuleFlowProcess) getProcess();
@@ -120,42 +126,21 @@
     public WorkingMemory getWorkingMemory() {
         return this.workingMemory;
     }
-
-    private static PvmNodeRegistry nodeRegistry = new PvmNodeRegistry();
-    static {
-        //    	nodeRegistry.register(RuleSetNodeImpl.class, new RuleSetNodeConf() );
-        //    	nodeRegistry.register(SplitImpl.class, new SplitNodeConf() );
-        //    	nodeRegistry.register(JoinImpl.class, new JoinNodeConf() );
-        //    	nodeRegistry.register(StartNodeImpl.class, new StartNodeConf() );
-        //    	nodeRegistry.register(EndNodeImpl.class, new EndNodeConf() );
-        //    	nodeRegistry.register(MilestoneNodeImpl.class, new MilestoneNodeConf() );    	    
-        //    	nodeRegistry.register(SubFlowNodeImpl.class, new SubFlowNodeConf() );
-        //    	nodeRegistry.register(ActionNodeImpl.class, new ActionNodeConf() );
-        //    	nodeRegistry.register(WorkItemNode.class, new TaskNodeConf() );
-
-        nodeRegistry.register( RuleSetNodeImpl.class,
-                               new RuleSetNodeConf() );
-        nodeRegistry.register( SplitImpl.class,
-                               new ReuseNodeConf( RuleFlowSplitInstanceImpl.class ) );
-        nodeRegistry.register( JoinImpl.class,
-                               new ReuseNodeConf( RuleFlowJoinInstanceImpl.class ) );
-        nodeRegistry.register( StartNodeImpl.class,
-                               new CreateNewNodeConf( StartNodeInstanceImpl.class ) );
-        nodeRegistry.register( EndNodeImpl.class,
-                               new CreateNewNodeConf( EndNodeInstanceImpl.class ) );
-        nodeRegistry.register( MilestoneNodeImpl.class,
-                               new CreateNewNodeConf( MilestoneNodeInstanceImpl.class ) );
-        nodeRegistry.register( SubFlowNodeImpl.class,
-                               new CreateNewNodeConf( SubFlowNodeInstanceImpl.class ) );
-        nodeRegistry.register( ActionNodeImpl.class,
-                               new CreateNewNodeConf( ActionNodeInstanceImpl.class ) );
-        nodeRegistry.register( WorkItemNode.class,
-                               new CreateNewNodeConf( TaskNodeInstanceImpl.class ) );
-
+    
+    public void registerNodeInstanceFactory(Class<? extends Node> cls, ProcessNodeInstanceFactory factory) {
+        if ( this.nodeRegistry == null ) {
+            this.nodeRegistry = new ProcessNodeInstanceFactoryRegistry();
+        }
+        
+        this.nodeRegistry.register( cls, factory );
     }
 
     public RuleFlowNodeInstance getNodeInstance(final Node node) {
-        PvmNodeConf conf = this.nodeRegistry.getRuleFlowNodeConf( node );
+        if ( this.nodeRegistry == null ) {
+            this.nodeRegistry = new ProcessNodeInstanceFactoryRegistry();
+        }
+        
+        ProcessNodeInstanceFactory conf = this.nodeRegistry.getRuleFlowNodeFactory( node );
         if ( conf == null ) {
             throw new IllegalArgumentException( "Illegal node type: " + node.getClass() );
         }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories (from rev 17419, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration)

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ActionNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/ActionNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ActionNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,24 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.ActionNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.MilestoneNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.SubFlowNodeInstanceImpl;
-
-public class ActionNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new ActionNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;
-	}
-
-}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/CreateNewNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/CreateNewNodeFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/CreateNewNodeFactory.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,34 @@
+package org.drools.ruleflow.instance.impl.factories;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.RuleSetNode;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+import org.drools.ruleflow.instance.impl.ActionNodeInstanceImpl;
+import org.drools.ruleflow.instance.impl.MilestoneNodeInstanceImpl;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactory;
+import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
+import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
+import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
+import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
+import org.drools.ruleflow.instance.impl.SubFlowNodeInstanceImpl;
+
+public class CreateNewNodeFactory implements ProcessNodeInstanceFactory {
+    public final Class<? extends RuleFlowNodeInstance> cls;
+    
+    public CreateNewNodeFactory(Class<? extends RuleFlowNodeInstance> cls){
+        this.cls = cls;
+    }
+    
+	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
+        RuleFlowNodeInstance result;
+        try {
+            result = this.cls.newInstance();
+        } catch ( Exception e ) {
+            throw new RuntimeException("Unable  to instance RuleFlow Node: '" + this.cls.getName() );
+        }
+        result.setNodeId( node.getId() );
+        processInstance.addNodeInstance( result );
+        return result;
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/EndNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/EndNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/EndNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,22 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.EndNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-
-public class EndNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new EndNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;
-	}
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/JoinNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/JoinNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/JoinNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,23 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-
-public class JoinNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        RuleFlowNodeInstance result = processInstance.getFirstNodeInstance( node.getId() );
-        if ( result == null ) {
-            result = new RuleFlowJoinInstanceImpl();
-            result.setNodeId( node.getId() );
-            processInstance.addNodeInstance( result );
-        }
-        return result;		
-	}
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/MilestoneNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/MilestoneNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/MilestoneNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,22 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.MilestoneNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-
-public class MilestoneNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new MilestoneNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;
-	}
-
-}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ReuseNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ReuseNodeFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/ReuseNodeFactory.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,32 @@
+package org.drools.ruleflow.instance.impl.factories;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactory;
+import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
+
+public class ReuseNodeFactory implements ProcessNodeInstanceFactory {
+    public final Class<? extends RuleFlowNodeInstance> cls;
+    
+    public ReuseNodeFactory(Class<? extends RuleFlowNodeInstance> cls){
+        this.cls = cls;
+//        if ( RuleFlowNodeInstance.class.isAssignableFrom( this.cls ) ) {
+//            throw new IllegalArgumentException("Node must be of the type RuleFlowNodeInstance." );
+//        }
+    }
+
+	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	
+        RuleFlowNodeInstance result = processInstance.getFirstNodeInstance( node.getId() );
+        if ( result == null ) {
+            try {
+                result = ( RuleFlowNodeInstance ) cls.newInstance();
+            } catch ( Exception e ) {
+                throw new RuntimeException("Unable  to instance RuleFlow Node: '" + this.cls.getName() );
+            }
+            result.setNodeId( node.getId() );
+            processInstance.addNodeInstance( result );
+        }
+        return result;    	
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/RuleSetNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,18 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-
-public class RuleSetNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {
-        final RuleFlowNodeInstance result = (RuleFlowNodeInstance) processInstance.getAgenda().getRuleFlowGroup( ((RuleSetNode) node).getRuleFlowGroup() );
-    	result.setNodeId( node.getId() );
-    	processInstance.addNodeInstance( result );
-    	return result;
-	}
-
-}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/RuleSetNodeFactory.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,18 @@
+package org.drools.ruleflow.instance.impl.factories;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.RuleSetNode;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactory;
+import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
+
+public class RuleSetNodeFactory implements ProcessNodeInstanceFactory {
+
+	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {
+        final RuleFlowNodeInstance result = (RuleFlowNodeInstance) processInstance.getAgenda().getRuleFlowGroup( ((RuleSetNode) node).getRuleFlowGroup() );
+    	result.setNodeId( node.getId() );
+    	processInstance.addNodeInstance( result );
+    	return result;
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SplitNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/SplitNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SplitNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,22 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-
-public class SplitNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	
-        RuleFlowNodeInstance result = processInstance.getFirstNodeInstance( node.getId() );
-        if ( result == null ) {
-            result = new RuleFlowSplitInstanceImpl();
-            result.setNodeId( node.getId() );
-            processInstance.addNodeInstance( result );
-        }
-        return result;    	
-	}
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/StartNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/StartNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/StartNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,21 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-
-public class StartNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new StartNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;	
-	}
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SubFlowNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/SubFlowNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/SubFlowNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,23 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.MilestoneNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.SubFlowNodeInstanceImpl;
-
-public class SubFlowNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new SubFlowNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;
-	}
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/TaskNodeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/configuration/TaskNodeConf.java	2007-12-27 21:13:54 UTC (rev 17419)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/factories/TaskNodeConf.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -1,24 +0,0 @@
-package org.drools.ruleflow.instance.impl.configuration;
-
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleSetNode;
-import org.drools.ruleflow.instance.RuleFlowNodeInstance;
-import org.drools.ruleflow.instance.impl.MilestoneNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.PvmNodeConf;
-import org.drools.ruleflow.instance.impl.RuleFlowJoinInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowProcessInstanceImpl;
-import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
-import org.drools.ruleflow.instance.impl.StartNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.SubFlowNodeInstanceImpl;
-import org.drools.ruleflow.instance.impl.TaskNodeInstanceImpl;
-
-public class TaskNodeConf implements PvmNodeConf {
-
-	public RuleFlowNodeInstance getNodeInstance(Node node, RuleFlowProcessInstanceImpl processInstance ) {    	  	
-        final RuleFlowNodeInstance result = new TaskNodeInstanceImpl();
-        result.setNodeId( node.getId() );
-        processInstance.addNodeInstance( result );
-        return result;
-	}
-
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java	2008-01-02 12:49:25 UTC (rev 17491)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ClassUtils.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -7,7 +7,7 @@
 
 public final class ClassUtils {
     private static Map classes = Collections.synchronizedMap( new HashMap() );
-    
+
     /**
      * Please do not use - internal
      * org/my/Class.xxx -> org.my.Class
@@ -62,49 +62,94 @@
         final String relFileName = absFileName.substring( rootLength + 1 );
         return relFileName;
     }
-    
-    public static String canonicalName( Class clazz ) {
+
+    public static String canonicalName(Class clazz) {
         StringBuffer name = new StringBuffer();
-        
-        if( clazz.isArray() ) {
+
+        if ( clazz.isArray() ) {
             name.append( canonicalName( clazz.getComponentType() ) );
             name.append( "[]" );
-        } else if( clazz.getDeclaringClass() == null ) {
+        } else if ( clazz.getDeclaringClass() == null ) {
             name.append( clazz.getName() );
         } else {
             name.append( canonicalName( clazz.getDeclaringClass() ) );
             name.append( "." );
             name.append( clazz.getName().substring( clazz.getDeclaringClass().getName().length() + 1 ) );
         }
-        
+
         return name.toString();
     }
-    
-    
+
+    public static Object instantiateObject(String className) {
+        return instantiateObject( className,
+                                  null );
+    }
+
     /**
      * This method will attempt to create an instance of the specified Class. It uses
      * a syncrhonized HashMap to cache the reflection Class lookup.
      * @param className
      * @return
      */
-    public static Object instantiateObject(String className) {
+    public static Object instantiateObject(String className,
+                                           ClassLoader classLoader) {
         Class cls = (Class) ClassUtils.classes.get( className );
         if ( cls == null ) {
             try {
                 cls = Class.forName( className );
-                ClassUtils.classes.put(  className, cls );
-            } catch ( Throwable e ) {
-                throw new RuntimeException("Unable to load class '" + className + "'", e );
-            }            
+            } catch ( Exception e ) {
+                //swallow
+            }
+
+            //ConfFileFinder
+            if ( cls == null && classLoader != null ) {
+                try {
+                    cls = classLoader.loadClass( className );
+                } catch ( Exception e ) {
+                    //swallow
+                }
+            }
+
+            if ( cls == null ) {
+                try {
+                    cls = ClassUtils.class.getClassLoader().loadClass( className );
+                } catch ( Exception e ) {
+                    //swallow
+                }
+            }
+
+            if ( cls == null ) {
+                try {
+                    cls = Thread.currentThread().getContextClassLoader().loadClass( className );
+                } catch ( Exception e ) {
+                    //swallow
+                }
+            }
+
+            if ( cls == null ) {
+                try {
+                    cls = ClassLoader.getSystemClassLoader().loadClass( className );
+                } catch ( Exception e ) {
+                    //swallow
+                }
+            }
+            
+            if ( cls != null ) {
+                ClassUtils.classes.put( className,
+                                        cls );
+            } else {
+                throw new RuntimeException( "Unable to load class '" + className + "'" );
+            }
         }
-        
+
         Object object = null;
         try {
-            object = cls.newInstance();            
+            object = cls.newInstance();
         } catch ( Throwable e ) {
-            throw new RuntimeException("Unable to instantiate object for class '" + className + "'", e );
-        }  
+            throw new RuntimeException( "Unable to instantiate object for class '" + className + "'",
+                                        e );
+        }
         return object;
-    }    
+    }
 
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ConfFileUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ConfFileUtils.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ConfFileUtils.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,149 @@
+/**
+ * 
+ */
+package org.drools.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.drools.ruleflow.instance.impl.ProcessNodeInstanceFactoryTest;
+
+public class ConfFileUtils {
+   
+    /**
+     * Return the URL for a given conf file
+     * @param confName
+     * @param classLoader
+     * @return
+     */
+    public static URL getURL(String confName, ClassLoader classLoader, Class cls) {
+        URL url = null;
+        
+        // User home 
+        String userHome = System.getProperty( "user.home" );
+        if ( userHome.endsWith( "\\" ) || userHome.endsWith( "/" ) ) {
+            url = getURLForFile( userHome + confName );
+        } else {
+            url = getURLForFile( userHome + "/" + confName );
+        }
+
+        // Working directory             
+        if ( url == null ) {
+            url = getURLForFile( confName );
+        }
+        
+        // check Class folder
+        if ( cls != null ) {
+            url = cls.getResource( confName );
+        }
+
+        // check META-INF directories for all known ClassLoaders
+        if ( url == null && classLoader != null ) {
+            ClassLoader confClassLoader = classLoader;
+            if ( confClassLoader != null ) {
+                url = confClassLoader.getResource( "META-INF/" + confName );
+            }
+        }
+
+        if ( url == null ) {
+            ClassLoader confClassLoader = ConfFileUtils.class.getClassLoader();
+            if ( confClassLoader != null && confClassLoader != classLoader ) {
+                url = confClassLoader.getResource( "META-INF/" + confName );
+            }
+        }
+        
+        if ( url == null && cls != null ) {
+            ClassLoader confClassLoader = cls.getClassLoader();
+            if ( confClassLoader != null && confClassLoader != classLoader ) {
+                url = confClassLoader.getResource( "META-INF/" + confName );
+            }
+        }        
+
+        if ( url == null ) {
+            ClassLoader confClassLoader = Thread.currentThread().getContextClassLoader();
+            if ( confClassLoader != null && confClassLoader != classLoader ) {
+                url = confClassLoader.getResource( "META-INF/" + confName );
+            }
+        }
+
+        if ( url == null ) {
+            ClassLoader confClassLoader = ClassLoader.getSystemClassLoader();
+            if ( confClassLoader != null && confClassLoader != classLoader ) {
+                url = confClassLoader.getResource( "META-INF/" + confName );
+            }
+        }
+
+        return url;          
+    }
+    
+    /**
+     * Return URL for given filename
+     * 
+     * @param fileName
+     * @return
+     *  URL
+     */
+    public static URL getURLForFile(String fileName) {
+        URL url = null;
+        if ( fileName != null ) {
+            File file = new File( fileName );
+            if ( file != null && file.exists() ) {
+                try {
+                    url = file.toURL();
+                } catch ( MalformedURLException e ) {
+                    throw new IllegalArgumentException( "file.toURL() failed for '" + file + "'" );
+                }
+            } 
+        }
+        return url;
+    }     
+    
+    public static String URLContentsToString(URL url) {
+        StringBuilder builder = new StringBuilder();
+        if ( url == null ) {
+            return null;
+        }
+        
+        try {
+            BufferedReader reader = new BufferedReader(new InputStreamReader( url.openStream() ));
+            String line = null;
+        
+            while ( ( line = reader.readLine() ) != null ) { // while loop begins here
+                builder.append( line );
+                builder.append( "\n" );
+            }
+        } catch ( IOException e ) {
+            throw new RuntimeException( "Unable to read " + url.toExternalForm() );
+        }        
+        return builder.toString();
+    }
+    
+    /**
+     * Load a Properties file from a URL, return null if it fails
+     * 
+     * @param url
+     * @return
+     *  URL
+     */
+    public static Properties getProperties(URL url) {
+        if ( url == null ) {
+            return null;
+        }
+        
+        Properties properties = new Properties();
+        try {
+            properties.load( url.openStream() );
+        } catch ( IOException e ) {
+            //swallow, as we'll return null
+            return null;
+        }       
+        
+        return properties;
+    }
+                   
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/EndNodeInstanceImplTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/EndNodeInstanceImplTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/EndNodeInstanceImplTest.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,53 @@
+package org.drools.ruleflow.instance.impl;
+
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.ruleflow.common.core.impl.ProcessImpl;
+import org.drools.ruleflow.common.instance.ProcessInstance;
+import org.drools.ruleflow.core.Connection;
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.impl.ConnectionImpl;
+import org.drools.ruleflow.core.impl.EndNodeImpl;
+import org.drools.ruleflow.core.impl.NodeImpl;
+import org.drools.ruleflow.core.impl.RuleFlowProcessImpl;
+import org.drools.ruleflow.core.impl.StartNodeImpl;
+
+import junit.framework.TestCase;
+
+public class EndNodeInstanceImplTest extends TestCase {
+    public void testStartNode() {
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        StatefulSession session = ruleBase.newStatefulSession();        
+        
+        NodeImpl mockNode = new NodeImpl()  { };        
+        
+        RuleFlowProcessImpl process = new RuleFlowProcessImpl(); 
+        
+        Node endNode = new  EndNodeImpl();  
+        endNode.setId( 1 );
+        endNode.setName( "end node" );        
+                            
+        mockNode.setId( 2 );
+        new ConnectionImpl(mockNode, endNode, Connection.TYPE_NORMAL);
+        
+        process.addNode( mockNode );
+        process.addNode( endNode );
+                
+        RuleFlowProcessInstanceImpl processInstance = new RuleFlowProcessInstanceImpl();   
+        processInstance.setState( ProcessInstance.STATE_ACTIVE );
+        processInstance.setProcess( process );
+        processInstance.setWorkingMemory( (InternalWorkingMemory) session );
+        
+        
+        MockNodeInstanceFactory factory = new MockNodeInstanceFactory( new MockNodeInstance( mockNode ) );
+        processInstance.registerNodeInstanceFactory( mockNode.getClass(), factory );
+        
+        MockNodeInstance mockNodeInstance = ( MockNodeInstance ) processInstance.getNodeInstance( mockNode );
+        
+        mockNodeInstance.trigger( null );
+        assertEquals( ProcessInstance.STATE_COMPLETED, processInstance.getState() );                               
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNode.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,9 @@
+package org.drools.ruleflow.instance.impl;
+
+import org.drools.ruleflow.core.impl.NodeImpl;
+
+public class MockNode extends NodeImpl {
+    public MockNode() {
+        
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstance.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,53 @@
+/**
+ * 
+ */
+package org.drools.ruleflow.instance.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.ruleflow.core.impl.ConnectionImpl;
+import org.drools.ruleflow.core.impl.NodeImpl;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+
+public class MockNodeInstance extends RuleFlowNodeInstanceImpl {
+    private List list = new ArrayList();
+    
+    private NodeImpl node;
+    
+    public MockNodeInstance(NodeImpl node) {
+        this.node = node;
+    }
+    
+    public NodeImpl getNode() {
+        return this.node;
+    }
+    
+    public void internalTrigger(RuleFlowNodeInstance from) {
+        this.list.add( from );    
+        triggerCompleted();
+    }
+    
+    public List getList() {
+        return this.list;
+    }      
+    
+    public int hashCode() {
+        return (int) this.node.getId();
+    }
+    
+    public boolean equals(Object object) {
+        if ( object == null || (!( object instanceof MockNodeInstance ) )) {
+            return false;
+        }
+        
+        MockNodeInstance other = ( MockNodeInstance ) object;
+        return getNode().getId() == other.getNode().getId();
+    }        
+    
+    public void triggerCompleted() {
+        
+        getProcessInstance().getNodeInstance( ((ConnectionImpl) this.node.getOutgoingConnections().get( 0 )).getTo() ).trigger( this );
+        getProcessInstance().removeNodeInstance(this);
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstanceFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/MockNodeInstanceFactory.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,26 @@
+/**
+ * 
+ */
+package org.drools.ruleflow.instance.impl;
+
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.instance.RuleFlowNodeInstance;
+
+public class MockNodeInstanceFactory implements ProcessNodeInstanceFactory {
+    private MockNodeInstance instance;
+    
+    public MockNodeInstanceFactory(MockNodeInstance instance) {
+        this.instance = instance;
+    }
+    
+    public MockNodeInstance getMockNodeInstance() {
+        return this.instance;
+    }
+
+    public RuleFlowNodeInstance getNodeInstance(Node node,
+                                                RuleFlowProcessInstanceImpl processInstance) {
+        this.instance.setNodeId( node.getId() );
+        processInstance.addNodeInstance( this.instance );            
+        return instance;
+    }        
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/ProcessNodeInstanceFactoryTest.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,32 @@
+package org.drools.ruleflow.instance.impl;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBaseConfiguration;
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.impl.ActionNodeImpl;
+import org.drools.ruleflow.instance.impl.factories.CreateNewNodeFactory;
+
+public class ProcessNodeInstanceFactoryTest extends TestCase {
+    
+    public void testDefaultEntries() throws Exception {
+        RuleBaseConfiguration conf = new RuleBaseConfiguration();
+        
+        ProcessNodeInstanceFactoryRegistry registry = conf.getProcessNodeInstanceFactoryRegistry();
+        Node node = new ActionNodeImpl();
+        assertEquals( CreateNewNodeFactory.class, registry.getRuleFlowNodeFactory( node ).getClass() );       
+    }
+    
+    public void testDiscoveredEntry() {
+        Properties properties = new Properties(); 
+        properties.put( "processNodeInstanceFactoryRegistry", "mockProcessNodeInstanceFactory.conf" );        
+        
+        RuleBaseConfiguration conf = new RuleBaseConfiguration( properties );
+        
+        ProcessNodeInstanceFactoryRegistry registry = conf.getProcessNodeInstanceFactoryRegistry();
+        
+        assertEquals( MockNodeInstanceFactory.class, registry.getRuleFlowNodeFactory( new MockNode() ).getClass() );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/StartNodeInstanceImplTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/StartNodeInstanceImplTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/ruleflow/instance/impl/StartNodeInstanceImplTest.java	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,52 @@
+package org.drools.ruleflow.instance.impl;
+
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.ruleflow.common.instance.ProcessInstance;
+import org.drools.ruleflow.core.Connection;
+import org.drools.ruleflow.core.Node;
+import org.drools.ruleflow.core.impl.ConnectionImpl;
+import org.drools.ruleflow.core.impl.NodeImpl;
+import org.drools.ruleflow.core.impl.RuleFlowProcessImpl;
+import org.drools.ruleflow.core.impl.StartNodeImpl;
+
+import junit.framework.TestCase;
+
+public class StartNodeInstanceImplTest extends TestCase {
+    public void testStartNode() {
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        StatefulSession session = ruleBase.newStatefulSession();        
+        
+        NodeImpl mockNode = new NodeImpl()  { };        
+        
+        RuleFlowProcessImpl process = new RuleFlowProcessImpl(); 
+        
+        Node startNode = new  StartNodeImpl();  
+        startNode.setId( 1 );
+        startNode.setName( "start node" );        
+                            
+        mockNode.setId( 2 );
+        new ConnectionImpl(startNode, mockNode, Connection.TYPE_NORMAL);
+        
+        process.addNode( startNode );
+        process.addNode( mockNode );
+                
+        RuleFlowProcessInstanceImpl processInstance = new RuleFlowProcessInstanceImpl();   
+        processInstance.setProcess( process );
+        processInstance.setWorkingMemory( (InternalWorkingMemory) session );
+        
+        
+        MockNodeInstanceFactory factory = new MockNodeInstanceFactory( new MockNodeInstance( mockNode ) );
+        processInstance.registerNodeInstanceFactory( mockNode.getClass(), factory );                
+        
+        assertEquals(  ProcessInstance.STATE_PENDING, processInstance.getState() );
+        processInstance.start();        
+        assertEquals(  ProcessInstance.STATE_ACTIVE, processInstance.getState() );
+        
+        MockNodeInstance nodeInstance = factory.getMockNodeInstance();
+        assertSame( startNode, ((RuleFlowNodeInstanceImpl) nodeInstance.getList().get( 0  )).getNode() );                       
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/test/resources/META-INF/mockProcessNodeInstanceFactory.conf
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/resources/META-INF/mockProcessNodeInstanceFactory.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/resources/META-INF/mockProcessNodeInstanceFactory.conf	2008-01-02 12:49:48 UTC (rev 17492)
@@ -0,0 +1,8 @@
+// we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
+import org.drools.ruleflow.instance.impl.MockNode;       
+import org.drools.ruleflow.instance.impl.MockNodeInstance;
+import org.drools.ruleflow.instance.impl.MockNodeInstanceFactory;
+
+[
+    MockNode : new MockNodeInstanceFactory(  new MockNodeInstance(  new MockNode() ) )
+]




More information about the jboss-svn-commits mailing list