Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
开发团队
Flowable Engine
提交
9a8fd41c
F
Flowable Engine
项目概览
开发团队
/
Flowable Engine
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Flowable Engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9a8fd41c
编写于
11月 25, 2014
作者:
R
Robert Hafner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add skipExpression support to UserTask, ServiceTask, and SequenceFlow.
上级
8fc92180
变更
34
隐藏空白更改
内联
并排
Showing
34 changed file
with
557 addition
and
73 deletion
+557
-73
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/constants/BpmnXMLConstants.java
...in/java/org/activiti/bpmn/constants/BpmnXMLConstants.java
+3
-0
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java
...org/activiti/bpmn/converter/SequenceFlowXMLConverter.java
+5
-0
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java
.../org/activiti/bpmn/converter/ServiceTaskXMLConverter.java
+7
-0
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java
...ava/org/activiti/bpmn/converter/UserTaskXMLConverter.java
+11
-1
modules/activiti-bpmn-converter/src/main/resources/org/activiti/impl/bpmn/parser/Semantic.xsd
...main/resources/org/activiti/impl/bpmn/parser/Semantic.xsd
+3
-0
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/SequenceFlow.java
...l/src/main/java/org/activiti/bpmn/model/SequenceFlow.java
+7
-0
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/ServiceTask.java
...el/src/main/java/org/activiti/bpmn/model/ServiceTask.java
+13
-4
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/UserTask.java
...model/src/main/java/org/activiti/bpmn/model/UserTask.java
+11
-5
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java
...iviti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java
+13
-4
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java
...havior/ServiceTaskDelegateExpressionActivityBehavior.java
+24
-19
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java
.../bpmn/behavior/ServiceTaskExpressionActivityBehavior.java
+19
-11
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java
...i/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java
+7
-0
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java
...a/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java
+19
-12
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java
.../activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java
+44
-0
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java
...l/bpmn/parser/factory/DefaultActivityBehaviorFactory.java
+32
-6
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java
...gine/impl/bpmn/parser/factory/DefaultListenerFactory.java
+2
-2
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java
...ne/impl/bpmn/parser/handler/SequenceFlowParseHandler.java
+14
-1
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java
...engine/impl/bpmn/parser/handler/UserTaskParseHandler.java
+4
-0
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/ProcessDefinitionBuilder.java
...rg/activiti/engine/impl/pvm/ProcessDefinitionBuilder.java
+1
-1
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/PvmTransition.java
...main/java/org/activiti/engine/impl/pvm/PvmTransition.java
+4
-0
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/process/ActivityImpl.java
...va/org/activiti/engine/impl/pvm/process/ActivityImpl.java
+4
-3
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/process/TransitionImpl.java
.../org/activiti/engine/impl/pvm/process/TransitionImpl.java
+11
-1
modules/activiti-engine/src/main/java/org/activiti/engine/impl/task/TaskDefinition.java
...in/java/org/activiti/engine/impl/task/TaskDefinition.java
+10
-1
modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java
...org/activiti/engine/test/TestActivityBehaviorFactory.java
+2
-2
modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/sequenceflow/ConditionalSequenceFlowTest.java
...e/test/bpmn/sequenceflow/ConditionalSequenceFlowTest.java
+18
-0
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/ExpressionServiceTaskTest.java
.../examples/bpmn/servicetask/ExpressionServiceTaskTest.java
+23
-0
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/JavaServiceTaskTest.java
...tiviti/examples/bpmn/servicetask/JavaServiceTaskTest.java
+34
-0
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/MethodExpressionServiceTaskTest.java
...les/bpmn/servicetask/MethodExpressionServiceTaskTest.java
+20
-0
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/usertask/SkipExpressionUserTaskTest.java
...ti/examples/bpmn/usertask/SkipExpressionUserTaskTest.java
+38
-0
modules/activiti-engine/src/test/resources/org/activiti/engine/test/bpmn/sequenceflow/ConditionalSequenceFlowTest.testSkipExpression.bpmn20.xml
...ConditionalSequenceFlowTest.testSkipExpression.bpmn20.xml
+30
-0
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/ExpressionServiceTaskTest.testSetServiceResultToProcessVariablesWithSkipExpression.bpmn20.xml
...viceResultToProcessVariablesWithSkipExpression.bpmn20.xml
+37
-0
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/JavaServiceTaskTest.testExpressionFieldInjectionWithSkipExpression.bpmn20.xml
...testExpressionFieldInjectionWithSkipExpression.bpmn20.xml
+37
-0
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/MethodExpressionServiceTaskTest.testSetServiceResultToProcessVariablesWithSkipExpression.bpmn20.xml
...viceResultToProcessVariablesWithSkipExpression.bpmn20.xml
+37
-0
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/usertask/SkipExpressionUserTaskTest.test.bpmn20.xml
.../bpmn/usertask/SkipExpressionUserTaskTest.test.bpmn20.xml
+13
-0
未找到文件。
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/constants/BpmnXMLConstants.java
浏览文件 @
9a8fd41c
...
...
@@ -168,6 +168,7 @@ public interface BpmnXMLConstants {
public
static
final
String
ATTRIBUTE_TASK_SERVICE_DELEGATEEXPRESSION
=
"delegateExpression"
;
public
static
final
String
ATTRIBUTE_TASK_SERVICE_RESULTVARIABLE
=
"resultVariableName"
;
public
static
final
String
ATTRIBUTE_TASK_SERVICE_EXTENSIONID
=
"extensionId"
;
public
static
final
String
ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION
=
"skipExpression"
;
public
static
final
String
ATTRIBUTE_TASK_USER_ASSIGNEE
=
"assignee"
;
public
static
final
String
ATTRIBUTE_TASK_USER_OWNER
=
"owner"
;
...
...
@@ -176,6 +177,7 @@ public interface BpmnXMLConstants {
public
static
final
String
ATTRIBUTE_TASK_USER_DUEDATE
=
"dueDate"
;
public
static
final
String
ATTRIBUTE_TASK_USER_CATEGORY
=
"category"
;
public
static
final
String
ATTRIBUTE_TASK_USER_PRIORITY
=
"priority"
;
public
static
final
String
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION
=
"skipExpression"
;
public
static
final
String
ATTRIBUTE_TASK_RULE_VARIABLES_INPUT
=
"ruleVariablesInput"
;
public
static
final
String
ATTRIBUTE_TASK_RULE_RESULT_VARIABLE
=
"resultVariable"
;
...
...
@@ -194,6 +196,7 @@ public interface BpmnXMLConstants {
public
static
final
String
ELEMENT_FLOW_CONDITION
=
"conditionExpression"
;
public
static
final
String
ATTRIBUTE_FLOW_SOURCE_REF
=
"sourceRef"
;
public
static
final
String
ATTRIBUTE_FLOW_TARGET_REF
=
"targetRef"
;
public
static
final
String
ATTRIBUTE_FLOW_SKIP_EXPRESSION
=
"skipExpression"
;
public
static
final
String
ELEMENT_TEXT_ANNOTATION
=
"textAnnotation"
;
public
static
final
String
ATTRIBUTE_TEXTFORMAT
=
"textFormat"
;
...
...
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/SequenceFlowXMLConverter.java
浏览文件 @
9a8fd41c
...
...
@@ -42,6 +42,7 @@ public class SequenceFlowXMLConverter extends BaseBpmnXMLConverter {
sequenceFlow
.
setSourceRef
(
xtr
.
getAttributeValue
(
null
,
ATTRIBUTE_FLOW_SOURCE_REF
));
sequenceFlow
.
setTargetRef
(
xtr
.
getAttributeValue
(
null
,
ATTRIBUTE_FLOW_TARGET_REF
));
sequenceFlow
.
setName
(
xtr
.
getAttributeValue
(
null
,
ATTRIBUTE_NAME
));
sequenceFlow
.
setSkipExpression
(
xtr
.
getAttributeValue
(
null
,
ATTRIBUTE_FLOW_SKIP_EXPRESSION
));
parseChildElements
(
getXMLElementName
(),
sequenceFlow
,
model
,
xtr
);
...
...
@@ -53,6 +54,10 @@ 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
()))
{
writeDefaultAttribute
(
ATTRIBUTE_FLOW_SKIP_EXPRESSION
,
sequenceFlow
.
getSkipExpression
(),
xtw
);
}
}
@Override
...
...
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/ServiceTaskXMLConverter.java
浏览文件 @
9a8fd41c
...
...
@@ -67,6 +67,9 @@ public class ServiceTaskXMLConverter extends BaseBpmnXMLConverter {
serviceTask
.
setType
(
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TYPE
));
serviceTask
.
setExtensionId
(
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_SERVICE_EXTENSIONID
));
if
(
StringUtils
.
isNotEmpty
(
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION
)))
{
serviceTask
.
setSkipExpression
(
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION
));
}
parseChildElements
(
getXMLElementName
(),
serviceTask
,
model
,
xtr
);
return
serviceTask
;
...
...
@@ -94,6 +97,10 @@ public class ServiceTaskXMLConverter extends BaseBpmnXMLConverter {
if
(
StringUtils
.
isNotEmpty
(
serviceTask
.
getExtensionId
()))
{
writeQualifiedAttribute
(
ATTRIBUTE_TASK_SERVICE_EXTENSIONID
,
serviceTask
.
getExtensionId
(),
xtw
);
}
if
(
StringUtils
.
isNotEmpty
(
serviceTask
.
getSkipExpression
()))
{
writeQualifiedAttribute
(
ATTRIBUTE_TASK_SERVICE_SKIP_EXPRESSION
,
serviceTask
.
getSkipExpression
(),
xtw
);
}
}
@Override
...
...
modules/activiti-bpmn-converter/src/main/java/org/activiti/bpmn/converter/UserTaskXMLConverter.java
浏览文件 @
9a8fd41c
...
...
@@ -48,7 +48,8 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_PRIORITY
),
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_CANDIDATEUSERS
),
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_CANDIDATEGROUPS
),
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_CATEGORY
)
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_CATEGORY
),
new
ExtensionAttribute
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION
)
);
public
UserTaskXMLConverter
()
{
...
...
@@ -100,6 +101,11 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
userTask
.
getCandidateGroups
().
addAll
(
parseDelimitedList
(
expression
));
}
if
(
StringUtils
.
isNotEmpty
(
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION
)))
{
String
expression
=
xtr
.
getAttributeValue
(
ACTIVITI_EXTENSIONS_NAMESPACE
,
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION
);
userTask
.
setSkipExpression
(
expression
);
}
BpmnXMLUtil
.
addCustomAttributes
(
xtr
,
userTask
,
defaultElementAttributes
,
defaultActivityAttributes
,
defaultUserTaskAttributes
);
...
...
@@ -122,6 +128,10 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
if
(
userTask
.
getPriority
()
!=
null
)
{
writeQualifiedAttribute
(
ATTRIBUTE_TASK_USER_PRIORITY
,
userTask
.
getPriority
().
toString
(),
xtw
);
}
if
(
null
!=
userTask
.
getSkipExpression
())
{
writeQualifiedAttribute
(
ATTRIBUTE_TASK_USER_SKIP_EXPRESSION
,
userTask
.
getSkipExpression
(),
xtw
);
}
// write custom attributes
BpmnXMLUtil
.
writeCustomAttributes
(
userTask
.
getAttributes
().
values
(),
xtw
,
defaultElementAttributes
,
defaultActivityAttributes
,
defaultUserTaskAttributes
);
...
...
modules/activiti-bpmn-converter/src/main/resources/org/activiti/impl/bpmn/parser/Semantic.xsd
浏览文件 @
9a8fd41c
...
...
@@ -1373,6 +1373,7 @@
<xsd:attribute
name=
"sourceRef"
type=
"xsd:IDREF"
use=
"required"
/>
<xsd:attribute
name=
"targetRef"
type=
"xsd:IDREF"
use=
"required"
/>
<xsd:attribute
name=
"isImmediate"
type=
"xsd:boolean"
use=
"optional"
/>
<xsd:attribute
name=
"skipExpression"
type=
"xsd:string"
use=
"optional"
/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...
...
@@ -1383,6 +1384,7 @@
<xsd:extension
base=
"tTask"
>
<xsd:attribute
name=
"implementation"
type=
"tImplementation"
default=
"##WebService"
/>
<xsd:attribute
name=
"operationRef"
type=
"xsd:QName"
use=
"optional"
/>
<xsd:attribute
name=
"skipExpression"
type=
"xsd:string"
use=
"optional"
/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...
...
@@ -1555,6 +1557,7 @@
<xsd:element
ref=
"rendering"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
</xsd:sequence>
<xsd:attribute
name=
"implementation"
type=
"tImplementation"
default=
"##unspecified"
/>
<xsd:attribute
name=
"skipExpression"
type=
"xsd:string"
use=
"optional"
/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...
...
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/SequenceFlow.java
浏览文件 @
9a8fd41c
...
...
@@ -23,6 +23,7 @@ public class SequenceFlow extends FlowElement {
protected
String
conditionExpression
;
protected
String
sourceRef
;
protected
String
targetRef
;
protected
String
skipExpression
;
public
SequenceFlow
()
{
...
...
@@ -51,6 +52,12 @@ public class SequenceFlow extends FlowElement {
public
void
setTargetRef
(
String
targetRef
)
{
this
.
targetRef
=
targetRef
;
}
public
String
getSkipExpression
()
{
return
skipExpression
;
}
public
void
setSkipExpression
(
String
skipExpression
)
{
this
.
skipExpression
=
skipExpression
;
}
public
String
toString
()
{
return
sourceRef
+
" --> "
+
targetRef
;
}
...
...
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/ServiceTask.java
浏览文件 @
9a8fd41c
...
...
@@ -21,7 +21,7 @@ import java.util.List;
public
class
ServiceTask
extends
Task
{
public
static
final
String
MAIL_TASK
=
"mail"
;
protected
String
implementation
;
protected
String
implementationType
;
protected
String
resultVariableName
;
...
...
@@ -30,6 +30,7 @@ public class ServiceTask extends Task {
protected
String
extensionId
;
protected
List
<
FieldExtension
>
fieldExtensions
=
new
ArrayList
<
FieldExtension
>();
protected
List
<
CustomProperty
>
customProperties
=
new
ArrayList
<
CustomProperty
>();
protected
String
skipExpression
;
public
String
getImplementation
()
{
return
implementation
;
...
...
@@ -83,12 +84,20 @@ public class ServiceTask extends Task {
return
extensionId
!=
null
&&
!
extensionId
.
isEmpty
();
}
public
String
getSkipExpression
()
{
return
skipExpression
;
}
public
void
setSkipExpression
(
String
skipExpression
)
{
this
.
skipExpression
=
skipExpression
;
}
public
ServiceTask
clone
()
{
ServiceTask
clone
=
new
ServiceTask
();
clone
.
setValues
(
this
);
return
clone
;
}
public
void
setValues
(
ServiceTask
otherElement
)
{
super
.
setValues
(
otherElement
);
setImplementation
(
otherElement
.
getImplementation
());
...
...
@@ -97,14 +106,14 @@ public class ServiceTask extends Task {
setType
(
otherElement
.
getType
());
setOperationRef
(
otherElement
.
getOperationRef
());
setExtensionId
(
otherElement
.
getExtensionId
());
fieldExtensions
=
new
ArrayList
<
FieldExtension
>();
if
(
otherElement
.
getFieldExtensions
()
!=
null
&&
!
otherElement
.
getFieldExtensions
().
isEmpty
())
{
for
(
FieldExtension
extension
:
otherElement
.
getFieldExtensions
())
{
fieldExtensions
.
add
(
extension
.
clone
());
}
}
customProperties
=
new
ArrayList
<
CustomProperty
>();
if
(
otherElement
.
getCustomProperties
()
!=
null
&&
!
otherElement
.
getCustomProperties
().
isEmpty
())
{
for
(
CustomProperty
property
:
otherElement
.
getCustomProperties
())
{
...
...
modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/UserTask.java
浏览文件 @
9a8fd41c
...
...
@@ -19,7 +19,6 @@ import java.util.List;
import
java.util.Map
;
import
java.util.Set
;
/**
* @author Tijs Rademakers
*/
...
...
@@ -35,7 +34,8 @@ public class UserTask extends Task {
protected
List
<
String
>
candidateGroups
=
new
ArrayList
<
String
>();
protected
List
<
FormProperty
>
formProperties
=
new
ArrayList
<
FormProperty
>();
protected
List
<
ActivitiListener
>
taskListeners
=
new
ArrayList
<
ActivitiListener
>();
protected
String
skipExpression
;
protected
Map
<
String
,
Set
<
String
>>
customUserIdentityLinks
=
new
HashMap
<
String
,
Set
<
String
>>();
protected
Map
<
String
,
Set
<
String
>>
customGroupIdentityLinks
=
new
HashMap
<
String
,
Set
<
String
>>();
...
...
@@ -135,11 +135,17 @@ public class UserTask extends Task {
return
customGroupIdentityLinks
;
}
public
void
setCustomGroupIdentityLinks
(
Map
<
String
,
Set
<
String
>>
customGroupIdentityLinks
)
{
this
.
customGroupIdentityLinks
=
customGroupIdentityLinks
;
public
void
setCustomGroupIdentityLinks
(
Map
<
String
,
Set
<
String
>>
customGroupIdentityLinks
)
{
this
.
customGroupIdentityLinks
=
customGroupIdentityLinks
;
}
public
String
getSkipExpression
()
{
return
skipExpression
;
}
public
void
setSkipExpression
(
String
skipExpression
)
{
this
.
skipExpression
=
skipExpression
;
}
public
UserTask
clone
()
{
UserTask
clone
=
new
UserTask
();
clone
.
setValues
(
this
);
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/BpmnActivityBehavior.java
浏览文件 @
9a8fd41c
...
...
@@ -14,9 +14,11 @@
package
org.activiti.engine.impl.bpmn.behavior
;
import
org.activiti.engine.ActivitiException
;
import
org.activiti.engine.delegate.Expression
;
import
org.activiti.engine.delegate.event.ActivitiEventType
;
import
org.activiti.engine.delegate.event.impl.ActivitiEventBuilder
;
import
org.activiti.engine.impl.Condition
;
import
org.activiti.engine.impl.bpmn.helper.SkipExpressionUtil
;
import
org.activiti.engine.impl.bpmn.parser.BpmnParse
;
import
org.activiti.engine.impl.context.Context
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntity
;
...
...
@@ -118,12 +120,19 @@ public class BpmnActivityBehavior implements Serializable {
List
<
PvmTransition
>
outgoingTransitions
=
execution
.
getActivity
().
getOutgoingTransitions
();
for
(
PvmTransition
outgoingTransition
:
outgoingTransitions
)
{
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
);
Expression
skipExpression
=
outgoingTransition
.
getSkipExpression
();
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
)){
transitionsToTake
.
add
(
outgoingTransition
);
}
}
if
(
transitionsToTake
.
size
()
==
1
)
{
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskDelegateExpressionActivityBehavior.java
浏览文件 @
9a8fd41c
...
...
@@ -20,6 +20,7 @@ import org.activiti.engine.delegate.Expression;
import
org.activiti.engine.delegate.JavaDelegate
;
import
org.activiti.engine.impl.bpmn.helper.ClassDelegate
;
import
org.activiti.engine.impl.bpmn.helper.ErrorPropagation
;
import
org.activiti.engine.impl.bpmn.helper.SkipExpressionUtil
;
import
org.activiti.engine.impl.bpmn.parser.FieldDeclaration
;
import
org.activiti.engine.impl.context.Context
;
import
org.activiti.engine.impl.delegate.ActivityBehaviorInvocation
;
...
...
@@ -41,10 +42,12 @@ import org.activiti.engine.impl.pvm.delegate.SignallableActivityBehavior;
public
class
ServiceTaskDelegateExpressionActivityBehavior
extends
TaskActivityBehavior
{
protected
Expression
expression
;
protected
Expression
skipExpression
;
private
final
List
<
FieldDeclaration
>
fieldDeclarations
;
public
ServiceTaskDelegateExpressionActivityBehavior
(
Expression
expression
,
List
<
FieldDeclaration
>
fieldDeclarations
)
{
public
ServiceTaskDelegateExpressionActivityBehavior
(
Expression
expression
,
Expression
skipExpression
,
List
<
FieldDeclaration
>
fieldDeclarations
)
{
this
.
expression
=
expression
;
this
.
skipExpression
=
skipExpression
;
this
.
fieldDeclarations
=
fieldDeclarations
;
}
...
...
@@ -60,27 +63,29 @@ public class ServiceTaskDelegateExpressionActivityBehavior extends TaskActivityB
public
void
execute
(
ActivityExecution
execution
)
throws
Exception
{
try
{
boolean
isSkipExpressionEnabled
=
SkipExpressionUtil
.
isSkipExpressionEnabled
(
execution
,
skipExpression
);
if
(!
isSkipExpressionEnabled
||
(
isSkipExpressionEnabled
&&
!
SkipExpressionUtil
.
skipFlowElement
(
execution
,
skipExpression
)))
{
// Note: we can't cache the result of the expression, because the
// execution can change: eg.
// delegateExpression='${mySpringBeanFactory.randomSpringBean()}'
Object
delegate
=
expression
.
getValue
(
execution
);
ClassDelegate
.
applyFieldDeclaration
(
fieldDeclarations
,
delegate
);
// Note: we can't cache the result of the expression, because the
// execution can change: eg. delegateExpression='${mySpringBeanFactory.randomSpringBean()}'
Object
delegate
=
expression
.
getValue
(
execution
);
ClassDelegate
.
applyFieldDeclaration
(
fieldDeclarations
,
delegate
);
if
(
delegate
instanceof
ActivityBehavior
)
{
Context
.
getProcessEngineConfiguration
().
getDelegateInterceptor
()
.
handleInvocation
(
new
ActivityBehaviorInvocation
((
ActivityBehavior
)
delegate
,
execution
));
if
(
delegate
instanceof
ActivityBehavior
)
{
Context
.
getProcessEngineConfiguration
()
.
getDelegateInterceptor
()
.
handleInvocation
(
new
ActivityBehaviorInvocation
((
ActivityBehavior
)
delegate
,
execution
));
}
else
if
(
delegate
instanceof
JavaDelegate
)
{
Context
.
getProcessEngineConfiguration
()
.
getDelegateInterceptor
()
.
handleInvocation
(
new
JavaDelegateInvocation
((
JavaDelegate
)
delegate
,
execution
));
leave
(
execution
);
}
else
if
(
delegate
instanceof
JavaDelegate
)
{
Context
.
getProcessEngineConfiguration
().
getDelegateInterceptor
().
handleInvocation
(
new
JavaDelegateInvocation
((
JavaDelegate
)
delegate
,
execution
));
leave
(
execution
);
}
else
{
throw
new
ActivitiIllegalArgumentException
(
"Delegate expression "
+
expression
+
" did neither resolve to an implementation of "
+
ActivityBehavior
.
class
+
" nor "
+
JavaDelegate
.
class
);
}
}
else
{
throw
new
ActivitiIllegalArgumentException
(
"Delegate expression "
+
expression
+
" did neither resolve to an implementation of "
+
ActivityBehavior
.
class
+
" nor "
+
JavaDelegate
.
class
);
leave
(
execution
);
}
}
catch
(
Exception
exc
)
{
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/ServiceTaskExpressionActivityBehavior.java
浏览文件 @
9a8fd41c
...
...
@@ -13,15 +13,16 @@
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
;
import
org.activiti.engine.impl.bpmn.helper.SkipExpressionUtil
;
import
org.activiti.engine.impl.pvm.delegate.ActivityExecution
;
/**
* ActivityBehavior that evaluates an expression when executed. Optionally, it
sets the result
* of the expression as a variable on the execution.
* ActivityBehavior that evaluates an expression when executed. Optionally, it
*
sets the result
of the expression as a variable on the execution.
*
* @author Tom Baeyens
* @author Christian Stettler
...
...
@@ -32,21 +33,28 @@ import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
public
class
ServiceTaskExpressionActivityBehavior
extends
TaskActivityBehavior
{
protected
Expression
expression
;
protected
Expression
skipExpression
;
protected
String
resultVariable
;
public
ServiceTaskExpressionActivityBehavior
(
Expression
expression
,
String
resultVariable
)
{
public
ServiceTaskExpressionActivityBehavior
(
Expression
expression
,
Expression
skipExpression
,
String
resultVariable
)
{
this
.
expression
=
expression
;
this
.
skipExpression
=
skipExpression
;
this
.
resultVariable
=
resultVariable
;
}
public
void
execute
(
ActivityExecution
execution
)
throws
Exception
{
Object
value
=
null
;
try
{
value
=
expression
.
getValue
(
execution
);
if
(
resultVariable
!=
null
)
{
execution
.
setVariable
(
resultVariable
,
value
);
}
leave
(
execution
);
Object
value
=
null
;
try
{
boolean
isSkipExpressionEnabled
=
SkipExpressionUtil
.
isSkipExpressionEnabled
(
execution
,
skipExpression
);
if
(!
isSkipExpressionEnabled
||
(
isSkipExpressionEnabled
&&
!
SkipExpressionUtil
.
skipFlowElement
(
execution
,
skipExpression
)))
{
value
=
expression
.
getValue
(
execution
);
if
(
resultVariable
!=
null
)
{
execution
.
setVariable
(
resultVariable
,
value
);
}
}
leave
(
execution
);
}
catch
(
Exception
exc
)
{
Throwable
cause
=
exc
;
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java
浏览文件 @
9a8fd41c
...
...
@@ -26,6 +26,7 @@ import org.activiti.engine.delegate.Expression;
import
org.activiti.engine.delegate.TaskListener
;
import
org.activiti.engine.delegate.event.ActivitiEventType
;
import
org.activiti.engine.delegate.event.impl.ActivitiEventBuilder
;
import
org.activiti.engine.impl.bpmn.helper.SkipExpressionUtil
;
import
org.activiti.engine.impl.calendar.BusinessCalendar
;
import
org.activiti.engine.impl.calendar.DueDateBusinessCalendar
;
import
org.activiti.engine.impl.context.Context
;
...
...
@@ -131,6 +132,12 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
}
task
.
fireEvent
(
TaskListener
.
EVENTNAME_CREATE
);
Expression
skipExpression
=
taskDefinition
.
getSkipExpression
();
if
(
SkipExpressionUtil
.
isSkipExpressionEnabled
(
execution
,
skipExpression
)
&&
SkipExpressionUtil
.
skipFlowElement
(
execution
,
skipExpression
))
{
leave
(
execution
);
}
}
public
void
signal
(
ActivityExecution
execution
,
String
signalName
,
Object
signalData
)
throws
Exception
{
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/ClassDelegate.java
浏览文件 @
9a8fd41c
...
...
@@ -22,6 +22,7 @@ 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.JavaDelegate
;
...
...
@@ -54,14 +55,16 @@ public class ClassDelegate extends AbstractBpmnActivityBehavior implements TaskL
protected
ExecutionListener
executionListenerInstance
;
protected
TaskListener
taskListenerInstance
;
protected
ActivityBehavior
activityBehaviorInstance
;
public
ClassDelegate
(
String
className
,
List
<
FieldDeclaration
>
fieldDeclarations
)
{
protected
Expression
skipExpression
;
public
ClassDelegate
(
String
className
,
List
<
FieldDeclaration
>
fieldDeclarations
,
Expression
skipExpression
)
{
this
.
className
=
className
;
this
.
fieldDeclarations
=
fieldDeclarations
;
this
.
skipExpression
=
skipExpression
;
}
public
ClassDelegate
(
Class
<
?>
clazz
,
List
<
FieldDeclaration
>
fieldDeclarations
)
{
this
(
clazz
.
getName
(),
fieldDeclarations
);
public
ClassDelegate
(
Class
<
?
>
clazz
,
List
<
FieldDeclaration
>
fieldDeclarations
,
Expression
skipExpression
)
{
this
(
clazz
.
getName
(),
fieldDeclarations
,
skipExpression
);
}
// Execution listener
...
...
@@ -110,13 +113,17 @@ public class ClassDelegate extends AbstractBpmnActivityBehavior implements TaskL
// Activity Behavior
public
void
execute
(
ActivityExecution
execution
)
throws
Exception
{
if
(
activityBehaviorInstance
==
null
)
{
activityBehaviorInstance
=
getActivityBehaviorInstance
(
execution
);
}
try
{
activityBehaviorInstance
.
execute
(
execution
);
}
catch
(
BpmnError
error
)
{
ErrorPropagation
.
propagateError
(
error
,
execution
);
boolean
isSkipExpressionEnabled
=
SkipExpressionUtil
.
isSkipExpressionEnabled
(
execution
,
skipExpression
);
if
(!
isSkipExpressionEnabled
||
(
isSkipExpressionEnabled
&&
!
SkipExpressionUtil
.
skipFlowElement
(
execution
,
skipExpression
)))
{
if
(
activityBehaviorInstance
==
null
)
{
activityBehaviorInstance
=
getActivityBehaviorInstance
(
execution
);
}
try
{
activityBehaviorInstance
.
execute
(
execution
);
}
catch
(
BpmnError
error
)
{
ErrorPropagation
.
propagateError
(
error
,
execution
);
}
}
}
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/helper/SkipExpressionUtil.java
0 → 100644
浏览文件 @
9a8fd41c
package
org.activiti.engine.impl.bpmn.helper
;
import
org.activiti.engine.ActivitiIllegalArgumentException
;
import
org.activiti.engine.delegate.Expression
;
import
org.activiti.engine.impl.pvm.delegate.ActivityExecution
;
public
class
SkipExpressionUtil
{
public
static
boolean
isSkipExpressionEnabled
(
ActivityExecution
execution
,
Expression
skipExpression
)
{
if
(
null
==
skipExpression
)
{
return
false
;
}
final
String
skipExpressionEnabledVariable
=
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
;
Object
isSkipExpressionEnabled
=
execution
.
getVariable
(
skipExpressionEnabledVariable
);
if
(
null
==
isSkipExpressionEnabled
)
{
return
false
;
}
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
)
{
Object
value
=
skipExpression
.
getValue
(
execution
);
if
(
value
instanceof
Boolean
)
{
return
((
Boolean
)
value
).
booleanValue
();
}
else
{
throw
new
ActivitiIllegalArgumentException
(
"Skip expression does not resolve to a boolean: "
+
skipExpression
.
getExpressionText
());
}
}
}
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java
浏览文件 @
9a8fd41c
...
...
@@ -89,9 +89,9 @@ import org.activiti.engine.impl.task.TaskDefinition;
import
org.apache.commons.lang3.StringUtils
;
/**
* Default implementation of the {@link ActivityBehaviorFactory}.
*
Used when no custom {@link ActivityBehaviorFactory} is injected on
*
the
{@link ProcessEngineConfigurationImpl}.
* Default implementation of the {@link ActivityBehaviorFactory}.
Used when no
*
custom {@link ActivityBehaviorFactory} is injected on the
* {@link ProcessEngineConfigurationImpl}.
*
* @author Joram Barrez
*/
...
...
@@ -128,17 +128,43 @@ public class DefaultActivityBehaviorFactory extends AbstractBehaviorFactory impl
// Service task
public
ClassDelegate
createClassDelegateServiceTask
(
ServiceTask
serviceTask
)
{
return
new
ClassDelegate
(
serviceTask
.
getImplementation
(),
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
()));
Expression
skipExpression
;
if
(
StringUtils
.
isNotEmpty
(
serviceTask
.
getSkipExpression
()))
{
skipExpression
=
expressionManager
.
createExpression
(
serviceTask
.
getSkipExpression
());
}
else
{
skipExpression
=
null
;
}
return
new
ClassDelegate
(
serviceTask
.
getImplementation
(),
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
()),
skipExpression
);
}
public
ServiceTaskDelegateExpressionActivityBehavior
createServiceTaskDelegateExpressionActivityBehavior
(
ServiceTask
serviceTask
)
{
Expression
delegateExpression
=
expressionManager
.
createExpression
(
serviceTask
.
getImplementation
());
return
new
ServiceTaskDelegateExpressionActivityBehavior
(
delegateExpression
,
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
()));
Expression
skipExpression
;
if
(
StringUtils
.
isNotEmpty
(
serviceTask
.
getSkipExpression
()))
{
skipExpression
=
expressionManager
.
createExpression
(
serviceTask
.
getSkipExpression
());
}
else
{
skipExpression
=
null
;
}
return
new
ServiceTaskDelegateExpressionActivityBehavior
(
delegateExpression
,
skipExpression
,
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
()));
}
public
ServiceTaskExpressionActivityBehavior
createServiceTaskExpressionActivityBehavior
(
ServiceTask
serviceTask
)
{
Expression
expression
=
expressionManager
.
createExpression
(
serviceTask
.
getImplementation
());
return
new
ServiceTaskExpressionActivityBehavior
(
expression
,
serviceTask
.
getResultVariableName
());
Expression
skipExpression
;
if
(
StringUtils
.
isNotEmpty
(
serviceTask
.
getSkipExpression
()))
{
skipExpression
=
expressionManager
.
createExpression
(
serviceTask
.
getSkipExpression
());
}
else
{
skipExpression
=
null
;
}
return
new
ServiceTaskExpressionActivityBehavior
(
expression
,
skipExpression
,
serviceTask
.
getResultVariableName
());
}
public
WebServiceActivityBehavior
createWebServiceActivityBehavior
(
ServiceTask
serviceTask
)
{
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultListenerFactory.java
浏览文件 @
9a8fd41c
...
...
@@ -65,7 +65,7 @@ public class DefaultListenerFactory extends AbstractBehaviorFactory implements L
}
public
TaskListener
createClassDelegateTaskListener
(
ActivitiListener
activitiListener
)
{
return
new
ClassDelegate
(
activitiListener
.
getImplementation
(),
createFieldDeclarations
(
activitiListener
.
getFieldExtensions
()));
return
new
ClassDelegate
(
activitiListener
.
getImplementation
(),
createFieldDeclarations
(
activitiListener
.
getFieldExtensions
())
,
null
);
}
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
()));
return
new
ClassDelegate
(
activitiListener
.
getImplementation
(),
createFieldDeclarations
(
activitiListener
.
getFieldExtensions
())
,
null
);
}
public
ExecutionListener
createExpressionExecutionListener
(
ActivitiListener
activitiListener
)
{
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SequenceFlowParseHandler.java
浏览文件 @
9a8fd41c
...
...
@@ -14,8 +14,10 @@ package org.activiti.engine.impl.bpmn.parser.handler;
import
org.activiti.bpmn.model.BaseElement
;
import
org.activiti.bpmn.model.SequenceFlow
;
import
org.activiti.engine.delegate.Expression
;
import
org.activiti.engine.impl.Condition
;
import
org.activiti.engine.impl.bpmn.parser.BpmnParse
;
import
org.activiti.engine.impl.el.ExpressionManager
;
import
org.activiti.engine.impl.el.UelExpressionCondition
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.pvm.process.ScopeImpl
;
...
...
@@ -41,7 +43,18 @@ public class SequenceFlowParseHandler extends AbstractBpmnParseHandler<SequenceF
ActivityImpl
sourceActivity
=
scope
.
findActivity
(
sequenceFlow
.
getSourceRef
());
ActivityImpl
destinationActivity
=
scope
.
findActivity
(
sequenceFlow
.
getTargetRef
());
TransitionImpl
transition
=
sourceActivity
.
createOutgoingTransition
(
sequenceFlow
.
getId
());
Expression
skipExpression
;
if
(
StringUtils
.
isNotEmpty
(
sequenceFlow
.
getSkipExpression
()))
{
ExpressionManager
expressionManager
=
bpmnParse
.
getExpressionManager
();
skipExpression
=
expressionManager
.
createExpression
(
sequenceFlow
.
getSkipExpression
());
}
else
{
skipExpression
=
null
;
}
TransitionImpl
transition
=
sourceActivity
.
createOutgoingTransition
(
sequenceFlow
.
getId
(),
skipExpression
);
bpmnParse
.
getSequenceFlows
().
put
(
sequenceFlow
.
getId
(),
transition
);
transition
.
setProperty
(
"name"
,
sequenceFlow
.
getName
());
transition
.
setProperty
(
"documentation"
,
sequenceFlow
.
getDocumentation
());
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java
浏览文件 @
9a8fd41c
...
...
@@ -129,6 +129,10 @@ public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserT
taskDefinition
.
addCustomGroupIdentityLinkExpression
(
customGroupIdentityLinkType
,
groupIdentityLinkExpression
);
}
if
(
StringUtils
.
isNotEmpty
(
userTask
.
getSkipExpression
()))
{
taskDefinition
.
setSkipExpression
(
expressionManager
.
createExpression
(
userTask
.
getSkipExpression
()));
}
return
taskDefinition
;
}
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/ProcessDefinitionBuilder.java
浏览文件 @
9a8fd41c
...
...
@@ -81,7 +81,7 @@ public class ProcessDefinitionBuilder {
throw
new
PvmException
(
"destinationActivityId is null"
);
}
ActivityImpl
activity
=
getActivity
();
transition
=
activity
.
createOutgoingTransition
(
transitionId
);
transition
=
activity
.
createOutgoingTransition
(
transitionId
,
null
);
unresolvedTransitions
.
add
(
new
Object
[]{
transition
,
destinationActivityId
});
processElement
=
transition
;
return
this
;
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/PvmTransition.java
浏览文件 @
9a8fd41c
...
...
@@ -13,6 +13,8 @@
package
org.activiti.engine.impl.pvm
;
import
org.activiti.engine.delegate.Expression
;
/**
...
...
@@ -23,4 +25,6 @@ public interface PvmTransition extends PvmProcessElement {
PvmActivity
getSource
();
PvmActivity
getDestination
();
Expression
getSkipExpression
();
}
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/process/ActivityImpl.java
浏览文件 @
9a8fd41c
...
...
@@ -18,6 +18,7 @@ import java.util.HashMap;
import
java.util.List
;
import
java.util.Map
;
import
org.activiti.engine.delegate.Expression
;
import
org.activiti.engine.impl.pvm.PvmActivity
;
import
org.activiti.engine.impl.pvm.PvmException
;
import
org.activiti.engine.impl.pvm.PvmTransition
;
...
...
@@ -52,7 +53,7 @@ public class ActivityImpl extends ScopeImpl implements PvmActivity, HasDIBounds
}
public
TransitionImpl
createOutgoingTransition
()
{
return
createOutgoingTransition
(
null
);
return
createOutgoingTransition
(
null
,
null
);
}
public
String
getFailedJobRetryTimeCycleValue
()
{
return
failedJobRetryTimeCycleValue
;
...
...
@@ -61,8 +62,8 @@ public class ActivityImpl extends ScopeImpl implements PvmActivity, HasDIBounds
this
.
failedJobRetryTimeCycleValue
=
failedJobRetryTimeCycleValue
;
}
public
TransitionImpl
createOutgoingTransition
(
String
transitionId
)
{
TransitionImpl
transition
=
new
TransitionImpl
(
transitionId
,
processDefinition
);
public
TransitionImpl
createOutgoingTransition
(
String
transitionId
,
Expression
skipExpression
)
{
TransitionImpl
transition
=
new
TransitionImpl
(
transitionId
,
skipExpression
,
processDefinition
);
transition
.
setSource
(
this
);
outgoingTransitions
.
add
(
transition
);
...
...
modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/process/TransitionImpl.java
浏览文件 @
9a8fd41c
...
...
@@ -18,6 +18,7 @@ import java.util.Collections;
import
java.util.List
;
import
org.activiti.engine.delegate.ExecutionListener
;
import
org.activiti.engine.delegate.Expression
;
import
org.activiti.engine.impl.pvm.PvmTransition
;
...
...
@@ -31,12 +32,14 @@ public class TransitionImpl extends ProcessElementImpl implements PvmTransition
protected
ActivityImpl
source
;
protected
ActivityImpl
destination
;
protected
List
<
ExecutionListener
>
executionListeners
;
protected
Expression
skipExpression
;
/** Graphical information: a list of waypoints: x1, y1, x2, y2, x3, y3, .. */
protected
List
<
Integer
>
waypoints
=
new
ArrayList
<
Integer
>();
public
TransitionImpl
(
String
id
,
ProcessDefinitionImpl
processDefinition
)
{
public
TransitionImpl
(
String
id
,
Expression
skipExpression
,
ProcessDefinitionImpl
processDefinition
)
{
super
(
id
,
processDefinition
);
this
.
skipExpression
=
skipExpression
;
}
public
ActivityImpl
getSource
()
{
...
...
@@ -88,5 +91,12 @@ public class TransitionImpl extends ProcessElementImpl implements PvmTransition
public
void
setWaypoints
(
List
<
Integer
>
waypoints
)
{
this
.
waypoints
=
waypoints
;
}
public
Expression
getSkipExpression
()
{
return
skipExpression
;
}
public
void
setSkipExpression
(
Expression
skipExpression
)
{
this
.
skipExpression
=
skipExpression
;
}
}
modules/activiti-engine/src/main/java/org/activiti/engine/impl/task/TaskDefinition.java
浏览文件 @
9a8fd41c
...
...
@@ -46,7 +46,8 @@ public class TaskDefinition implements Serializable {
protected
Expression
priorityExpression
;
protected
Expression
categoryExpression
;
protected
Map
<
String
,
Set
<
Expression
>>
customUserIdentityLinkExpressions
=
new
HashMap
<
String
,
Set
<
Expression
>>();
protected
Map
<
String
,
Set
<
Expression
>>
customGroupIdentityLinkExpressions
=
new
HashMap
<
String
,
Set
<
Expression
>>();
protected
Map
<
String
,
Set
<
Expression
>>
customGroupIdentityLinkExpressions
=
new
HashMap
<
String
,
Set
<
Expression
>>();
protected
Expression
skipExpression
;
// form fields
protected
TaskFormHandler
taskFormHandler
;
...
...
@@ -204,4 +205,12 @@ public class TaskDefinition implements Serializable {
}
}
public
Expression
getSkipExpression
()
{
return
skipExpression
;
}
public
void
setSkipExpression
(
Expression
skipExpression
)
{
this
.
skipExpression
=
skipExpression
;
}
}
modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java
浏览文件 @
9a8fd41c
...
...
@@ -165,7 +165,7 @@ public class TestActivityBehaviorFactory extends AbstractBehaviorFactory impleme
}
else
if
(
serviceTask
.
getImplementation
()
!=
null
&&
mockedClassDelegatesMapping
.
containsKey
(
serviceTask
.
getImplementation
()))
{
return
new
ClassDelegate
(
mockedClassDelegatesMapping
.
get
(
serviceTask
.
getImplementation
()),
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
()));
createFieldDeclarations
(
serviceTask
.
getFieldExtensions
())
,
null
);
}
...
...
@@ -176,7 +176,7 @@ public class TestActivityBehaviorFactory extends AbstractBehaviorFactory impleme
List
<
FieldDeclaration
>
fieldDeclarations
=
new
ArrayList
<
FieldDeclaration
>();
fieldDeclarations
.
add
(
new
FieldDeclaration
(
"name"
,
Expression
.
class
.
getName
(),
new
FixedValue
(
serviceTask
.
getImplementation
())));
return
new
ClassDelegate
(
NoOpServiceTask
.
class
,
fieldDeclarations
);
return
new
ClassDelegate
(
NoOpServiceTask
.
class
,
fieldDeclarations
,
null
);
}
@Override
...
...
modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/sequenceflow/ConditionalSequenceFlowTest.java
浏览文件 @
9a8fd41c
...
...
@@ -13,6 +13,7 @@
package
org.activiti.engine.test.bpmn.sequenceflow
;
import
java.util.HashMap
;
import
java.util.Map
;
import
org.activiti.engine.impl.test.PluggableActivitiTestCase
;
...
...
@@ -39,4 +40,21 @@ public class ConditionalSequenceFlowTest extends PluggableActivitiTestCase {
assertEquals
(
"task right"
,
task
.
getName
());
}
@Deployment
public
void
testSkipExpression
()
{
Map
<
String
,
Object
>
variables
=
new
HashMap
<
String
,
Object
>();
variables
.
put
(
"input"
,
"right"
);
variables
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables
.
put
(
"skipLeft"
,
true
);
variables
.
put
(
"skipRight"
,
false
);
ProcessInstance
pi
=
runtimeService
.
startProcessInstanceByKey
(
"testSkipExpression"
,
variables
);
Task
task
=
taskService
.
createTaskQuery
()
.
processInstanceId
(
pi
.
getId
())
.
singleResult
();
assertEquals
(
"task left"
,
task
.
getName
());
}
}
\ No newline at end of file
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/ExpressionServiceTaskTest.java
浏览文件 @
9a8fd41c
...
...
@@ -20,6 +20,29 @@ public class ExpressionServiceTaskTest extends PluggableActivitiTestCase {
assertEquals
(
"ok"
,
runtimeService
.
getVariable
(
pi
.
getId
(),
"result"
));
}
@Deployment
public
void
testSetServiceResultToProcessVariablesWithSkipExpression
()
{
Map
<
String
,
Object
>
variables
=
new
HashMap
<
String
,
Object
>();
variables
.
put
(
"bean"
,
new
ValueBean
(
"ok"
));
variables
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables
.
put
(
"skip"
,
false
);
ProcessInstance
pi
=
runtimeService
.
startProcessInstanceByKey
(
"setServiceResultToProcessVariablesWithSkipExpression"
,
variables
);
assertEquals
(
"ok"
,
runtimeService
.
getVariable
(
pi
.
getId
(),
"result"
));
Map
<
String
,
Object
>
variables2
=
new
HashMap
<
String
,
Object
>();
variables2
.
put
(
"bean"
,
new
ValueBean
(
"ok"
));
variables2
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables2
.
put
(
"skip"
,
true
);
ProcessInstance
pi2
=
runtimeService
.
startProcessInstanceByKey
(
"setServiceResultToProcessVariablesWithSkipExpression"
,
variables2
);
assertEquals
(
null
,
runtimeService
.
getVariable
(
pi2
.
getId
(),
"result"
));
Map
<
String
,
Object
>
variables3
=
new
HashMap
<
String
,
Object
>();
variables3
.
put
(
"bean"
,
new
ValueBean
(
"ok"
));
variables3
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
ProcessInstance
pi3
=
runtimeService
.
startProcessInstanceByKey
(
"setServiceResultToProcessVariablesWithSkipExpression"
,
variables2
);
assertEquals
(
null
,
runtimeService
.
getVariable
(
pi3
.
getId
(),
"result"
));
}
@Deployment
public
void
testBackwardsCompatibleExpression
()
{
Map
<
String
,
Object
>
variables
=
new
HashMap
<
String
,
Object
>();
...
...
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/JavaServiceTaskTest.java
浏览文件 @
9a8fd41c
...
...
@@ -71,6 +71,40 @@ public class JavaServiceTaskTest extends PluggableActivitiTestCase {
assertEquals
(
"elam :si redneg ruoY"
,
runtimeService
.
getVariable
(
execution
.
getId
(),
"var1"
));
}
@Deployment
public
void
testExpressionFieldInjectionWithSkipExpression
()
{
Map
<
String
,
Object
>
vars
=
new
HashMap
<
String
,
Object
>();
vars
.
put
(
"name"
,
"kermit"
);
vars
.
put
(
"gender"
,
"male"
);
vars
.
put
(
"genderBean"
,
new
GenderBean
());
vars
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
vars
.
put
(
"skip"
,
false
);
ProcessInstance
pi
=
runtimeService
.
startProcessInstanceByKey
(
"expressionFieldInjectionWithSkipExpression"
,
vars
);
Execution
execution
=
runtimeService
.
createExecutionQuery
()
.
processInstanceId
(
pi
.
getId
())
.
activityId
(
"waitState"
)
.
singleResult
();
assertEquals
(
"timrek .rM olleH"
,
runtimeService
.
getVariable
(
execution
.
getId
(),
"var2"
));
assertEquals
(
"elam :si redneg ruoY"
,
runtimeService
.
getVariable
(
execution
.
getId
(),
"var1"
));
Map
<
String
,
Object
>
vars2
=
new
HashMap
<
String
,
Object
>();
vars2
.
put
(
"name"
,
"kermit"
);
vars2
.
put
(
"gender"
,
"male"
);
vars2
.
put
(
"genderBean"
,
new
GenderBean
());
vars2
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
vars2
.
put
(
"skip"
,
true
);
ProcessInstance
pi2
=
runtimeService
.
startProcessInstanceByKey
(
"expressionFieldInjectionWithSkipExpression"
,
vars2
);
Execution
execution2
=
runtimeService
.
createExecutionQuery
()
.
processInstanceId
(
pi2
.
getId
())
.
activityId
(
"waitState"
)
.
singleResult
();
assertEquals
(
null
,
execution2
);
}
@Deployment
public
void
testUnexistingClassDelegation
()
{
try
{
...
...
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/servicetask/MethodExpressionServiceTaskTest.java
浏览文件 @
9a8fd41c
...
...
@@ -22,4 +22,24 @@ public class MethodExpressionServiceTaskTest extends PluggableActivitiTestCase {
assertEquals
(
"ok"
,
runtimeService
.
getVariable
(
pi
.
getId
(),
"result"
));
}
@Deployment
public
void
testSetServiceResultToProcessVariablesWithSkipExpression
()
{
Map
<
String
,
Object
>
variables
=
new
HashMap
<
String
,
Object
>();
variables
.
put
(
"okReturningService"
,
new
OkReturningService
());
variables
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
false
);
ProcessInstance
pi
=
runtimeService
.
startProcessInstanceByKey
(
"setServiceResultToProcessVariablesWithSkipExpression"
,
variables
);
assertEquals
(
"ok"
,
runtimeService
.
getVariable
(
pi
.
getId
(),
"result"
));
Map
<
String
,
Object
>
variables2
=
new
HashMap
<
String
,
Object
>();
variables2
.
put
(
"okReturningService"
,
new
OkReturningService
());
variables2
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables2
.
put
(
"skip"
,
true
);
ProcessInstance
pi2
=
runtimeService
.
startProcessInstanceByKey
(
"setServiceResultToProcessVariablesWithSkipExpression"
,
variables2
);
assertEquals
(
null
,
runtimeService
.
getVariable
(
pi2
.
getId
(),
"result"
));
}
}
\ No newline at end of file
modules/activiti-engine/src/test/java/org/activiti/examples/bpmn/usertask/SkipExpressionUserTaskTest.java
0 → 100644
浏览文件 @
9a8fd41c
package
org.activiti.examples.bpmn.usertask
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
org.activiti.engine.impl.test.PluggableActivitiTestCase
;
import
org.activiti.engine.runtime.ProcessInstance
;
import
org.activiti.engine.task.Task
;
import
org.activiti.engine.test.Deployment
;
public
class
SkipExpressionUserTaskTest
extends
PluggableActivitiTestCase
{
@Deployment
public
void
test
()
{
ProcessInstance
pi
=
runtimeService
.
startProcessInstanceByKey
(
"skipExpressionUserTask"
);
List
<
Task
>
tasks
=
taskService
.
createTaskQuery
().
list
();
assertEquals
(
1
,
tasks
.
size
());
taskService
.
complete
(
tasks
.
get
(
0
).
getId
());
assertEquals
(
0
,
taskService
.
createTaskQuery
().
list
().
size
());
Map
<
String
,
Object
>
variables2
=
new
HashMap
<
String
,
Object
>();
variables2
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables2
.
put
(
"skip"
,
false
);
ProcessInstance
pi2
=
runtimeService
.
startProcessInstanceByKey
(
"skipExpressionUserTask"
,
variables2
);
List
<
Task
>
tasks2
=
taskService
.
createTaskQuery
().
list
();
assertEquals
(
1
,
tasks2
.
size
());
taskService
.
complete
(
tasks2
.
get
(
0
).
getId
());
assertEquals
(
0
,
taskService
.
createTaskQuery
().
list
().
size
());
Map
<
String
,
Object
>
variables3
=
new
HashMap
<
String
,
Object
>();
variables3
.
put
(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
,
true
);
variables3
.
put
(
"skip"
,
true
);
ProcessInstance
pi3
=
runtimeService
.
startProcessInstanceByKey
(
"skipExpressionUserTask"
,
variables3
);
List
<
Task
>
tasks3
=
taskService
.
createTaskQuery
().
list
();
assertEquals
(
0
,
tasks3
.
size
());
}
}
modules/activiti-engine/src/test/resources/org/activiti/engine/test/bpmn/sequenceflow/ConditionalSequenceFlowTest.testSkipExpression.bpmn20.xml
0 → 100644
浏览文件 @
9a8fd41c
<?xml version="1.0" encoding="UTF-8"?>
<definitions
id=
"definitions"
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:activiti=
"http://activiti.org/bpmn"
targetNamespace=
"Examples"
>
<process
id=
"testSkipExpression"
>
<startEvent
id=
"theStart"
/>
<sequenceFlow
id=
"flow1"
sourceRef=
"theStart"
targetRef=
"task1"
activiti:skipExpression=
"${skipLeft}"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[${input == 'left'}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow
id=
"flow2"
sourceRef=
"theStart"
targetRef=
"task2"
activiti:skipExpression=
"${skipRight}"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[${input == 'right'}]]>
</conditionExpression>
</sequenceFlow>
<userTask
id=
"task1"
name=
"task left"
/>
<userTask
id=
"task2"
name=
"task right"
/>
</process>
</definitions>
\ No newline at end of file
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/ExpressionServiceTaskTest.testSetServiceResultToProcessVariablesWithSkipExpression.bpmn20.xml
0 → 100644
浏览文件 @
9a8fd41c
<?xml version="1.0" encoding="UTF-8"?>
<definitions
id=
"definitions"
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti=
"http://activiti.org/bpmn"
targetNamespace=
"Examples"
>
<process
id=
"setServiceResultToProcessVariablesWithSkipExpression"
>
<startEvent
id=
"theStart"
/>
<sequenceFlow
sourceRef=
"theStart"
targetRef=
"valueExpressionServiceWithResultVariableNameSet"
/>
<serviceTask
id=
"valueExpressionServiceWithResultVariableNameSet"
activiti:resultVariable=
"result"
activiti:expression=
"#{bean.value}"
activiti:skipExpression=
"${execution.getVariable('skip')}"
/>
<sequenceFlow
sourceRef=
"valueExpressionServiceWithResultVariableNameSet"
targetRef=
"valueExpressionServiceWithoutResultVariableNameSet"
/>
<serviceTask
id=
"valueExpressionServiceWithoutResultVariableNameSet"
activiti:expression=
"#{bean.value}"
/>
<sequenceFlow
sourceRef=
"valueExpressionServiceWithoutResultVariableNameSet"
targetRef=
"waitState"
/>
<userTask
id=
"waitState"
/>
<sequenceFlow
sourceRef=
"waitState"
targetRef=
"theEnd"
/>
<endEvent
id=
"theEnd"
/>
</process>
</definitions>
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/JavaServiceTaskTest.testExpressionFieldInjectionWithSkipExpression.bpmn20.xml
0 → 100644
浏览文件 @
9a8fd41c
<?xml version="1.0" encoding="UTF-8"?>
<definitions
id=
"definitions"
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti=
"http://activiti.org/bpmn"
targetNamespace=
"Examples"
>
<process
id=
"expressionFieldInjectionWithSkipExpression"
>
<startEvent
id=
"theStart"
/>
<sequenceFlow
id=
"flow1"
sourceRef=
"theStart"
targetRef=
"javaService"
/>
<serviceTask
id=
"javaService"
name=
"Java service invocation"
activiti:class=
"org.activiti.examples.bpmn.servicetask.ReverseStringsFieldInjected"
activiti:skipExpression=
"${execution.getVariable('skip')}"
>
<extensionElements>
<activiti:field
name=
"text1"
>
<activiti:expression>
${genderBean.getGenderString(gender)}
</activiti:expression>
</activiti:field>
<activiti:field
name=
"text2"
>
<activiti:expression>
Hello ${gender == 'male' ? 'Mr.' : 'Mrs.'} ${name}
</activiti:expression>
</activiti:field>
</extensionElements>
</serviceTask>
<sequenceFlow
id=
"flow2"
sourceRef=
"javaService"
targetRef=
"waitState"
/>
<receiveTask
id=
"waitState"
/>
<sequenceFlow
id=
"flow3"
sourceRef=
"waitState"
targetRef=
"theEnd"
/>
<endEvent
id=
"theEnd"
/>
</process>
</definitions>
\ No newline at end of file
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/servicetask/MethodExpressionServiceTaskTest.testSetServiceResultToProcessVariablesWithSkipExpression.bpmn20.xml
0 → 100644
浏览文件 @
9a8fd41c
<?xml version="1.0" encoding="UTF-8"?>
<definitions
id=
"definitions"
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti=
"http://activiti.org/bpmn"
targetNamespace=
"Examples"
>
<process
id=
"setServiceResultToProcessVariablesWithSkipExpression"
>
<startEvent
id=
"theStart"
/>
<sequenceFlow
sourceRef=
"theStart"
targetRef=
"methodExpressionServiceWithResultVariableNameSet"
/>
<serviceTask
id=
"methodExpressionServiceWithResultVariableNameSet"
activiti:resultVariable=
"result"
activiti:expression=
"#{okReturningService.invoke()}"
activiti:skipExpression=
"${skip}"
/>
<sequenceFlow
sourceRef=
"methodExpressionServiceWithResultVariableNameSet"
targetRef=
"methodExpressionServiceWithoutResultVariableNameSet"
/>
<serviceTask
id=
"methodExpressionServiceWithoutResultVariableNameSet"
activiti:expression=
"#{okReturningService.invoke()}"
/>
<sequenceFlow
sourceRef=
"methodExpressionServiceWithoutResultVariableNameSet"
targetRef=
"waitState"
/>
<userTask
id=
"waitState"
/>
<sequenceFlow
sourceRef=
"waitState"
targetRef=
"theEnd"
/>
<endEvent
id=
"theEnd"
/>
</process>
</definitions>
modules/activiti-engine/src/test/resources/org/activiti/examples/bpmn/usertask/SkipExpressionUserTaskTest.test.bpmn20.xml
0 → 100644
浏览文件 @
9a8fd41c
<definitions
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti=
"http://activiti.org/bpmn"
targetNamespace=
"Examples"
>
<process
id=
"skipExpressionUserTask"
>
<startEvent
id=
"theStart"
name=
"Start Event"
/>
<sequenceFlow
sourceRef=
"theStart"
targetRef=
"userTask1"
/>
<userTask
id=
"userTask1"
name=
"Task1"
activiti:skipExpression=
"${execution.getVariable('skip')}"
/>
<sequenceFlow
sourceRef=
"userTask1"
targetRef=
"theEnd"
/>
<endEvent
id=
"theEnd"
name=
"End Event"
/>
</process>
</definitions>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录