ExpressionResolver.java

package pro.verron.officestamper.core;

import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.lang.Nullable;
import pro.verron.officestamper.api.Placeholder;

/**
 * Resolves expressions against a given context object. Expressions can be either SpEL expressions or simple property
 * expressions.
 *
 * @author Joseph Verron
 * @author Tom Hombergs
 * @version ${version}
 * @since 1.0.0
 */
public class ExpressionResolver {

    private final ExpressionParser parser;
    private final StandardEvaluationContext evaluationContext;

    /**
     * Creates a new ExpressionResolver with the given SpEL parser configuration.
     *
     * @param standardEvaluationContext a {@link StandardEvaluationContext} object
     */
    public ExpressionResolver(
            StandardEvaluationContext standardEvaluationContext,
            ExpressionParser expressionParser
    ) {
        this.parser = expressionParser;
        this.evaluationContext = standardEvaluationContext;
    }


    /**
     * Resolves the content of a placeholder by evaluating the expression against the evaluation context.
     *
     * @param placeholder the placeholder to resolve
     *
     * @return the resolved value of the placeholder
     */
    @Nullable public Object resolve(Placeholder placeholder) {
        var expressionString = placeholder.content();
        var expression = parser.parseExpression(expressionString);
        return expression.getValue(evaluationContext);
    }

    /**
     * Sets the context object against which expressions will be resolved.
     *
     * @param contextRoot the context object to set as the root.
     */
    public void setContext(Object contextRoot) {
        evaluationContext.setRootObject(contextRoot);
    }
}