Skip to content

Commit

Permalink
增加工作流步骤引用action的约束条件
Browse files Browse the repository at this point in the history
  • Loading branch information
entropy-cloud committed Nov 18, 2023
1 parent ba7be1e commit 9ab67e0
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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}]",
Expand Down Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -76,13 +80,29 @@ public void analyze(final WfModel wfModel) {
}

private void initStepActions(WfModel wfModel) {
Map<String, WfStepModel> actionToSteps = new HashMap<>();

wfModel.getSteps().forEach(step -> {
List<WfRefActionModel> refActions = step.getRefActions();
if (refActions != null) {
List<WfActionModel> 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
Expand Down

0 comments on commit 9ab67e0

Please sign in to comment.