Flowable源码地址:https://github.com/flowable/flowable-engine
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
流节点解析处理类,包路径:org.flowable.engine.impl.bpmn.parser.handler
AbstractFlowNodeBpmnParseHandler 抽象流节点解析处理类
/**
* 抽象流节点解析处理类
* 负责处理流节点实例对象
*
* @author Joram Barrez
*/
public abstract class AbstractFlowNodeBpmnParseHandler<T extends FlowNode> extends AbstractBpmnParseHandler<T> {
}
AbstractActivityBpmnParseHandler 抽象活动BPMN解析处理类
/**
* 抽象活动BPMN解析处理类
*
* @author Joram Barrez
*/
public abstract class AbstractActivityBpmnParseHandler<T extends FlowNode> extends AbstractFlowNodeBpmnParseHandler<T> {
@Override
public void parse(BpmnParse bpmnParse, BaseElement element) {
super.parse(bpmnParse, element);
if (element instanceof Activity && ((Activity) element).getLoopCharacteristics() != null) {
createMultiInstanceLoopCharacteristics(bpmnParse, (Activity) element);
}
}
protected void createMultiInstanceLoopCharacteristics(BpmnParse bpmnParse, Activity modelActivity) {
MultiInstanceLoopCharacteristics loopCharacteristics = modelActivity.getLoopCharacteristics();
// 活动行为
MultiInstanceActivityBehavior miActivityBehavior = createMultiInstanceActivityBehavior(modelActivity, loopCharacteristics, bpmnParse);
modelActivity.setBehavior(miActivityBehavior);
ExpressionManager expressionManager = CommandContextUtil.getProcessEngineConfiguration().getExpressionManager();
// 循环基数
if (StringUtils.isNotEmpty(loopCharacteristics.getLoopCardinality())) {
miActivityBehavior.setLoopCardinalityExpression(expressionManager.createExpression(loopCharacteristics.getLoopCardinality()));
}
// 完成条件
if (StringUtils.isNotEmpty(loopCharacteristics.getCompletionCondition())) {
miActivityBehavior.setCompletionCondition(loopCharacteristics.getCompletionCondition());
}
// flowable:集合
if (StringUtils.isNotEmpty(loopCharacteristics.getInputDataItem())) {
miActivityBehavior.setCollectionExpression(expressionManager.createExpression(loopCharacteristics.getInputDataItem()));
}
// flowable:字符串集合
if (StringUtils.isNotEmpty(loopCharacteristics.getCollectionString())) {
miActivityBehavior.setCollectionString(loopCharacteristics.getCollectionString());
}
// flowable:元素变量
if (StringUtils.isNotEmpty(loopCharacteristics.getElementVariable())) {
miActivityBehavior.setCollectionElementVariable(loopCharacteristics.getElementVariable());
}
// flowable:元素索引变量
if (StringUtils.isNotEmpty(loopCharacteristics.getElementIndexVariable())) {
miActivityBehavior.setCollectionElementIndexVariable(loopCharacteristics.getElementIndexVariable());
}
// flowable:集合解析
if (loopCharacteristics.getHandler() != null) {
miActivityBehavior.setHandler(loopCharacteristics.getHandler().clone());
}
// flowable:变量聚合
if (loopCharacteristics.getAggregations() != null) {
miActivityBehavior.setAggregations(loopCharacteristics.getAggregations().clone());
}
}
protected MultiInstanceActivityBehavior createMultiInstanceActivityBehavior(Activity modelActivity, MultiInstanceLoopCharacteristics loopCharacteristics, BpmnParse bpmnParse) {
MultiInstanceActivityBehavior miActivityBehavior = null;
AbstractBpmnActivityBehavior modelActivityBehavior = (AbstractBpmnActivityBehavior) modelActivity.getBehavior();
if (loopCharacteristics.isSequential()) {
miActivityBehavior = bpmnParse.getActivityBehaviorFactory().createSequentialMultiInstanceBehavior(modelActivity, modelActivityBehavior);
} else {
miActivityBehavior = bpmnParse.getActivityBehaviorFactory().createParallelMultiInstanceBehavior(modelActivity, modelActivityBehavior);
}
return miActivityBehavior;
}
}
BoundaryEventParseHandler 边界事件解析处理器
/**
* 边界事件解析处理器
*
* @author Joram Barrez
* @author Tijs Rademakers
*/
public class BoundaryEventParseHandler extends AbstractFlowNodeBpmnParseHandler<BoundaryEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(BoundaryEventParseHandler.class);
@Override
public Class<? extends BaseElement> getHandledType() {
return BoundaryEvent.class;
}
@Override
protected void executeParse(BpmnParse bpmnParse, BoundaryEvent boundaryEvent) {
if (boundaryEvent.getAttachedToRef() == null) {
// 边界事件中的引用无效。确保引用的活动与边界事件{}定义在同一范围内
LOGGER.warn("Invalid reference in boundary event. Make sure that the referenced activity is defined in the same scope as the boundary event {}", boundaryEvent.getId());
return;
}
EventDefinition eventDefinition = null;
if (boundaryEvent.getEventDefinitions().size() > 0) {
eventDefinition = boundaryEvent.getEventDefinitions().get(0);
}
if (eventDefinition instanceof TimerEventDefinition ||
eventDefinition instanceof ErrorEventDefinition ||
eventDefinition instanceof SignalEventDefinition ||
eventDefinition instanceof CancelEventDefinition ||
eventDefinition instanceof ConditionalEventDefinition ||
eventDefinition instanceof MessageEventDefinition ||
eventDefinition instanceof EscalationEventDefinition ||
eventDefinition instanceof CompensateEventDefinition ||
eventDefinition instanceof VariableListenerEventDefinition) {
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
return;
} else if (!boundaryEvent.getExtensionElements().isEmpty()) {
List<ExtensionElement> eventTypeExtensionElements = boundaryEvent.getExtensionElements().get(BpmnXMLConstants.ELEMENT_EVENT_TYPE);
if (eventTypeExtensionElements != null && !eventTypeExtensionElements.isEmpty()) {
String eventTypeValue = eventTypeExtensionElements.get(0).getElementText();
if (StringUtils.isNotEmpty(eventTypeValue)) {
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryEventRegistryEventActivityBehavior(
boundaryEvent, eventTypeValue, boundaryEvent.isCancelActivity()));
return;
}
}
}
// 应该已经在部署时由process validator获取,所以这只是为了确定
LOGGER.warn("Unsupported boundary event type for boundary event {}", boundaryEvent.getId());
}
}
IntermediateCatchEventParseHandler 中间捕获事件解析处理器
/**
* 中间捕获事件解析处理器
*
* @author Joram Barrez
*/
public class IntermediateCatchEventParseHandler extends AbstractFlowNodeBpmnParseHandler<IntermediateCatchEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(IntermediateCatchEventParseHandler.class);
@Override
public Class<? extends BaseElement> getHandledType() {
return IntermediateCatchEvent.class;
}
@Override
protected void executeParse(BpmnParse bpmnParse, IntermediateCatchEvent event) {
ActivityImpl nestedActivity = null;
EventDefinition eventDefinition = null;
if (!event.getEventDefinitions().isEmpty()) {
eventDefinition = event.getEventDefinitions().get(0);
}
if (eventDefinition == null) {
nestedActivity = createActivityOnCurrentScope(bpmnParse, event, BpmnXMLConstants.ELEMENT_EVENT_CATCH);
nestedActivity.setAsync(event.isAsynchronous());
nestedActivity.setExclusive(!event.isNotExclusive());
} else {
ScopeImpl scope = bpmnParse.getCurrentScope();
String eventBasedGatewayId = getPrecedingEventBasedGateway(bpmnParse, event);
if (eventBasedGatewayId != null) {
ActivityImpl gatewayActivity = scope.findActivity(eventBasedGatewayId);
nestedActivity = createActivityOnScope(bpmnParse, event, BpmnXMLConstants.ELEMENT_EVENT_CATCH, gatewayActivity);
} else {
nestedActivity = createActivityOnScope(bpmnParse, event, BpmnXMLConstants.ELEMENT_EVENT_CATCH, scope);
}
nestedActivity.setAsync(event.isAsynchronous());
nestedActivity.setExclusive(!event.isNotExclusive());
// 捕获事件行为对于所有类型都是相同的
nestedActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createIntermediateCatchEventActivityBehavior(event));
if (eventDefinition instanceof TimerEventDefinition
|| eventDefinition instanceof SignalEventDefinition
|| eventDefinition instanceof MessageEventDefinition) {
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
} else {
// 不支持事件{}的中间捕获事件类型
LOGGER.warn("Unsupported intermediate catch event type for event {}", event.getId());
}
}
}
}