All Downloads are FREE. Search and download functionalities are using the official Maven repository.

graphql.validation.el.ELSupport Maven / Gradle / Ivy

package graphql.validation.el;

import graphql.Internal;
import org.hibernate.validator.internal.engine.messageinterpolation.FormatterWrapper;

import javax.el.ELContext;
import javax.el.ELManager;
import javax.el.ExpressionFactory;
import javax.el.StandardELContext;
import javax.el.ValueExpression;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.Map;

@Internal
@SuppressWarnings("unused")
public class ELSupport {
    private static final ExpressionFactory expressionFactory = loadExpressionSupport();
    private final StandardELContext elContext;

    public ELSupport(Locale locale) {
        elContext = new StandardELContext(expressionFactory);
        elContext.setLocale(locale);
        elContext.addELResolver(new BetterMapELResolver());
        // put in standard functions and variables here
        bindVariable(elContext, "formatter", new FormatterWrapper(locale));
    }


    private static ExpressionFactory loadExpressionSupport() {
        //
        // Do we need fancy class loading support.  The Hibernate Validator code jumps though incredible
        // class loader tricks so should we?  Do they know something we don't?
        //
        // For now lets keep it simple
        //
        return ELManager.getExpressionFactory();
    }

    private void bindMethod(String bindName, String methodName, Class... args) {
        elContext.getFunctionMapper().mapFunction("", bindName, loadMethod(methodName, args));
    }

    private Method loadMethod(String name, Class... args) {
        try {
            return ELSupport.class.getMethod(name, args);
        } catch (NoSuchMethodException e) {
            throw new IllegalStateException(e);
        }
    }

    private ValueExpression bindVariable(ELContext elContext, String variableName, Object variableValue) {
        ValueExpression valueExpression = expressionFactory.createValueExpression(
                variableValue,
                Object.class
        );
        return elContext.getVariableMapper().setVariable(variableName, valueExpression);
    }

    public boolean evaluateBoolean(String expression, Map variables) {
        return evaluateImpl(expression, variables, Boolean.class);

    }

    public Object evaluate(String expression, Map variables) {
        return evaluateImpl(expression, variables, Object.class);
    }

    @SuppressWarnings("unchecked")
    private  T evaluateImpl(String expression, Map variables, Class expectedResultClass) {
        StandardELContext context = new StandardELContext(elContext);
        for (Map.Entry entry : variables.entrySet()) {
            bindVariable(context, entry.getKey(), entry.getValue());
        }
        ValueExpression result = expressionFactory.createValueExpression(context, expression, expectedResultClass);
        Object value = result.getValue(context);
        return (T) value;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy