Skip to content

Commit

Permalink
task增加input参数检查
Browse files Browse the repository at this point in the history
  • Loading branch information
entropy-cloud committed Dec 8, 2024
1 parent a292640 commit bf7c028
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 9 deletions.
6 changes: 1 addition & 5 deletions nop-cli/demo/_vfs/batch/batch-gen-demo.task.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
<task x:schema="/nop/schema/task/task.xdef" xmlns:x="/nop/schema/xdsl.xdef"
x:extends="/nop/task/lib/common.task.xml,/nop/task/lib/batch-common.task.xml"
xmlns:task="task" x:dump="true" defaultUseParentScope="true" xmlns:xpl="xpl" xmlns:c="c">
xmlns:task="task" x:dump="true" defaultUseParentScope="true" xmlns:xpl="xpl">

<input name="totalCount" type="int"/>
<input name="taskKey" type="String"/>

<x:config>
<c:import from="/nop/batch/xlib/batch.xlib"/>
</x:config>

<steps>
<custom name="createCard" customType="batch:Execute"
xmlns:batch="/nop/batch/xlib/batch.xlib">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ default Map<String, Object> getTaskVars() {

Set<String> getAttributeKeys();

default Object getInput(String name) {
return getEvalScope().getValue(name);
}

default void setInput(String name, Object value) {
getEvalScope().setLocalValue(name, value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public interface TaskErrors {

String ARG_CUSTOM_TYPE = "customType";

String ARG_INPUT_NAME = "inputName";

ErrorCode ERR_TASK_STEP_NOT_RESTARTABLE = define("nop.err.task.step.not-restartable",
"步骤[{stepName}]不允许多次执行", ARG_TASK_NAME, ARG_STEP_NAME);

Expand Down Expand Up @@ -123,4 +125,7 @@ public interface TaskErrors {

ErrorCode ERR_TASK_INVALID_CUSTOM_TYPE =
define("nop.err.task.invalid-custom-type", "节点的扩展类型属性必须包含名字空间,例如customType='gpt:simple'", ARG_CUSTOM_TYPE);

ErrorCode ERR_TASK_MANDATORY_INPUT_NOT_ALLOW_EMPTY = define("nop.err.task.mandatory-input-not-allow-empty",
"步骤[{stepPath}]的输入[{input}]不允许为空", ARG_STEP_PATH, ARG_INPUT_NAME);
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ private TaskStepExecution enhancedTaskStep(TaskStepModel stepModel, ITaskStep st
List<TaskStepExecution.InputConfig> inputs = new ArrayList<>(stepModel.getInputs().size());
for (TaskInputModel inputModel : stepModel.getInputs()) {
inputs.add(new TaskStepExecution.InputConfig(inputModel.getLocation(), inputModel.getName(),
inputModel.getSource(), inputModel.isFromTaskScope()));
inputModel.getSource(), inputModel.isFromTaskScope(), inputModel.isMandatory()));
}

List<TaskStepExecution.OutputConfig> outputs = new ArrayList<>(stepModel.getOutputs().size() + 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.nop.api.core.exceptions.NopException;
import io.nop.api.core.ioc.IBeanContainer;
import io.nop.api.core.util.Guard;
import io.nop.commons.util.StringHelper;
import io.nop.task.ITask;
import io.nop.task.ITaskRuntime;
import io.nop.task.ITaskStep;
Expand All @@ -13,9 +14,15 @@
import io.nop.task.model.ITaskInputModel;
import io.nop.task.model.ITaskOutputModel;

import java.util.Collections;
import java.util.List;
import java.util.Set;

import static io.nop.task.TaskErrors.ARG_INPUT_NAME;
import static io.nop.task.TaskErrors.ARG_STEP_PATH;
import static io.nop.task.TaskErrors.ARG_TASK_NAME;
import static io.nop.task.TaskErrors.ERR_TASK_MANDATORY_INPUT_NOT_ALLOW_EMPTY;

public class TaskImpl implements ITask {
private final String taskName;
private final long taskVersion;
Expand All @@ -33,8 +40,8 @@ public class TaskImpl implements ITask {
public TaskImpl(String taskName, long taskVersion, ITaskStep mainStep, boolean recordMetrics,
ITaskStepFlagOperation flagOperation, ITaskBeanContainerFactory taskBeanContainerFactory,
List<? extends ITaskInputModel> inputs, List<? extends ITaskOutputModel> outputs) {
this.inputs = inputs;
this.outputs = outputs;
this.inputs = inputs == null ? Collections.emptyList() : inputs;
this.outputs = outputs == null ? Collections.emptyList() : outputs;
this.flagOperation = flagOperation;
this.taskName = Guard.notEmpty(taskName, "taskName");
this.taskVersion = taskVersion;
Expand Down Expand Up @@ -84,6 +91,8 @@ public TaskStepReturn execute(ITaskRuntime taskRt, Set<String> outputNames) {
ITaskFlowMetrics metrics = recordMetrics ? taskRt.getMetrics() : null;
Object meter = metrics == null ? null : metrics.beginTask();
try {
checkInputs(taskRt);

// 如果设置了任务专用的beanContainer
IBeanContainer beanContainer = createBeanContainer(taskRt);
if (beanContainer != null) {
Expand All @@ -107,4 +116,28 @@ public TaskStepReturn execute(ITaskRuntime taskRt, Set<String> outputNames) {
throw NopException.adapt(err);
});
}

void checkInputs(ITaskRuntime taskRt) {
for (ITaskInputModel input : inputs) {
String name = input.getName();
Object value = taskRt.getInput(name);
if (value == null) {
// value为null可能是没有设置input,这里强制设置一下,确保scope中的input变量一定存在
taskRt.setInput(name, null);
} else if (input.getType() != null) {
Object castedValue = input.getType().getStdDataType().convert(value,
err -> new NopException(err).param(ARG_TASK_NAME, taskRt.getTaskName())
.param(ARG_INPUT_NAME, input.getName()));
if (castedValue != value)
taskRt.setInput(name, castedValue);
}

if (input.isMandatory() && StringHelper.isEmptyObject(value)) {
throw new NopException(ERR_TASK_MANDATORY_INPUT_NOT_ALLOW_EMPTY)
.param(ARG_TASK_NAME, taskRt.getTaskName())
.param(ARG_STEP_PATH, mainStep.getStepType())
.param(ARG_INPUT_NAME, input.getName());
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.nop.api.core.time.CoreMetrics;
import io.nop.api.core.util.Guard;
import io.nop.api.core.util.SourceLocation;
import io.nop.commons.util.StringHelper;
import io.nop.core.exceptions.ErrorMessageManager;
import io.nop.core.lang.eval.IEvalAction;
import io.nop.core.lang.eval.IEvalPredicate;
Expand All @@ -27,7 +28,10 @@
import java.util.Map;
import java.util.Set;

import static io.nop.task.TaskErrors.ARG_INPUT_NAME;
import static io.nop.task.TaskErrors.ARG_STEP_PATH;
import static io.nop.task.TaskErrors.ERR_TASK_CANCELLED;
import static io.nop.task.TaskErrors.ERR_TASK_MANDATORY_INPUT_NOT_ALLOW_EMPTY;

public class TaskStepExecution implements ITaskStepExecution {
static final Logger LOG = LoggerFactory.getLogger(TaskStepExecution.class);
Expand All @@ -37,13 +41,19 @@ public static class InputConfig {
private final String name;
private final IEvalAction expr;
private final boolean fromTaskScope;
private final boolean mandatory;

public InputConfig(SourceLocation loc, String name, IEvalAction expr,
boolean fromTaskScope) {
boolean fromTaskScope, boolean mandatory) {
this.location = loc;
this.name = name;
this.expr = expr;
this.fromTaskScope = fromTaskScope;
this.mandatory = mandatory;
}

public boolean isMandatory() {
return mandatory;
}

public SourceLocation getLocation() {
Expand Down Expand Up @@ -289,6 +299,10 @@ private void initInputs(ITaskStepRuntime stepRt, IEvalScope parentScope, ITaskRu
IEvalScope scope = inputConfig.isFromTaskScope() ? taskRt.getEvalScope() : parentScope;
IEvalAction expr = inputConfig.getExpr();
Object value = expr == null ? parentScope.getValue(name) : expr.invoke(scope);
if (inputConfig.isMandatory() && !StringHelper.isEmptyObject(value))
throw new NopException(ERR_TASK_MANDATORY_INPUT_NOT_ALLOW_EMPTY)
.param(ARG_STEP_PATH, stepRt.getStepPath())
.param(ARG_INPUT_NAME, name);
stepRt.setValue(name, value);
});
}
Expand Down

0 comments on commit bf7c028

Please sign in to comment.