use of com.walmartlabs.concord.runtime.v2.sdk.Context in project concord by walmartlabs.
the class DefaultContextFactory method create.
@Override
public Context create(Runtime runtime, State state, ThreadId currentThreadId, Step currentStep, UUID correlationId) {
ProcessDefinition pd = runtime.getService(ProcessDefinition.class);
Compiler compiler = runtime.getService(Compiler.class);
ExpressionEvaluator ee = runtime.getService(ExpressionEvaluator.class);
return new ContextImpl(compiler, ee, currentThreadId, runtime, state, pd, currentStep, correlationId, workingDirectory.getValue(), processInstanceId.getValue(), fileService, dockerService, secretService, lockService, apiConfiguration, processConfiguration);
}
use of com.walmartlabs.concord.runtime.v2.sdk.Context in project concord by walmartlabs.
the class GroupOfStepsCompiler method compile.
@Override
public Command compile(CompilerContext context, GroupOfSteps step) {
Command cmd = compile(context, step.getSteps());
GroupOfStepsOptions options = Objects.requireNonNull(step.getOptions());
WithItems withItems = options.withItems();
if (withItems != null) {
return WithItemsWrapper.of(cmd, withItems, options.out(), Collections.emptyMap());
}
Loop loop = options.loop();
if (loop != null) {
cmd = LoopWrapper.of(context, cmd, loop, options.out(), Collections.emptyMap());
}
List<Step> errorSteps = options.errorSteps();
if (!options.errorSteps().isEmpty()) {
cmd = new ErrorWrapper(cmd, compile(context, errorSteps));
}
return cmd;
}
use of com.walmartlabs.concord.runtime.v2.sdk.Context in project concord by walmartlabs.
the class StepCommand method eval.
@Override
public void eval(Runtime runtime, State state, ThreadId threadId) {
ContextFactory contextFactory = runtime.getService(ContextFactory.class);
T step = getStep();
UUID correlationId = getCorrelationId();
Context ctx = contextFactory.create(runtime, state, threadId, step, correlationId);
LogContext logContext = getLogContext(runtime, ctx, correlationId);
if (logContext == null) {
executeWithContext(ctx, runtime, state, threadId);
} else {
runtime.getService(RunnerLogger.class).withContext(logContext, () -> executeWithContext(ctx, runtime, state, threadId));
}
}
use of com.walmartlabs.concord.runtime.v2.sdk.Context in project concord by walmartlabs.
the class ExpressionCommand method execute.
@Override
protected void execute(Runtime runtime, State state, ThreadId threadId) {
state.peekFrame(threadId).pop();
Context ctx = runtime.getService(Context.class);
Expression step = getStep();
String expr = step.getExpr();
ExpressionEvaluator ee = runtime.getService(ExpressionEvaluator.class);
Object result = ee.eval(EvalContextFactory.global(ctx), expr, Object.class);
ExpressionOptions opts = Objects.requireNonNull(step.getOptions());
if (!opts.outExpr().isEmpty()) {
ExpressionEvaluator expressionEvaluator = runtime.getService(ExpressionEvaluator.class);
Map<String, Object> vars = Collections.singletonMap("result", result);
Map<String, Serializable> out = expressionEvaluator.evalAsMap(EvalContextFactory.global(ctx, vars), opts.outExpr());
out.forEach((k, v) -> ctx.variables().set(k, v));
} else if (opts.out() != null) {
ctx.variables().set(opts.out(), result);
}
}
use of com.walmartlabs.concord.runtime.v2.sdk.Context in project concord by walmartlabs.
the class FlowCallCommand method execute.
@Override
protected void execute(Runtime runtime, State state, ThreadId threadId) {
state.peekFrame(threadId).pop();
Context ctx = runtime.getService(Context.class);
ExpressionEvaluator ee = runtime.getService(ExpressionEvaluator.class);
EvalContext evalCtx = EvalContextFactory.global(ctx);
FlowCall call = getStep();
// the called flow's name
String flowName = ee.eval(evalCtx, call.getFlowName(), String.class);
// the called flow's steps
Compiler compiler = runtime.getService(Compiler.class);
ProcessDefinition pd = runtime.getService(ProcessDefinition.class);
ProcessConfiguration pc = runtime.getService(ProcessConfiguration.class);
Command steps = CompilerUtils.compile(compiler, pc, pd, flowName);
FlowCallOptions opts = Objects.requireNonNull(call.getOptions());
Map<String, Object> input = VMUtils.prepareInput(ee, ctx, opts.input(), opts.inputExpression());
// the call's frame should be a "root" frame
// all local variables will have this frame as their base
Frame innerFrame = Frame.builder().root().commands(steps).locals(input).build();
// an "out" handler:
// grab the out variable from the called flow's frame
// and put it into the callee's frame
Command processOutVars;
if (!opts.outExpr().isEmpty()) {
processOutVars = new EvalVariablesCommand(ctx, opts.outExpr(), innerFrame);
} else {
processOutVars = new CopyVariablesCommand(opts.out(), innerFrame, VMUtils::assertNearestRoot);
}
// push the out handler first so it executes after the called flow's frame is done
state.peekFrame(threadId).push(processOutVars);
state.pushFrame(threadId, innerFrame);
}
Aggregations