/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.api.el;
import org.mule.runtime.api.el.BindingContext;
import org.mule.runtime.api.el.ExpressionLanguage;
import org.mule.runtime.api.el.ValidationResult;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.api.metadata.TypedValue;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.construct.FlowConstruct;
import org.mule.runtime.core.api.expression.ExpressionRuntimeException;
import java.util.Iterator;
/**
* Binds Mule Core concepts {@link Event} or {@link FlowConstruct} and executes the underlying {@link ExpressionLanguage}.
*
* @since 4.0
*/
public interface ExpressionLanguageAdaptor {
/**
* Registers the given {@link BindingContext} entries as globals. Notice globals cannot be removed once registered, only
* overwritten by the registration of a binding with the same identifier.
* Implementations should be thread safe to avoid race conditions between registration and expression evaluation.
*
* @param bindingContext the context to register
*/
void addGlobalBindings(BindingContext bindingContext);
/**
* Evaluates an expression according to a given {@link BindingContext}, an {@link Event} and a {@link FlowConstruct}.
*
* @param expression the expression to be executed
* @param event the current event being processed
* @param flowConstruct the flow where the event is being processed
* @param bindingContext the bindings to consider
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
TypedValue evaluate(String expression, Event event, FlowConstruct flowConstruct, BindingContext bindingContext)
throws ExpressionRuntimeException;
/**
* Evaluates an expression according to a given {@link BindingContext}.
*
* @param expression the expression to be executed
* @param event the current event being processed
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
TypedValue evaluate(String expression, Event event, BindingContext context) throws ExpressionRuntimeException;
/**
* Evaluates an expression according to a given {@link BindingContext} and outputs .
*
* @param expression the expression to be executed
* @param event the current event being processed
* @param expectedOutputType the expected output type so that automatic conversion can be performed for the resulting value
* type.
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
TypedValue evaluate(String expression, DataType expectedOutputType, Event event, BindingContext context)
throws ExpressionRuntimeException;
/**
* Evaluates an expression according to a given {@link BindingContext}, an {@link Event} and a {@link FlowConstruct}.
*
* @param expression the expression to be executed
* @param expectedOutputType the expected output type so that automatic conversion can be performed for the resulting value
* type.
* @param event the current event being processed
* @param flowConstruct the flow where the event is being processed
* @param context the bindings to consider
* @param failOnNull indicates if should fail if the evaluation result is {@code null}
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
TypedValue evaluate(String expression, DataType expectedOutputType, Event event, FlowConstruct flowConstruct,
BindingContext context, boolean failOnNull)
throws ExpressionRuntimeException;
/**
* Verifies whether an expression is valid or not syntactically.
*
* @param expression to be validated
* @return a {@link ValidationResult} indicating whether the validation was successful or not
*/
ValidationResult validate(String expression);
/**
* Splits using the specified expression and group it with the batch size. If batch size is less or equals to zero then no batching is done.
* The expression should return a collection of elements.
*
* @param expression the expression to be executed
* @param event the current event being processed
* @param flowConstruct the flow where the event is being processed
* @param bindingContext the bindings to consider
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
Iterator<TypedValue<?>> split(String expression, int bachSize, Event event, FlowConstruct flowConstruct,
BindingContext bindingContext)
throws ExpressionRuntimeException;
/**
* Splits using the specified expression and group it with the batch size. If batch size is less or equals to zero then no batching is done.
* The expression should return a collection of elements.
*
* @param expression the expression to be executed
* @param event the current event being processed
* @param bindingContext the bindings to consider
* @return the result of execution of the expression.
* @throws ExpressionRuntimeException if a problem occurs evaluating the expression
*/
Iterator<TypedValue<?>> split(String expression, int bachSize, Event event, BindingContext bindingContext)
throws ExpressionRuntimeException;
}