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 [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);
    }
}