Search in sources :

Example 6 with EvalContext

use of com.walmartlabs.concord.runtime.v2.runner.el.EvalContext 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);
}
Also used : EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) Context(com.walmartlabs.concord.runtime.v2.sdk.Context) Compiler(com.walmartlabs.concord.runtime.v2.sdk.Compiler) FlowCall(com.walmartlabs.concord.runtime.v2.model.FlowCall) EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) ProcessDefinition(com.walmartlabs.concord.runtime.v2.model.ProcessDefinition) ExpressionEvaluator(com.walmartlabs.concord.runtime.v2.runner.el.ExpressionEvaluator) FlowCallOptions(com.walmartlabs.concord.runtime.v2.model.FlowCallOptions) ProcessConfiguration(com.walmartlabs.concord.runtime.v2.sdk.ProcessConfiguration)

Example 7 with EvalContext

use of com.walmartlabs.concord.runtime.v2.runner.el.EvalContext in project concord by walmartlabs.

the class IfCommand method execute.

@Override
protected void execute(Runtime runtime, State state, ThreadId threadId) {
    Frame frame = state.peekFrame(threadId);
    frame.pop();
    IfStep step = getStep();
    String expr = step.getExpression();
    Context ctx = runtime.getService(Context.class);
    EvalContext evalContext = EvalContextFactory.global(ctx);
    ExpressionEvaluator ee = runtime.getService(ExpressionEvaluator.class);
    Boolean ifResult = ee.eval(evalContext, expr, Boolean.class);
    if (ifResult != null && ifResult) {
        frame.push(thenCommand);
    } else if (elseCommand != null) {
        frame.push(elseCommand);
    }
}
Also used : Context(com.walmartlabs.concord.runtime.v2.sdk.Context) EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) ExpressionEvaluator(com.walmartlabs.concord.runtime.v2.runner.el.ExpressionEvaluator) IfStep(com.walmartlabs.concord.runtime.v2.model.IfStep)

Example 8 with EvalContext

use of com.walmartlabs.concord.runtime.v2.runner.el.EvalContext in project concord by walmartlabs.

the class SwitchCommand method execute.

@Override
protected void execute(Runtime runtime, State state, ThreadId threadId) {
    Frame frame = state.peekFrame(threadId);
    frame.pop();
    SwitchStep step = getStep();
    String expr = step.getExpression();
    Context ctx = runtime.getService(Context.class);
    EvalContext evalContext = EvalContextFactory.global(ctx);
    ExpressionEvaluator ee = runtime.getService(ExpressionEvaluator.class);
    String switchResult = ee.eval(evalContext, expr, String.class);
    boolean caseFound = false;
    for (Map.Entry<String, Command> kv : caseCommands) {
        String caseLabel = ee.eval(evalContext, kv.getKey(), String.class);
        if (Objects.equals(switchResult, caseLabel)) {
            frame.push(kv.getValue());
            caseFound = true;
            break;
        }
    }
    if (!caseFound && defaultCommand != null) {
        frame.push(defaultCommand);
    }
// TODO: log case not found?
}
Also used : Context(com.walmartlabs.concord.runtime.v2.sdk.Context) EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) EvalContext(com.walmartlabs.concord.runtime.v2.runner.el.EvalContext) ExpressionEvaluator(com.walmartlabs.concord.runtime.v2.runner.el.ExpressionEvaluator) Map(java.util.Map) SwitchStep(com.walmartlabs.concord.runtime.v2.model.SwitchStep)

Aggregations

EvalContext (com.walmartlabs.concord.runtime.v2.runner.el.EvalContext)5 ExpressionEvaluator (com.walmartlabs.concord.runtime.v2.runner.el.ExpressionEvaluator)5 Context (com.walmartlabs.concord.runtime.v2.sdk.Context)4 TaskProviders (com.walmartlabs.concord.runtime.v2.runner.tasks.TaskProviders)2 ProcessConfiguration (com.walmartlabs.concord.runtime.v2.sdk.ProcessConfiguration)2 Matchers.containsString (org.hamcrest.Matchers.containsString)2 Test (org.junit.jupiter.api.Test)2 Form (com.walmartlabs.concord.forms.Form)1 FormService (com.walmartlabs.concord.runtime.common.FormService)1 FlowCall (com.walmartlabs.concord.runtime.v2.model.FlowCall)1 FlowCallOptions (com.walmartlabs.concord.runtime.v2.model.FlowCallOptions)1 IfStep (com.walmartlabs.concord.runtime.v2.model.IfStep)1 ProcessDefinition (com.walmartlabs.concord.runtime.v2.model.ProcessDefinition)1 SwitchStep (com.walmartlabs.concord.runtime.v2.model.SwitchStep)1 DefaultEvalContext (com.walmartlabs.concord.runtime.v2.runner.el.DefaultEvalContext)1 BeanELResolver (com.walmartlabs.concord.runtime.v2.runner.el.resolvers.BeanELResolver)1 Compiler (com.walmartlabs.concord.runtime.v2.sdk.Compiler)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1