Search in sources :

Example 1 with FEELEventListenersManager

use of org.kie.dmn.feel.lang.impl.FEELEventListenersManager in project drools by kiegroup.

the class DMNFEELHelper method valueMatchesInUnaryTests.

public static boolean valueMatchesInUnaryTests(List<UnaryTest> unaryTests, Object value, DMNContext dmnContext) {
    FEELEventListenersManager manager = new FEELEventListenersManager();
    FEELEventsListenerImpl listener = new FEELEventsListenerImpl();
    manager.addListener(listener);
    EvaluationContextImpl ctx = new EvaluationContextImpl(manager);
    try {
        ctx.enterFrame();
        if (dmnContext != null) {
            // need to set the values for in context variables...
            for (Map.Entry<String, Object> entry : dmnContext.getAll().entrySet()) {
                ctx.setValue(entry.getKey(), entry.getValue());
            }
        }
        for (UnaryTest t : unaryTests) {
            try {
                Boolean applyT = t.apply(ctx, value);
                // the unary test above can actually return null, so we have to handle it here
                if (applyT == null) {
                    return false;
                } else if (applyT) {
                    return true;
                }
            } catch (Throwable e) {
                StringBuilder message = new StringBuilder();
                for (FEELEvent feelEvent : listener.getFeelEvents()) {
                    message.append(feelEvent.getMessage());
                    message.append("\n");
                }
                throw new RuntimeException(message.toString(), e);
            }
        }
    } finally {
        ctx.exitFrame();
    }
    return false;
}
Also used : FEELEventListenersManager(org.kie.dmn.feel.lang.impl.FEELEventListenersManager) UnaryTest(org.kie.dmn.feel.runtime.UnaryTest) EvaluationContextImpl(org.kie.dmn.feel.lang.impl.EvaluationContextImpl) HashMap(java.util.HashMap) Map(java.util.Map) FEELEvent(org.kie.dmn.api.feel.runtime.events.FEELEvent)

Example 2 with FEELEventListenersManager

use of org.kie.dmn.feel.lang.impl.FEELEventListenersManager in project drools by kiegroup.

the class DMNInvocationEvaluator method evaluate.

@Override
public EvaluatorResult evaluate(DMNRuntimeEventManager eventManager, DMNResult dmnr) {
    final List<FEELEvent> events = new ArrayList<>();
    DMNResultImpl result = (DMNResultImpl) dmnr;
    DMNContext previousContext = result.getContext();
    DMNContextImpl dmnContext = (DMNContextImpl) previousContext.clone();
    result.setContext(dmnContext);
    Object invocationResult = null;
    try {
        FEELFunction function = this.functionLocator.apply(previousContext, functionName);
        if (function == null) {
            // check if it is a configured/built-in function
            Object r = null;
            if (feel != null) {
                r = ((FEELImpl) feel).newEvaluationContext(Collections.emptyList(), Collections.emptyMap()).getValue(functionName);
            } else {
                r = RootExecutionFrame.INSTANCE.getValue(functionName);
            }
            if (r != null && r instanceof FEELFunction) {
                function = (FEELFunction) r;
            }
        }
        if (function == null) {
            MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, node, result, null, null, Msg.FUNCTION_NOT_FOUND, functionName, nodeName);
            return new EvaluatorResultImpl(null, ResultType.FAILURE);
        }
        Object[] namedParams = new Object[parameters.size()];
        int index = 0;
        for (ActualParameter param : parameters) {
            try {
                EvaluatorResult value = param.expression.evaluate(eventManager, result);
                if (value.getResultType() == ResultType.SUCCESS) {
                    namedParams[index++] = new NamedParameter(param.name, value.getResult());
                } else {
                    MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, node, result, null, null, Msg.ERR_EVAL_PARAM_FOR_INVOCATION_ON_NODE, param.name, functionName, nodeName);
                    return new EvaluatorResultImpl(null, ResultType.FAILURE);
                }
            } catch (Exception e) {
                MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, node, result, e, null, Msg.ERR_INVOKING_PARAM_EXPR_FOR_PARAM_ON_NODE, param.name, nodeName);
                return new EvaluatorResultImpl(null, ResultType.FAILURE);
            }
        }
        FEELEventListenersManager listenerMgr = new FEELEventListenersManager();
        listenerMgr.addListener(events::add);
        EvaluationContextImpl ctx = new EvaluationContextImpl(listenerMgr, eventManager.getRuntime());
        invocationResult = function.invokeReflectively(ctx, namedParams);
        boolean hasErrors = hasErrors(events, eventManager, result);
        return new EvaluatorResultImpl(invocationResult, hasErrors ? ResultType.FAILURE : ResultType.SUCCESS);
    } catch (Throwable t) {
        MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, node, result, t, null, Msg.ERR_INVOKING_FUNCTION_ON_NODE, functionName, nodeName);
        return new EvaluatorResultImpl(null, ResultType.FAILURE);
    } finally {
        result.setContext(previousContext);
    }
}
Also used : DMNResultImpl(org.kie.dmn.core.impl.DMNResultImpl) EvaluatorResult(org.kie.dmn.core.api.EvaluatorResult) FEELFunction(org.kie.dmn.feel.runtime.FEELFunction) NamedParameter(org.kie.dmn.feel.lang.impl.NamedParameter) ArrayList(java.util.ArrayList) DMNContext(org.kie.dmn.api.core.DMNContext) FEELEventListenersManager(org.kie.dmn.feel.lang.impl.FEELEventListenersManager) EvaluationContextImpl(org.kie.dmn.feel.lang.impl.EvaluationContextImpl) FEELImpl(org.kie.dmn.feel.lang.impl.FEELImpl) DMNContextImpl(org.kie.dmn.core.impl.DMNContextImpl) FEELEvent(org.kie.dmn.api.feel.runtime.events.FEELEvent)

Aggregations

FEELEvent (org.kie.dmn.api.feel.runtime.events.FEELEvent)2 EvaluationContextImpl (org.kie.dmn.feel.lang.impl.EvaluationContextImpl)2 FEELEventListenersManager (org.kie.dmn.feel.lang.impl.FEELEventListenersManager)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 DMNContext (org.kie.dmn.api.core.DMNContext)1 EvaluatorResult (org.kie.dmn.core.api.EvaluatorResult)1 DMNContextImpl (org.kie.dmn.core.impl.DMNContextImpl)1 DMNResultImpl (org.kie.dmn.core.impl.DMNResultImpl)1 FEELImpl (org.kie.dmn.feel.lang.impl.FEELImpl)1 NamedParameter (org.kie.dmn.feel.lang.impl.NamedParameter)1 FEELFunction (org.kie.dmn.feel.runtime.FEELFunction)1 UnaryTest (org.kie.dmn.feel.runtime.UnaryTest)1