[jboss-svn-commits] JBL Code SVN: r20152 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: audit and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat May 24 09:50:56 EDT 2008


Author: KrisVerlaenen
Date: 2008-05-24 09:50:56 -0400 (Sat, 24 May 2008)
New Revision: 20152

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ProcessEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/variable/Mappable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactoryRegistry.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEvent.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowCompletedEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowNodeTriggeredEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowStartedEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeContainerImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/JoinInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java
Log:
JBRULES-1622: SubProcess node should support variable mapping and independence 
 - adding in both core and IDE

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-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -34,10 +33,13 @@
 import org.drools.common.PriorityQueueAgendaGroupFactory;
 import org.drools.process.core.Context;
 import org.drools.process.core.ParameterDefinition;
+import org.drools.process.core.Process;
 import org.drools.process.core.WorkDefinition;
 import org.drools.process.core.datatype.DataType;
 import org.drools.process.core.impl.ParameterDefinitionImpl;
 import org.drools.process.core.impl.WorkDefinitionExtensionImpl;
+import org.drools.process.instance.ProcessInstanceFactory;
+import org.drools.process.instance.ProcessInstanceFactoryRegistry;
 import org.drools.process.instance.impl.ContextInstanceFactory;
 import org.drools.process.instance.impl.ContextInstanceFactoryRegistry;
 import org.drools.spi.ConflictResolver;
@@ -128,6 +130,7 @@
     private ContextInstanceFactoryRegistry processContextInstanceFactoryRegistry;
     private Map<String, WorkDefinition> workDefinitions;
 
+    private ProcessInstanceFactoryRegistry processInstanceFactoryRegistry;
     private NodeInstanceFactoryRegistry    processNodeInstanceFactoryRegistry;
 
     private transient ClassLoader          classLoader;
@@ -584,6 +587,55 @@
         }
     }
 
+    public ProcessInstanceFactoryRegistry getProcessInstanceFactoryRegistry() {
+        if ( this.processInstanceFactoryRegistry == null ) {
+            initProcessInstanceFactoryRegistry();
+        }
+        return this.processInstanceFactoryRegistry;
+
+    }
+
+    private void initProcessInstanceFactoryRegistry() {
+        this.processInstanceFactoryRegistry = new ProcessInstanceFactoryRegistry();
+
+        // split on each space
+        String locations[] = this.chainedProperties.getProperty( "processInstanceFactoryRegistry",
+                                                                 "" ).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( "" ) ) {
+                loadProcessInstanceFactoryRegistry( factoryLocation );
+            }
+        }
+    }
+
+    private void loadProcessInstanceFactoryRegistry(String factoryLocation) {
+        String content = ConfFileUtils.URLContentsToString( ConfFileUtils.getURL( factoryLocation,
+                                                                                  null,
+                                                                                  RuleBaseConfiguration.class ) );
+
+        Map<Class< ? extends Process>, ProcessInstanceFactory> map = (Map<Class< ? extends Process>, ProcessInstanceFactory>) MVEL.eval( content,
+                                                                                                                             new HashMap() );
+
+        if ( map != null ) {
+            for ( Entry<Class<? extends Process>, ProcessInstanceFactory> entry : map.entrySet() ) {
+                this.processInstanceFactoryRegistry.register( entry.getKey(),
+                                                              entry.getValue() );
+            }
+        }
+    }
+
     public Map<String, WorkDefinition> getProcessWorkDefinitions() {
         if ( this.workDefinitions == null ) {
             initWorkDefinitions();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -336,29 +336,29 @@
     public void beforeRuleFlowStarted(RuleFlowStartedEvent event,
             					      WorkingMemory workingMemory) {
         filterLogEvent( new RuleFlowLogEvent( LogEvent.BEFORE_RULEFLOW_CREATED,
-        		event.getRuleFlowProcessInstance().getProcess().getId(),
-                event.getRuleFlowProcessInstance().getProcess().getName() ) );
+        		event.getProcessInstance().getProcess().getId(),
+                event.getProcessInstance().getProcess().getName() ) );
     }
 
     public void afterRuleFlowStarted(RuleFlowStartedEvent event,
                                      WorkingMemory workingMemory) {
         filterLogEvent(new RuleFlowLogEvent(LogEvent.AFTER_RULEFLOW_CREATED,
-                event.getRuleFlowProcessInstance().getProcess().getId(),
-                event.getRuleFlowProcessInstance().getProcess().getName()));
+                event.getProcessInstance().getProcess().getId(),
+                event.getProcessInstance().getProcess().getName()));
     }
 
     public void beforeRuleFlowCompleted(RuleFlowCompletedEvent event,
               					  WorkingMemory workingMemory) {
         filterLogEvent( new RuleFlowLogEvent( LogEvent.BEFORE_RULEFLOW_COMPLETED,
-        		event.getRuleFlowProcessInstance().getProcess().getId(),
-                event.getRuleFlowProcessInstance().getProcess().getName() ) );
+        		event.getProcessInstance().getProcess().getId(),
+                event.getProcessInstance().getProcess().getName() ) );
     }
     
     public void afterRuleFlowCompleted(RuleFlowCompletedEvent event,
                                        WorkingMemory workingMemory) {
         filterLogEvent(new RuleFlowLogEvent(LogEvent.AFTER_RULEFLOW_COMPLETED,
-                event.getRuleFlowProcessInstance().getProcess().getId(),
-                event.getRuleFlowProcessInstance().getProcess().getName()));
+                event.getProcessInstance().getProcess().getId(),
+                event.getProcessInstance().getProcess().getName()));
     }
 
     public void beforeRuleFlowGroupActivated(
@@ -402,8 +402,8 @@
         filterLogEvent(new RuleFlowNodeLogEvent(LogEvent.BEFORE_RULEFLOW_NODE_TRIGGERED,
                 event.getRuleFlowNodeInstance().getId() + "",
                 event.getRuleFlowNodeInstance().getNode().getName(),
-                event.getRuleFlowProcessInstance().getProcess().getId(), event
-                        .getRuleFlowProcessInstance().getProcess().getName()));
+                event.getProcessInstance().getProcess().getId(), event
+                        .getProcessInstance().getProcess().getName()));
     }
 
     public void afterRuleFlowNodeTriggered(RuleFlowNodeTriggeredEvent event,
@@ -411,8 +411,8 @@
         filterLogEvent(new RuleFlowNodeLogEvent(LogEvent.AFTER_RULEFLOW_NODE_TRIGGERED,
                 event.getRuleFlowNodeInstance().getId() + "",
                 event.getRuleFlowNodeInstance().getNode().getName(),
-                event.getRuleFlowProcessInstance().getProcess().getId(), event
-                        .getRuleFlowProcessInstance().getProcess().getName()));
+                event.getProcessInstance().getProcess().getId(), event
+                        .getProcessInstance().getProcess().getName()));
     }
 
     public void afterPackageAdded(AfterPackageAddedEvent event) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -18,10 +18,6 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -62,17 +58,12 @@
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
-import org.drools.marshalling.InputMarshaller;
-import org.drools.marshalling.OutputMarshaller;
-import org.drools.marshalling.PersisterEnums;
-import org.drools.marshalling.PersisterHelper;
-import org.drools.marshalling.MarshallerReaderContext;
-import org.drools.marshalling.MarshallerWriteContext;
 import org.drools.process.core.Process;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.ProcessInstanceFactory;
+import org.drools.process.instance.ProcessInstanceFactoryRegistry;
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.timer.TimerManager;
@@ -82,13 +73,10 @@
 import org.drools.reteoo.LIANodePropagation;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.ObjectTypeConf;
-import org.drools.reteoo.ReteooFactHandleFactory;
 import org.drools.rule.Declaration;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
-import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.ruleflow.instance.RuleFlowProcessInstanceFactory;
 import org.drools.spi.Activation;
 import org.drools.spi.AgendaFilter;
 import org.drools.spi.AgendaGroup;
@@ -184,8 +172,6 @@
 
     private TimerManager                                timerManager;
 
-    private Map<String, ProcessInstanceFactory>         processInstanceFactories;
-
     private TimeMachine                                 timeMachine;
 
     protected transient ObjectTypeConfigurationRegistry typeConfReg;
@@ -251,7 +237,6 @@
         this.lock = new ReentrantLock();
         this.liaPropagations = Collections.EMPTY_LIST;
         this.processInstances = new HashMap();
-        this.processInstanceFactories = new HashMap();
         this.timeMachine = new TimeMachine();
 
         this.nodeMemories = new ConcurrentNodeMemories( this.ruleBase );
@@ -276,8 +261,6 @@
             this.discardOnLogicalOverride = false;
         }
 
-        this.processInstanceFactories.put( RuleFlowProcess.RULEFLOW_TYPE,
-                                           new RuleFlowProcessInstanceFactory() );
         this.entryPoints = new ConcurrentHashMap();
         this.entryPoints.put( "DEFAULT",
                               this );
@@ -1457,11 +1440,7 @@
         if ( process == null ) {
             throw new IllegalArgumentException( "Unknown process ID: " + processId );
         }
-        ProcessInstanceFactory factory = processInstanceFactories.get( process.getType() );
-        if ( factory == null ) {
-            throw new IllegalArgumentException( "Could not create process instance for type: " + process.getType() );
-        }
-        ProcessInstance processInstance = factory.createProcessInstance();
+        ProcessInstance processInstance = getProcessInstance(process);
         processInstance.setWorkingMemory( this );
         processInstance.setProcess( process );
         processInstance.setId( ++processCounter );
@@ -1497,6 +1476,21 @@
 
         return processInstance;
     }
+    
+    public ProcessInstance getProcessInstance(final Process process) {
+        ProcessInstanceFactoryRegistry processRegistry =
+            ((InternalRuleBase) getRuleBase()).getConfiguration()
+                .getProcessInstanceFactoryRegistry();
+        ProcessInstanceFactory conf = processRegistry.getProcessInstanceFactory(process);
+        if (conf == null) {
+            throw new IllegalArgumentException("Illegal process type: " + process.getClass());
+        }
+        ProcessInstance processInstance = conf.createProcessInstance();
+        if (processInstance == null) {
+            throw new IllegalArgumentException("Illegal process type: " + process.getClass());
+        }
+        return processInstance;
+    }
 
     public Collection getProcessInstances() {
         return Collections.unmodifiableCollection( processInstances.values() );
@@ -1515,12 +1509,6 @@
         processInstances.remove( processInstance.getId() );
     }
 
-    public void registerProcessInstanceFactory(String type,
-                                               ProcessInstanceFactory processInstanceFactory) {
-        processInstanceFactories.put( type,
-                                      processInstanceFactory );
-    }
-
     public WorkItemManager getWorkItemManager() {
         if ( workItemManager == null ) {
             workItemManager = new WorkItemManager( this );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -35,8 +35,6 @@
 
     public void setRuleFlowEventSupport(RuleFlowEventSupport ruleFlowEventSupport);
     
-    public void registerProcessInstanceFactory(String type, ProcessInstanceFactory nodeInstanceFactory);
-
     public Object getNodeMemory(NodeMemory node);
 
     public void clearNodeMemory(NodeMemory node);

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ProcessEvent.java (from rev 20114, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ProcessEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ProcessEvent.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -0,0 +1,38 @@
+package org.drools.event;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.EventObject;
+
+import org.drools.process.instance.ProcessInstance;
+
+/**
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ProcessEvent extends EventObject {
+
+    private static final long serialVersionUID = 400L;
+
+    public ProcessEvent(final ProcessInstance instance) {
+        super( instance );
+    }
+
+    public ProcessInstance getProcessInstance() {
+        return (ProcessInstance) getSource();
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowCompletedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowCompletedEvent.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowCompletedEvent.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -21,7 +21,7 @@
 /**
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleFlowCompletedEvent extends RuleFlowEvent {
+public class RuleFlowCompletedEvent extends ProcessEvent {
 
     private static final long serialVersionUID = 400L;
 
@@ -30,6 +30,6 @@
     }
 
     public String toString() {
-        return "==>[ProcessCompleted(name=" + getRuleFlowProcessInstance().getProcess().getName() + "; id=" + getRuleFlowProcessInstance().getProcess().getId() + ")]";
+        return "==>[ProcessCompleted(name=" + getProcessInstance().getProcess().getName() + "; id=" + getProcessInstance().getProcess().getId() + ")]";
     }
 }
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEvent.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEvent.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -1,38 +0,0 @@
-package org.drools.event;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.EventObject;
-
-import org.drools.process.instance.ProcessInstance;
-
-/**
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class RuleFlowEvent extends EventObject {
-
-    private static final long serialVersionUID = 400L;
-
-    public RuleFlowEvent(final ProcessInstance instance) {
-        super( instance );
-    }
-
-    public ProcessInstance getRuleFlowProcessInstance() {
-        return (ProcessInstance) getSource();
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowNodeTriggeredEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowNodeTriggeredEvent.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowNodeTriggeredEvent.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -21,7 +21,7 @@
 /**
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleFlowNodeTriggeredEvent extends RuleFlowEvent {
+public class RuleFlowNodeTriggeredEvent extends ProcessEvent {
 
     private static final long serialVersionUID = 400L;
     
@@ -38,6 +38,6 @@
 
     public String toString() {
         return "==>[WorkflowNodeTriggered(nodeId=" + nodeInstance.getNodeId() + "; id=" + nodeInstance.getId() 
-            + "; processName=" + getRuleFlowProcessInstance().getProcess().getName() + "; processId=" + getRuleFlowProcessInstance().getProcess().getId() + ")]";
+            + "; processName=" + getProcessInstance().getProcess().getName() + "; processId=" + getProcessInstance().getProcess().getId() + ")]";
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowStartedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowStartedEvent.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowStartedEvent.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -21,7 +21,7 @@
 /**
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleFlowStartedEvent extends RuleFlowEvent {
+public class RuleFlowStartedEvent extends ProcessEvent {
 
     private static final long serialVersionUID = 400L;
 
@@ -30,6 +30,6 @@
     }
 
     public String toString() {
-        return "==>[ProcessStarted(name=" + getRuleFlowProcessInstance().getProcess().getName() + "; id=" + getRuleFlowProcessInstance().getProcess().getId() + ")]";
+        return "==>[ProcessStarted(name=" + getProcessInstance().getProcess().getName() + "; id=" + getProcessInstance().getProcess().getId() + ")]";
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -29,6 +29,10 @@
     public void removeExceptionHandler(String exception) {
         this.exceptionHandlers.remove(exception);
     }
+    
+    public Map<String, ExceptionHandler> getExceptionHandlers() {
+        return exceptionHandlers;
+    }
 
     public Context resolveContext(Object param) {
         if (param instanceof String) {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/variable/Mappable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/variable/Mappable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/variable/Mappable.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -0,0 +1,17 @@
+package org.drools.process.core.context.variable;
+
+import java.util.Map;
+
+public interface Mappable {
+
+    void addInMapping(String parameterName, String variableName);
+    void setInMappings(Map<String, String> inMapping);
+    String getInMapping(String parameterName);
+    Map<String, String> getInMappings();
+    
+    void addOutMapping(String parameterName, String variableName);
+    void setOutMappings(Map<String, String> outMapping);
+    String getOutMapping(String parameterName);
+    Map<String, String> getOutMappings();
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactoryRegistry.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactoryRegistry.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -0,0 +1,34 @@
+package org.drools.process.instance;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.process.core.Process;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.instance.RuleFlowProcessInstanceFactory;
+
+public class ProcessInstanceFactoryRegistry {
+    
+    public static final ProcessInstanceFactoryRegistry instance =
+        new ProcessInstanceFactoryRegistry();
+
+    private Map<Class< ? extends Process>, ProcessInstanceFactory> registry;
+
+    public ProcessInstanceFactoryRegistry() {
+        this.registry = new HashMap<Class< ? extends Process>, ProcessInstanceFactory>();
+
+        // hard wired nodes:
+        register( RuleFlowProcess.class,
+                  new RuleFlowProcessInstanceFactory() );
+    }
+
+    public void register(Class< ? extends Process> cls,
+                         ProcessInstanceFactory factory) {
+        this.registry.put( cls,
+                           factory );
+    }
+
+    public ProcessInstanceFactory getProcessInstanceFactory(Process process) {
+        return this.registry.get( process.getClass() );
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeContainerImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeContainerImpl.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeContainerImpl.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -41,11 +41,11 @@
     }
 
     public Node getNode(final long id) {
-        final Long idLong = new Long(id);
-        if (!this.nodes.containsKey(idLong)) {
+        Node node = this.nodes.get(id);
+        if (node == null) {
             throw new IllegalArgumentException("Unknown node id: " + id);
         }
-        return (Node) this.nodes.get(idLong);
+        return node; 
     }
 
     public void removeNode(final Node node) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -1,5 +1,11 @@
 package org.drools.workflow.core.node;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.process.core.context.variable.Mappable;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -22,14 +28,15 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessNode extends EventNode {
+public class SubProcessNode extends EventNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	
-	private String            processId;
-	private boolean           waitForCompletion = true;
-	// TODO boolean independent (cancel process if node gets cancelled?)
-	// TODO parameter passing
+	private String processId;
+	private boolean waitForCompletion = true;
+    private Map<String, String> inMapping = new HashMap<String, String>();
+    private Map<String, String> outMapping = new HashMap<String, String>();
+    private boolean independent = true;
 
     public void setProcessId(final String processId) {
         this.processId = processId;
@@ -47,4 +54,44 @@
         this.waitForCompletion = waitForCompletion;
     }
 
+    public void addInMapping(String subVariableName, String variableName) {
+        inMapping.put(subVariableName, variableName);
+    }
+    
+    public void setInMappings(Map<String, String> inMapping) {
+        this.inMapping = inMapping;
+    }
+    
+    public String getInMapping(String parameterName) {
+        return inMapping.get(parameterName);
+    }
+
+    public Map<String, String> getInMappings() {
+        return Collections.unmodifiableMap(inMapping);
+    }
+    
+    public void addOutMapping(String subVariableName, String variableName) {
+        outMapping.put(subVariableName, variableName);
+    }
+    
+    public void setOutMappings(Map<String, String> outMapping) {
+        this.outMapping = outMapping;
+    }
+    
+    public String getOutMapping(String parameterName) {
+        return outMapping.get(parameterName);
+    }
+
+    public Map<String, String> getOutMappings() {
+        return Collections.unmodifiableMap(outMapping);
+    }
+
+    public boolean isIndependent() {
+        return independent;
+    }
+
+    public void setIndependent(boolean independent) {
+        this.independent = independent;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -21,13 +21,14 @@
 import java.util.Map;
 
 import org.drools.process.core.Work;
+import org.drools.process.core.context.variable.Mappable;
 
 /**
  * Default implementation of a task node.
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemNode extends EventNode {
+public class WorkItemNode extends EventNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -28,6 +28,7 @@
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.process.core.timer.Timer;
+import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemListener;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
@@ -133,7 +134,8 @@
     public void setState(final int state) {
         super.setState( state );
         // TODO move most of this to ProcessInstanceImpl
-        if ( state == ProcessInstanceImpl.STATE_COMPLETED ) {
+        if ( state == ProcessInstance.STATE_COMPLETED 
+                || state == ProcessInstance.STATE_ABORTED ) {
             InternalWorkingMemory workingMemory = (InternalWorkingMemory) getWorkingMemory();
             ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport()
                 .fireBeforeRuleFlowProcessCompleted( this, workingMemory );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/JoinInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/JoinInstance.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/JoinInstance.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -17,7 +17,6 @@
  */
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.drools.workflow.core.Connection;
@@ -52,13 +51,12 @@
                 triggerCompleted();
                 break;
             case Join.TYPE_AND :
-                Node node = getNodeInstanceContainer().getNodeContainer().getNode( from.getNodeId() );
-                Integer count = (Integer) this.triggers.get( node.getId() );
+                Integer count = (Integer) this.triggers.get( from.getNodeId() );
                 if ( count == null ) {
-                    this.triggers.put( node.getId(),
+                    this.triggers.put( from.getNodeId(),
                                        1 );
                 } else {
-                    this.triggers.put( node.getId(),
+                    this.triggers.put( from.getNodeId(),
                                        count.intValue() + 1 );
                 }
                 if (checkAllActivated()) {
@@ -68,8 +66,7 @@
                 break;
             case Join.TYPE_DISCRIMINATOR :
                 boolean triggerCompleted = triggers.isEmpty();
-                node = getNodeInstanceContainer().getNodeContainer().getNode( from.getNodeId() );
-                triggers.put( node.getId(), new Integer( 1 ) );
+                triggers.put( from.getNodeId(), new Integer( 1 ) );
                 if (checkAllActivated()) {
                     resetAllTriggers();
                 }
@@ -84,8 +81,7 @@
 
     private boolean checkAllActivated() {
         // check whether all parent nodes have been triggered 
-        for ( final Iterator<Connection> it = getJoin().getDefaultIncomingConnections().iterator(); it.hasNext(); ) {
-            final Connection connection = it.next();
+        for (final Connection connection: getJoin().getDefaultIncomingConnections()) {
             if ( this.triggers.get( connection.getFrom().getId() ) == null ) {
                 return false;
             }
@@ -95,8 +91,7 @@
     
     private void decreaseAllTriggers() {
         // decrease trigger count for all incoming connections
-        for ( final Iterator<Connection> it = getJoin().getDefaultIncomingConnections().iterator(); it.hasNext(); ) {
-            final Connection connection = it.next();
+        for (final Connection connection: getJoin().getDefaultIncomingConnections()) {
             final Integer count = (Integer) this.triggers.get( connection.getFrom().getId() );
             if ( count.intValue() == 1 ) {
                 this.triggers.remove( connection.getFrom().getId() );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2008-05-24 05:07:32 UTC (rev 20151)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2008-05-24 13:50:56 UTC (rev 20152)
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.drools.WorkingMemory;
 import org.drools.event.RuleFlowCompletedEvent;
 import org.drools.event.RuleFlowEventListener;
@@ -23,7 +26,9 @@
 import org.drools.event.RuleFlowGroupDeactivatedEvent;
 import org.drools.event.RuleFlowNodeTriggeredEvent;
 import org.drools.event.RuleFlowStartedEvent;
+import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.SubProcessNode;
 import org.drools.workflow.instance.NodeInstance;
@@ -39,7 +44,7 @@
     
     private long processInstanceId;
 	
-    protected SubProcessNode getSubFlowNode() {
+    protected SubProcessNode getSubProcessNode() {
         return (SubProcessNode) getNode();
     }
 
@@ -48,9 +53,21 @@
             throw new IllegalArgumentException(
                 "A SubProcess node only accepts default incoming connections!");
         }
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        for (Map.Entry<String, String> mapping: getSubProcessNode().getInMappings().entrySet()) {
+            VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+                resolveContextInstance(VariableScope.VARIABLE_SCOPE, mapping.getValue());
+            if (variableScopeInstance != null) {
+                parameters.put(mapping.getKey(), variableScopeInstance.getVariable(mapping.getValue()));
+            } else {
+                System.err.println("Could not find variable scope for variable " + mapping.getValue());
+                System.err.println("when trying to execute SubProcess node " + getSubProcessNode().getName());
+                System.err.println("Continuing without setting parameter.");
+            }
+        }
     	ProcessInstance processInstance = 
-    		getProcessInstance().getWorkingMemory().startProcess(getSubFlowNode().getProcessId());
-    	if (!getSubFlowNode().isWaitForCompletion()
+    		getProcessInstance().getWorkingMemory().startProcess(getSubProcessNode().getProcessId(), parameters);
+    	if (!getSubProcessNode().isWaitForCompletion()
     	        || processInstance.getState() == ProcessInstance.STATE_COMPLETED) {
     		triggerCompleted();
     	} else {
@@ -59,6 +76,16 @@
     	}
     }
     
+    public void cancel() {
+        super.cancel();
+        if (!getSubProcessNode().isIndependent()) {
+            ProcessInstance processInstance =
+                getProcessInstance().getWorkingMemory()
+                    .getProcessInstance(processInstanceId);
+            processInstance.setState(ProcessInstance.STATE_ABORTED);
+        }
+    }
+    
     public long getProcessInstanceId() {
     	return processInstanceId;
     }
@@ -79,8 +106,22 @@
 
     public void afterRuleFlowCompleted(RuleFlowCompletedEvent event,
             WorkingMemory workingMemory) {
-        if ( event.getRuleFlowProcessInstance().getId() == processInstanceId ) {
+        ProcessInstance processInstance = event.getProcessInstance();
+        if ( processInstance.getId() == processInstanceId ) {
             removeEventListeners();
+            VariableScopeInstance subProcessVariableScopeInstance = (VariableScopeInstance)
+                processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);
+            for (Map.Entry<String, String> mapping: getSubProcessNode().getOutMappings().entrySet()) {
+                VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+                    resolveContextInstance(VariableScope.VARIABLE_SCOPE, mapping.getValue());
+                if (variableScopeInstance != null) {
+                    variableScopeInstance.setVariable(mapping.getValue(), subProcessVariableScopeInstance.getVariable(mapping.getKey()));
+                } else {
+                    System.err.println("Could not find variable scope for variable " + mapping.getValue());
+                    System.err.println("when trying to complete SubProcess node " + getSubProcessNode().getName());
+                    System.err.println("Continuing without setting variable.");
+                }
+            }
             triggerCompleted();
         }
     }




More information about the jboss-svn-commits mailing list