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