private static PvmActivity filterNonParallelGateway()

in core/src/main/java/com/alibaba/smart/framework/engine/bpmn/behavior/gateway/helper/CommonGatewayHelper.java [114:147]


    private static PvmActivity filterNonParallelGateway(PvmActivity currentPvmActivity, PvmProcessDefinition pvmProcessDefinition){

        //如果当前节点就是ParallelGateway时,则立即返回
        if(isForkGateway(currentPvmActivity) || isJoinGateway(currentPvmActivity)){
            return currentPvmActivity;
        }


        Map<String, PvmTransition> outcomeTransitions = currentPvmActivity.getOutcomeTransitions();

        //针对所有分支处理
        for (Map.Entry<String, PvmTransition> transitionEntry : outcomeTransitions.entrySet()) {

            PvmTransition pendingTransition = transitionEntry.getValue();
            PvmActivity mayBeJoinTarget = pendingTransition.getTarget();

            if (isForkGateway(mayBeJoinTarget) || isJoinGateway(mayBeJoinTarget)){
                //return 只会跳出当前递归调用,而不会跳出整个循环或递归栈。 所以还需要 在else分支中处理下
                return mayBeJoinTarget;
            }else{
                // 如果既不是fork,也不是join,则继续遍历target的后向节点
                // 递归处理,在下一个判断中继续寻找分支上的后续节点(这里可能存在互斥网关,所以需要在递归内遍历所有分支)
                PvmActivity result = filterNonParallelGateway(mayBeJoinTarget, pvmProcessDefinition);
                if (result != null) {
                    // 如果递归调用找到了目标网关,立即返回
                    return result;
                }
            }


        }

        throw new EngineException("should find one parallel gateway :"+ currentPvmActivity.getModel().getId());
    }