diff --git a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java index 7c92a007434c2b3faaef87a0faa04bff78abc5fe..b3c109a30d9ae19b1cd06d406a492e03a545b974 100644 --- a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java +++ b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java @@ -54,8 +54,7 @@ public class SequenceFlowXMLConverter extends BaseBpmnXMLConverter { SequenceFlow sequenceFlow = (SequenceFlow) element; writeDefaultAttribute(ATTRIBUTE_FLOW_SOURCE_REF, sequenceFlow.getSourceRef(), xtw); writeDefaultAttribute(ATTRIBUTE_FLOW_TARGET_REF, sequenceFlow.getTargetRef(), xtw); - if(StringUtils.isNotEmpty(sequenceFlow.getSkipExpression())) - { + if (StringUtils.isNotEmpty(sequenceFlow.getSkipExpression())) { writeDefaultAttribute(ATTRIBUTE_FLOW_SKIP_EXPRESSION, sequenceFlow.getSkipExpression(), xtw); } } diff --git a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java index 183ba45099137b11f4322a485ac9ef87b0eccce5..bfb0b6148572e045f276c57e8773a3e19dcbe883 100644 --- a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java +++ b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java @@ -97,8 +97,7 @@ public class ServiceTaskXMLConverter extends BaseBpmnXMLConverter { if (StringUtils.isNotEmpty(serviceTask.getExtensionId())) { writeQualifiedAttribute(ATTRIBUTE_TASK_SERVICE_EXTENSIONID, serviceTask.getExtensionId(), xtw); } - if(StringUtils.isNotEmpty(serviceTask.getSkipExpression())) - { + if (StringUtils.isNotEmpty(serviceTask.getSkipExpression())) { writeQualifiedAttribute(ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION, serviceTask.getSkipExpression(), xtw); } } diff --git a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java index 2b3804f75e29f129ffc84b7aa8d51abdd8567cf2..9073daad867446766438b31908d7d23c96b12f8a 100644 --- a/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java +++ b/modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java @@ -128,8 +128,7 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter { if (userTask.getPriority() != null) { writeQualifiedAttribute(ATTRIBUTE_TASK_USER_PRIORITY, userTask.getPriority().toString(), xtw); } - if(null != userTask.getSkipExpression()) - { + if (userTask.getSkipExpression() != null) { writeQualifiedAttribute(ATTRIBUTE_TASK_USER_SKIP_EXPRESSION, userTask.getSkipExpression(), xtw); } // write custom attributes diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java index 05025a473956ce822e96cf9ba6c4a91d04225906..5b630f90448c3045f6bb4211cc7f3b53052ce473 100755 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java @@ -13,6 +13,11 @@ package org.activiti.engine.impl.bpmn.behavior; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import org.activiti.engine.ActivitiException; import org.activiti.engine.delegate.Expression; import org.activiti.engine.delegate.event.ActivitiEventType; @@ -30,11 +35,6 @@ import org.activiti.engine.impl.pvm.runtime.InterpretableExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - /** * Helper class for implementing BPMN 2.0 activities, offering convenience * methods specific to BPMN 2.0. @@ -122,15 +122,15 @@ public class BpmnActivityBehavior implements Serializable { for (PvmTransition outgoingTransition : outgoingTransitions) { Expression skipExpression = outgoingTransition.getSkipExpression(); - if(! SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression)) { + if (!SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression)) { if (defaultSequenceFlow == null || !outgoingTransition.getId().equals(defaultSequenceFlow)) { Condition condition = (Condition) outgoingTransition.getProperty(BpmnParse.PROPERTYNAME_CONDITION); if (condition == null || !checkConditions || condition.evaluate(execution)) { transitionsToTake.add(outgoingTransition); } } - } - else if(SkipExpressionUtil.skipFlowElement(execution, skipExpression)){ + + } else if (SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression)){ transitionsToTake.add(outgoingTransition); } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java index 047fd9f98486cdb2213fcbdb3e80640f49bd638d..c5599ad435692928837aa2ac21ee91c50fb1e12b 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java @@ -65,7 +65,8 @@ public class ServiceTaskDelegateExpressionActivityBehavior extends TaskActivityB try { boolean isSkipExpressionEnabled = SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression); if (!isSkipExpressionEnabled || - (isSkipExpressionEnabled && !SkipExpressionUtil.skipFlowElement(execution, skipExpression))) { + (isSkipExpressionEnabled && !SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression))) { + // Note: we can't cache the result of the expression, because the // execution can change: eg. // delegateExpression='${mySpringBeanFactory.randomSpringBean()}' diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java index bdd03d2223854c8e1fb8a921c960c359ca07a0f5..916b68bb53ecc1329ffb2fd55e5cb5397a049311 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java @@ -13,7 +13,6 @@ package org.activiti.engine.impl.bpmn.behavior; -import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.delegate.BpmnError; import org.activiti.engine.delegate.Expression; import org.activiti.engine.impl.bpmn.helper.ErrorPropagation; @@ -47,7 +46,7 @@ public class ServiceTaskExpressionActivityBehavior extends TaskActivityBehavior try { boolean isSkipExpressionEnabled = SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression); if (!isSkipExpressionEnabled || - (isSkipExpressionEnabled && !SkipExpressionUtil.skipFlowElement(execution, skipExpression))) { + (isSkipExpressionEnabled && !SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression))) { value = expression.getValue(execution); if (resultVariable != null) { execution.setVariable(resultVariable, value); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java index fb9f66e86469c22252d21c5467f69bb4039e93f0..d862b87f1b9841010f0d40bfbb580656f7766553 100755 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java @@ -135,7 +135,8 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior { Expression skipExpression = taskDefinition.getSkipExpression(); if (SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression) && - SkipExpressionUtil.skipFlowElement(execution, skipExpression)) { + SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression)) { + leave(execution); } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java index 354b013d9dbd7a63d70ed1f3c6f23bfc80f0957e..f464a1c635f7c7f19f5714df277e14cde984236c 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java @@ -22,9 +22,9 @@ import org.activiti.engine.ActivitiException; import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.delegate.BpmnError; import org.activiti.engine.delegate.DelegateExecution; -import org.activiti.engine.delegate.Expression; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.ExecutionListener; +import org.activiti.engine.delegate.Expression; import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; @@ -62,8 +62,16 @@ public class ClassDelegate extends AbstractBpmnActivityBehavior implements TaskL this.fieldDeclarations = fieldDeclarations; this.skipExpression = skipExpression; } + + public ClassDelegate(String className, List fieldDeclarations) { + this(className, fieldDeclarations, null); + } + + public ClassDelegate(Class clazz, List fieldDeclarations) { + this(clazz.getName(), fieldDeclarations, null); + } - public ClassDelegate(Class< ? > clazz, List fieldDeclarations, Expression skipExpression) { + public ClassDelegate(Class clazz, List fieldDeclarations, Expression skipExpression) { this(clazz.getName(), fieldDeclarations, skipExpression); } @@ -115,10 +123,12 @@ public class ClassDelegate extends AbstractBpmnActivityBehavior implements TaskL public void execute(ActivityExecution execution) throws Exception { boolean isSkipExpressionEnabled = SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression); if (!isSkipExpressionEnabled || - (isSkipExpressionEnabled && !SkipExpressionUtil.skipFlowElement(execution, skipExpression))) { + (isSkipExpressionEnabled && !SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression))) { + if (activityBehaviorInstance == null) { activityBehaviorInstance = getActivityBehaviorInstance(execution); } + try { activityBehaviorInstance.execute(execution); } catch (BpmnError error) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java index 4c46809e2eb690efac19cc33801c84e2643aab2c..2cf40b3dcf5ba10f5a635f98c9c9732986a344cb 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java @@ -6,38 +6,34 @@ import org.activiti.engine.impl.pvm.delegate.ActivityExecution; public class SkipExpressionUtil { - public static boolean isSkipExpressionEnabled(ActivityExecution execution, Expression skipExpression) - { - if(null == skipExpression) - { + + public static boolean isSkipExpressionEnabled(ActivityExecution execution, Expression skipExpression) { + + if (skipExpression == null) { return false; } final String skipExpressionEnabledVariable = "_ACTIVITI_SKIP_EXPRESSION_ENABLED"; Object isSkipExpressionEnabled = execution.getVariable(skipExpressionEnabledVariable); - if(null == isSkipExpressionEnabled) - { + + if (isSkipExpressionEnabled == null) { return false; - } - else if(isSkipExpressionEnabled instanceof Boolean) - { - return ((Boolean)isSkipExpressionEnabled).booleanValue(); - } - else - { + + } else if (isSkipExpressionEnabled instanceof Boolean) { + return ((Boolean) isSkipExpressionEnabled).booleanValue(); + + } else { throw new ActivitiIllegalArgumentException(skipExpressionEnabledVariable + " variable does not resolve to a boolean. " + isSkipExpressionEnabled); } } - public static boolean skipFlowElement(ActivityExecution execution, Expression skipExpression) - { + public static boolean shouldSkipFlowElement(ActivityExecution execution, Expression skipExpression) { Object value = skipExpression.getValue(execution); - if(value instanceof Boolean) - { + + if (value instanceof Boolean) { return ((Boolean)value).booleanValue(); - } - else - { + + } else { throw new ActivitiIllegalArgumentException("Skip expression does not resolve to a boolean: " + skipExpression.getExpressionText()); } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java index 7a91c58cc304a824fa5e0a66d96e55ac15f3f62b..b532abf212a2322c73647164acb82904a76e24e8 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java @@ -129,12 +129,9 @@ public class DefaultActivityBehaviorFactory extends AbstractBehaviorFactory impl public ClassDelegate createClassDelegateServiceTask(ServiceTask serviceTask) { Expression skipExpression; - if(StringUtils.isNotEmpty(serviceTask.getSkipExpression())) - { + if (StringUtils.isNotEmpty(serviceTask.getSkipExpression())) { skipExpression = expressionManager.createExpression(serviceTask.getSkipExpression()); - } - else - { + } else { skipExpression = null; } return new ClassDelegate(serviceTask.getImplementation(), createFieldDeclarations(serviceTask.getFieldExtensions()), skipExpression); @@ -143,12 +140,9 @@ public class DefaultActivityBehaviorFactory extends AbstractBehaviorFactory impl public ServiceTaskDelegateExpressionActivityBehavior createServiceTaskDelegateExpressionActivityBehavior(ServiceTask serviceTask) { Expression delegateExpression = expressionManager.createExpression(serviceTask.getImplementation()); Expression skipExpression; - if(StringUtils.isNotEmpty(serviceTask.getSkipExpression())) - { + if (StringUtils.isNotEmpty(serviceTask.getSkipExpression())) { skipExpression = expressionManager.createExpression(serviceTask.getSkipExpression()); - } - else - { + } else { skipExpression = null; } return new ServiceTaskDelegateExpressionActivityBehavior(delegateExpression, skipExpression, createFieldDeclarations(serviceTask.getFieldExtensions())); @@ -159,9 +153,7 @@ public class DefaultActivityBehaviorFactory extends AbstractBehaviorFactory impl Expression skipExpression; if (StringUtils.isNotEmpty(serviceTask.getSkipExpression())) { skipExpression = expressionManager.createExpression(serviceTask.getSkipExpression()); - } - else - { + } else { skipExpression = null; } return new ServiceTaskExpressionActivityBehavior(expression, skipExpression, serviceTask.getResultVariableName()); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java index b0bf6c4de80e58272a0ab4717e9f1f0bc3230c04..55d437fa5bbbc05fca5a2ce670c4ceff67b5e2f4 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java @@ -65,7 +65,7 @@ public class DefaultListenerFactory extends AbstractBehaviorFactory implements L } public TaskListener createClassDelegateTaskListener(ActivitiListener activitiListener) { - return new ClassDelegate(activitiListener.getImplementation(), createFieldDeclarations(activitiListener.getFieldExtensions()), null); + return new ClassDelegate(activitiListener.getImplementation(), createFieldDeclarations(activitiListener.getFieldExtensions())); } public TaskListener createExpressionTaskListener(ActivitiListener activitiListener) { @@ -78,7 +78,7 @@ public class DefaultListenerFactory extends AbstractBehaviorFactory implements L } public ExecutionListener createClassDelegateExecutionListener(ActivitiListener activitiListener) { - return new ClassDelegate(activitiListener.getImplementation(), createFieldDeclarations(activitiListener.getFieldExtensions()), null); + return new ClassDelegate(activitiListener.getImplementation(), createFieldDeclarations(activitiListener.getFieldExtensions())); } public ExecutionListener createExpressionExecutionListener(ActivitiListener activitiListener) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java index 19621216a828e99235752f7fd142efda1f6d731e..acb99816072388c1c07438810aaf3d26989d091b 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java @@ -44,13 +44,10 @@ public class SequenceFlowParseHandler extends AbstractBpmnParseHandler fieldDeclarations = new ArrayList(); fieldDeclarations.add(new FieldDeclaration("name", Expression.class.getName(), new FixedValue(serviceTask.getImplementation()))); - return new ClassDelegate(NoOpServiceTask.class, fieldDeclarations, null); + return new ClassDelegate(NoOpServiceTask.class, fieldDeclarations); } @Override