[jbpm-commits] JBoss JBPM SVN: r2497 - in jbpm3/trunk/modules/core/src/main/java/org/jbpm: graph/node and 2 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Tue Oct 7 07:37:40 EDT 2008
Author: camunda
Date: 2008-10-07 07:37:40 -0400 (Tue, 07 Oct 2008)
New Revision: 2497
Modified:
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Action.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/def/TaskController.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/exe/TaskMgmtInstance.java
Log:
JBPM-1448
set ContextClassLoader correctly to ProcessClassLoader wherever Delegation classes are instantiated and used (https://jira.jboss.org/jira/browse/JBPM-1448)
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Action.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Action.java 2008-10-07 11:09:44 UTC (rev 2496)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Action.java 2008-10-07 11:37:40 UTC (rev 2497)
@@ -30,6 +30,7 @@
import org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator;
import org.jbpm.jpdl.xml.JpdlXmlReader;
import org.jbpm.jpdl.xml.Parsable;
+import org.jbpm.util.ClassLoaderUtil;
import org.jbpm.util.EqualsUtil;
public class Action implements ActionHandler, Parsable, Serializable {
@@ -111,15 +112,23 @@
}
public void execute(ExecutionContext executionContext) throws Exception {
- if (referencedAction!=null) {
- referencedAction.execute(executionContext);
+ ClassLoader surroundingClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // set context class loader correctly for delegation class (https://jira.jboss.org/jira/browse/JBPM-1448)
+ Thread.currentThread().setContextClassLoader(ClassLoaderUtil.getProcessClassLoader(processDefinition));
- } else if (actionExpression!=null) {
- JbpmExpressionEvaluator.evaluate(actionExpression, executionContext);
+ if (referencedAction != null) {
+ referencedAction.execute(executionContext);
- } else if (actionDelegation!=null) {
- ActionHandler actionHandler = (ActionHandler)actionDelegation.getInstance();
- actionHandler.execute(executionContext);
+ } else if (actionExpression != null) {
+ JbpmExpressionEvaluator.evaluate(actionExpression, executionContext);
+
+ } else if (actionDelegation != null) {
+ ActionHandler actionHandler = (ActionHandler) actionDelegation.getInstance();
+ actionHandler.execute(executionContext);
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(surroundingClassLoader);
}
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java 2008-10-07 11:09:44 UTC (rev 2496)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java 2008-10-07 11:37:40 UTC (rev 2497)
@@ -35,6 +35,7 @@
import org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator;
import org.jbpm.jpdl.xml.JpdlXmlReader;
import org.jbpm.jpdl.xml.Parsable;
+import org.jbpm.util.ClassLoaderUtil;
/**
* decision node.
@@ -72,73 +73,84 @@
public void execute(ExecutionContext executionContext) {
Transition transition = null;
-
+ ClassLoader surroundingClassLoader = Thread.currentThread().getContextClassLoader();
try {
- if (decisionDelegation!=null) {
- DecisionHandler decisionHandler = (DecisionHandler) decisionDelegation.instantiate();
- String transitionName = decisionHandler.decide(executionContext);
- transition = getLeavingTransition(transitionName);
- if (transition==null) {
- throw new JbpmException("decision '"+name+"' selected non existing transition '"+transitionName+"'" );
- }
-
- } else if (decisionExpression!=null) {
- Object result = JbpmExpressionEvaluator.evaluate(decisionExpression, executionContext);
- if (result==null) {
- throw new JbpmException("decision expression '"+decisionExpression+"' returned null");
- }
- String transitionName = result.toString();
- transition = getLeavingTransition(transitionName);
- if (transition==null) {
- throw new JbpmException("decision '"+name+"' selected non existing transition '"+transitionName+"'" );
- }
-
- } else if (decisionConditions!=null && !decisionConditions.isEmpty()) {
- // backwards compatible mode based on separate DecisionCondition's
- Iterator iter = decisionConditions.iterator();
- while (iter.hasNext() && (transition==null)) {
- DecisionCondition decisionCondition = (DecisionCondition) iter.next();
- Object result = JbpmExpressionEvaluator.evaluate(decisionCondition.getExpression(), executionContext);
- if (Boolean.TRUE.equals(result)) {
- String transitionName = decisionCondition.getTransitionName();
- transition = getLeavingTransition(transitionName);
- if (transition!=null) {
- transition.removeConditionEnforcement();
- }
+ // set context class loader correctly for delegation class (https://jira.jboss.org/jira/browse/JBPM-1448)
+ Thread.currentThread().setContextClassLoader(ClassLoaderUtil.getProcessClassLoader(processDefinition));
+
+ try {
+ if (decisionDelegation != null) {
+ DecisionHandler decisionHandler = (DecisionHandler) decisionDelegation.instantiate();
+ String transitionName = decisionHandler.decide(executionContext);
+ transition = getLeavingTransition(transitionName);
+ if (transition == null) {
+ throw new JbpmException("decision '" + name + "' selected non existing transition '" + transitionName + "'");
}
- }
-
- } else {
- // new mode based on conditions in the transition itself
- Iterator iter = leavingTransitions.iterator();
- while (iter.hasNext() && (transition==null)) {
- Transition candidate = (Transition) iter.next();
-
- String conditionExpression = candidate.getCondition();
- if (conditionExpression!=null) {
- Object result = JbpmExpressionEvaluator.evaluate(conditionExpression, executionContext);
+
+ } else if (decisionExpression != null) {
+ Object result = JbpmExpressionEvaluator.evaluate(decisionExpression, executionContext);
+ if (result == null) {
+ throw new JbpmException("decision expression '" + decisionExpression + "' returned null");
+ }
+ String transitionName = result.toString();
+ transition = getLeavingTransition(transitionName);
+ if (transition == null) {
+ throw new JbpmException("decision '" + name + "' selected non existing transition '" + transitionName + "'");
+ }
+
+ } else if (decisionConditions != null && !decisionConditions.isEmpty()) {
+ // backwards compatible mode based on separate DecisionCondition's
+ Iterator iter = decisionConditions.iterator();
+ while (iter.hasNext() && (transition == null)) {
+ DecisionCondition decisionCondition = (DecisionCondition) iter.next();
+ Object result = JbpmExpressionEvaluator.evaluate(decisionCondition.getExpression(), executionContext);
if (Boolean.TRUE.equals(result)) {
- transition = candidate;
+ String transitionName = decisionCondition.getTransitionName();
+ transition = getLeavingTransition(transitionName);
+ if (transition != null) {
+ transition.removeConditionEnforcement();
+ }
}
}
+
+ } else {
+ // new mode based on conditions in the transition itself
+ Iterator iter = leavingTransitions.iterator();
+ while (iter.hasNext() && (transition == null)) {
+ Transition candidate = (Transition) iter.next();
+
+ String conditionExpression = candidate.getCondition();
+ if (conditionExpression != null) {
+ Object result = JbpmExpressionEvaluator.evaluate(conditionExpression, executionContext);
+ if (Boolean.TRUE.equals(result)) {
+ transition = candidate;
+ }
+ }
+ }
+
}
- }
+ if (transition == null) {
+ transition = getDefaultLeavingTransition();
+ log.debug("decision didn't select transition, taking default " + transition);
+ }
- if (transition==null) {
- transition = getDefaultLeavingTransition();
- log.debug("decision didn't select transition, taking default "+transition);
+ // since the decision node evaluates condition expressions, the
+ // condition of the
+ // taken transition will always be met. therefor we can safely turn off
+ // the
+ // standard condition enforcement in the transitions after a decision
+ // node.
+ transition.removeConditionEnforcement();
+
+ } catch (Exception exception) {
+ raiseException(exception, executionContext);
}
- // since the decision node evaluates condition expressions, the condition of the
- // taken transition will always be met. therefor we can safely turn off the
- // standard condition enforcement in the transitions after a decision node.
- transition.removeConditionEnforcement();
-
- } catch (Exception exception) {
- raiseException(exception, executionContext);
}
-
+ finally {
+ Thread.currentThread().setContextClassLoader(surroundingClassLoader);
+ }
log.debug("decision "+name+" is taking '"+transition+"'");
executionContext.leaveNode(transition);
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/def/TaskController.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/def/TaskController.java 2008-10-07 11:09:44 UTC (rev 2496)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/def/TaskController.java 2008-10-07 11:37:40 UTC (rev 2497)
@@ -34,6 +34,7 @@
import org.jbpm.instantiation.Delegation;
import org.jbpm.instantiation.UserCodeInterceptorConfig;
import org.jbpm.taskmgmt.exe.TaskInstance;
+import org.jbpm.util.ClassLoaderUtil;
import org.jbpm.util.EqualsUtil;
/**
@@ -70,101 +71,116 @@
* visible (that means that the user did not specify a special task instance scope).
*/
public void initializeVariables(TaskInstance taskInstance) {
- if (taskControllerDelegation != null) {
- TaskControllerHandler taskControllerHandler = (TaskControllerHandler) taskControllerDelegation.instantiate();
- ProcessInstance processInstance = taskInstance.getTaskMgmtInstance().getProcessInstance();
- ContextInstance contextInstance = (processInstance!=null ? processInstance.getContextInstance() : null);
- Token token = taskInstance.getToken();
-
- if (UserCodeInterceptorConfig.userCodeInterceptor!=null) {
- UserCodeInterceptorConfig.userCodeInterceptor.executeTaskControllerInitialization(taskControllerHandler, taskInstance, contextInstance, token);
+ ClassLoader surroundingClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // set context class loader correctly for delegation class (https://jira.jboss.org/jira/browse/JBPM-1448)
+ Thread.currentThread().setContextClassLoader(ClassLoaderUtil.getProcessClassLoader(taskInstance.getTask().getProcessDefinition()));
+
+ if (taskControllerDelegation != null) {
+ TaskControllerHandler taskControllerHandler = (TaskControllerHandler) taskControllerDelegation.instantiate();
+ ProcessInstance processInstance = taskInstance.getTaskMgmtInstance().getProcessInstance();
+ ContextInstance contextInstance = (processInstance != null ? processInstance.getContextInstance() : null);
+ Token token = taskInstance.getToken();
+
+ if (UserCodeInterceptorConfig.userCodeInterceptor != null) {
+ UserCodeInterceptorConfig.userCodeInterceptor.executeTaskControllerInitialization(taskControllerHandler, taskInstance, contextInstance, token);
+ } else {
+ taskControllerHandler.initializeTaskVariables(taskInstance, contextInstance, token);
+ }
+
} else {
- taskControllerHandler.initializeTaskVariables(taskInstance, contextInstance, token);
- }
+ Token token = taskInstance.getToken();
+ ProcessInstance processInstance = token.getProcessInstance();
+ ContextInstance contextInstance = processInstance.getContextInstance();
- } else {
- Token token = taskInstance.getToken();
- ProcessInstance processInstance = token.getProcessInstance();
- ContextInstance contextInstance = processInstance.getContextInstance();
-
- if (variableAccesses!=null) {
- Iterator iter = variableAccesses.iterator();
- while (iter.hasNext()) {
- VariableAccess variableAccess = (VariableAccess) iter.next();
- String mappedName = variableAccess.getMappedName();
- if (variableAccess.isReadable()) {
- String variableName = variableAccess.getVariableName();
- Object value = contextInstance.getVariable(variableName, token);
- log.debug("creating task instance variable '"+mappedName+"' from process variable '"+variableName+"', value '"+value+"'");
- taskInstance.setVariableLocally(mappedName, value);
- } else {
- log.debug("creating task instance local variable '"+mappedName+"'. initializing with null value.");
- taskInstance.setVariableLocally(mappedName, null);
+ if (variableAccesses != null) {
+ Iterator iter = variableAccesses.iterator();
+ while (iter.hasNext()) {
+ VariableAccess variableAccess = (VariableAccess) iter.next();
+ String mappedName = variableAccess.getMappedName();
+ if (variableAccess.isReadable()) {
+ String variableName = variableAccess.getVariableName();
+ Object value = contextInstance.getVariable(variableName, token);
+ log.debug("creating task instance variable '" + mappedName + "' from process variable '" + variableName + "', value '" + value + "'");
+ taskInstance.setVariableLocally(mappedName, value);
+ } else {
+ log.debug("creating task instance local variable '" + mappedName + "'. initializing with null value.");
+ taskInstance.setVariableLocally(mappedName, null);
+ }
}
}
}
- }
+ } finally {
+ Thread.currentThread().setContextClassLoader(surroundingClassLoader);
+ }
}
/**
* update the process variables from the the task-instance variables.
*/
public void submitParameters(TaskInstance taskInstance) {
- if (taskControllerDelegation != null) {
- TaskControllerHandler taskControllerHandler = (TaskControllerHandler) taskControllerDelegation.instantiate();
- ProcessInstance processInstance = taskInstance.getTaskMgmtInstance().getProcessInstance();
- ContextInstance contextInstance = (processInstance!=null ? processInstance.getContextInstance() : null);
- Token token = taskInstance.getToken();
+ ClassLoader surroundingClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // set context class loader correctly for delegation class (https://jira.jboss.org/jira/browse/JBPM-1448)
+ Thread.currentThread().setContextClassLoader(ClassLoaderUtil.getProcessClassLoader(taskInstance.getTask().getProcessDefinition()));
- if (UserCodeInterceptorConfig.userCodeInterceptor!=null) {
- UserCodeInterceptorConfig.userCodeInterceptor.executeTaskControllerSubmission(taskControllerHandler, taskInstance, contextInstance, token);
+ if (taskControllerDelegation != null) {
+ TaskControllerHandler taskControllerHandler = (TaskControllerHandler) taskControllerDelegation.instantiate();
+ ProcessInstance processInstance = taskInstance.getTaskMgmtInstance().getProcessInstance();
+ ContextInstance contextInstance = (processInstance != null ? processInstance.getContextInstance() : null);
+ Token token = taskInstance.getToken();
+
+ if (UserCodeInterceptorConfig.userCodeInterceptor != null) {
+ UserCodeInterceptorConfig.userCodeInterceptor.executeTaskControllerSubmission(taskControllerHandler, taskInstance, contextInstance, token);
+ } else {
+ taskControllerHandler.submitTaskVariables(taskInstance, contextInstance, token);
+ }
+
} else {
- taskControllerHandler.submitTaskVariables(taskInstance, contextInstance, token);
- }
- } else {
+ Token token = taskInstance.getToken();
+ ProcessInstance processInstance = token.getProcessInstance();
+ ContextInstance contextInstance = processInstance.getContextInstance();
- Token token = taskInstance.getToken();
- ProcessInstance processInstance = token.getProcessInstance();
- ContextInstance contextInstance = processInstance.getContextInstance();
-
- if (variableAccesses!=null) {
- String missingTaskVariables = null;
- Iterator iter = variableAccesses.iterator();
- while (iter.hasNext()) {
- VariableAccess variableAccess = (VariableAccess) iter.next();
- String mappedName = variableAccess.getMappedName();
- // first check if the required variableInstances are present
- if ( (variableAccess.isRequired())
- && (! taskInstance.hasVariableLocally(mappedName))
- ) {
- if (missingTaskVariables==null) {
- missingTaskVariables = mappedName;
- } else {
- missingTaskVariables += ", "+mappedName;
+ if (variableAccesses != null) {
+ String missingTaskVariables = null;
+ Iterator iter = variableAccesses.iterator();
+ while (iter.hasNext()) {
+ VariableAccess variableAccess = (VariableAccess) iter.next();
+ String mappedName = variableAccess.getMappedName();
+ // first check if the required variableInstances are present
+ if ((variableAccess.isRequired()) && (!taskInstance.hasVariableLocally(mappedName))) {
+ if (missingTaskVariables == null) {
+ missingTaskVariables = mappedName;
+ } else {
+ missingTaskVariables += ", " + mappedName;
+ }
}
}
- }
- // if there are missing, required parameters, throw an IllegalArgumentException
- if (missingTaskVariables!=null) {
- throw new IllegalArgumentException("missing task variables: "+missingTaskVariables);
- }
+ // if there are missing, required parameters, throw an
+ // IllegalArgumentException
+ if (missingTaskVariables != null) {
+ throw new IllegalArgumentException("missing task variables: " + missingTaskVariables);
+ }
- iter = variableAccesses.iterator();
- while (iter.hasNext()) {
- VariableAccess variableAccess = (VariableAccess) iter.next();
- String mappedName = variableAccess.getMappedName();
- String variableName = variableAccess.getVariableName();
- if (variableAccess.isWritable()) {
- Object value = taskInstance.getVariable(mappedName);
- if (value!=null) {
- log.debug("submitting task variable '"+mappedName+"' to process variable '"+variableName+"', value '"+value+"'");
- contextInstance.setVariable(variableName, value, token);
+ iter = variableAccesses.iterator();
+ while (iter.hasNext()) {
+ VariableAccess variableAccess = (VariableAccess) iter.next();
+ String mappedName = variableAccess.getMappedName();
+ String variableName = variableAccess.getVariableName();
+ if (variableAccess.isWritable()) {
+ Object value = taskInstance.getVariable(mappedName);
+ if (value != null) {
+ log.debug("submitting task variable '" + mappedName + "' to process variable '" + variableName + "', value '" + value + "'");
+ contextInstance.setVariable(variableName, value, token);
+ }
}
}
}
}
+ } finally {
+ Thread.currentThread().setContextClassLoader(surroundingClassLoader);
}
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/exe/TaskMgmtInstance.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/exe/TaskMgmtInstance.java 2008-10-07 11:09:44 UTC (rev 2496)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/taskmgmt/exe/TaskMgmtInstance.java 2008-10-07 11:37:40 UTC (rev 2497)
@@ -54,6 +54,7 @@
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.def.TaskMgmtDefinition;
import org.jbpm.taskmgmt.log.TaskCreateLog;
+import org.jbpm.util.ClassLoaderUtil;
import org.jbpm.util.Clock;
/**
@@ -264,14 +265,23 @@
}
void performAssignmentDelegation(Delegation assignmentDelegation, Assignable assignable, ExecutionContext executionContext) throws Exception {
- // instantiate the assignment handler
- AssignmentHandler assignmentHandler = (AssignmentHandler) assignmentDelegation.instantiate();
- // invoke the assignment handler
- if (UserCodeInterceptorConfig.userCodeInterceptor!=null) {
- UserCodeInterceptorConfig.userCodeInterceptor.executeAssignment(assignmentHandler, assignable, executionContext);
- } else {
- assignmentHandler.assign(assignable, executionContext);
- }
+ ClassLoader surroundingClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // set context class loader correctly for delegation class (https://jira.jboss.org/jira/browse/JBPM-1448)
+ Thread.currentThread().setContextClassLoader(ClassLoaderUtil.getProcessClassLoader(executionContext.getProcessDefinition()));
+
+ // instantiate the assignment handler
+ AssignmentHandler assignmentHandler = (AssignmentHandler) assignmentDelegation.instantiate();
+ // invoke the assignment handler
+ if (UserCodeInterceptorConfig.userCodeInterceptor != null) {
+ UserCodeInterceptorConfig.userCodeInterceptor.executeAssignment(assignmentHandler, assignable, executionContext);
+ } else {
+ assignmentHandler.assign(assignable, executionContext);
+ }
+
+ } finally {
+ Thread.currentThread().setContextClassLoader(surroundingClassLoader);
+ }
}
void performAssignmentActorIdExpr(String actorIdExpression, Assignable assignable, ExecutionContext executionContext) {
More information about the jbpm-commits
mailing list