From 9ab67e0ea5c4eb422100b702d76ab5ae1978a71f Mon Sep 17 00:00:00 2001 From: canonical Date: Sat, 18 Nov 2023 17:53:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E6=AD=A5=E9=AA=A4=E5=BC=95=E7=94=A8action=E7=9A=84=E7=BA=A6?= =?UTF-8?q?=E6=9D=9F=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/nop/wf/core/NopWfCoreErrors.java | 15 ++++++++++++++ .../core/model/analyze/WfModelAnalyzer.java | 20 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/NopWfCoreErrors.java b/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/NopWfCoreErrors.java index 9f8b8ce0d..5fdb242f0 100644 --- a/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/NopWfCoreErrors.java +++ b/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/NopWfCoreErrors.java @@ -16,6 +16,8 @@ public interface NopWfCoreErrors { String ARG_STEP_NAME = "stepName"; String ARG_ACTION_NAME = "actionName"; + String ARG_OTHER_STEP_NAME = "otherStepName"; + String ARG_WF_VERSION = "wfVersion"; String ARG_WF_ID = "wfId"; @@ -95,6 +97,10 @@ public interface NopWfCoreErrors { "当前工作流[{wfName}]的步骤[{stepName}]的状态为[{stepStatus}],不允许执行操作[{actionName}]", ARG_WF_NAME, ARG_STEP_NAME, ARG_ACTION_NAME, ARG_STEP_STATUS); + ErrorCode ERR_WF_NOT_ALLOW_ACTION_IN_CURRENT_STEP = + define("nop.err.wf.not-allow-action-in-current-step", + "当前工作流[{wfName}]的步骤[{stepName}]不允许执行操作[{actionName}]", + ARG_WF_NAME, ARG_STEP_NAME, ARG_ACTION_NAME); ErrorCode ERR_WF_REJECT_ACTION_IS_NOT_ALLOWED = define("nop.err.wf.reject-action-is-not-allowed", "工作流[{wfName}]的步骤[{stepName}]不允许执行退回操作[{actionName}]", @@ -164,4 +170,13 @@ public interface NopWfCoreErrors { ErrorCode ERR_WF_MISSING_STEP_INSTANCE = define("nop.err.wf.missing-step-instance", "工作流[{wfName}]的实例[{wfId}]中没有步骤实例[{stepId}]", ARG_WF_NAME, ARG_WF_ID, ARG_STEP_ID); + + ErrorCode ERR_WF_STEP_REF_ACTION_IS_COMMON = + define("nop.err.wf.step-ref-action-is-common", + "流程步骤[{stepName}]中引用的动作[{actionName}]不允许是公共动作", ARG_STEP_NAME, ARG_ACTION_NAME); + + ErrorCode ERR_WF_MULTIPLE_STEP_REF_SAME_ACTION = + define("nop.err.wf.multiple-step-ref-same-action", + "同一个动作[{actionName}]不允许被多个步骤所引用:[{stepName}]与[{otherStepName}]", + ARG_ACTION_NAME, ARG_STEP_NAME, ARG_OTHER_STEP_NAME); } diff --git a/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/model/analyze/WfModelAnalyzer.java b/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/model/analyze/WfModelAnalyzer.java index 9dc087ded..468bfef43 100644 --- a/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/model/analyze/WfModelAnalyzer.java +++ b/nop-wf/nop-wf-core/src/main/java/io/nop/wf/core/model/analyze/WfModelAnalyzer.java @@ -32,10 +32,14 @@ import java.util.Map; import java.util.Set; +import static io.nop.wf.core.NopWfCoreErrors.ARG_ACTION_NAME; import static io.nop.wf.core.NopWfCoreErrors.ARG_LOOP_EDGES; +import static io.nop.wf.core.NopWfCoreErrors.ARG_OTHER_STEP_NAME; import static io.nop.wf.core.NopWfCoreErrors.ARG_STEP_NAME; import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_GRAPH_CONTAINS_LOOP; +import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_MULTIPLE_STEP_REF_SAME_ACTION; import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_STEP_NOT_ENDABLE; +import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_STEP_REF_ACTION_IS_COMMON; import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_TRANSITION_TO_UNKNOWN_STEP; import static io.nop.wf.core.NopWfCoreErrors.ERR_WF_UNKNOWN_STEP; @@ -76,13 +80,29 @@ public void analyze(final WfModel wfModel) { } private void initStepActions(WfModel wfModel) { + Map actionToSteps = new HashMap<>(); + wfModel.getSteps().forEach(step -> { List refActions = step.getRefActions(); if (refActions != null) { List actions = new KeyedList<>(refActions.size(), WfActionModel::getName); refActions.forEach(refAction -> { WfActionModel action = (WfActionModel) wfModel.requireAction(refAction.getName()); + if (action.isCommon()) + throw new NopException(ERR_WF_STEP_REF_ACTION_IS_COMMON) + .source(refAction) + .param(ARG_STEP_NAME, step.getName()) + .param(ARG_ACTION_NAME, refAction.getName()); actions.add(action); + + WfStepModel oldStep = actionToSteps.putIfAbsent(action.getName(), step); + + if (oldStep != null) + throw new NopException(ERR_WF_MULTIPLE_STEP_REF_SAME_ACTION) + .source(refAction) + .param(ARG_STEP_NAME, step.getName()) + .param(ARG_ACTION_NAME, refAction.getName()) + .param(ARG_OTHER_STEP_NAME, oldStep.getName()); }); // 增加common-action