Flowable源码注释(四十五)流节点相关的解析处理类

本文深入探讨Flowable流程引擎的源码,重点解析了AbstractFlowNodeBpmnParseHandler、AbstractActivityBpmnParseHandler、BoundaryEventParseHandler和IntermediateCatchEventParseHandler这四个关键类在处理流节点时的角色和功能。通过对这些类的注释和理解,有助于深化对Flowable流程定义解析的理解。
摘要由CSDN通过智能技术生成

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());
            }
        }
    }

}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值