BeanPropertySqlTemplateContext.java

package com.github.mygreen.splate;

import java.util.List;

import org.springframework.expression.spel.support.StandardEvaluationContext;

import com.github.mygreen.splate.type.SqlTemplateValueTypeRegistry;

import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

/**
 * SQLテンプレートのパラメータをJavaBean として渡すときのSQLテンプレートのコンテキスト。
 * SQLテンプレート中では、JavaBeanのプロパティ名で参照できます。
 *
 * @version 0.3
 * @author T.TSUCHIE
 *
 */
public class BeanPropertySqlTemplateContext extends SqlTemplateContext<StandardEvaluationContext> {

    /**
     * JavaBeanのインスタンス。
     */
    @Getter
    private final Object value;

    /**
     * SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか。
     *
     * @since 0.3
     * @param ignoreNotFoundProperty SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか設定します。
     * @return SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか返します。
     */
    @Setter
    @Getter
    private boolean ignoreNotFoundProperty;

    /**
     * JavaBeanを指定するコンストラクタ。
     * @param object SQLテンプレート中のパラメータとして渡すJavaBeanのインスタンス
     */
    public BeanPropertySqlTemplateContext(final @NonNull Object object) {
        super();
        this.value = object;
    }

    /**
     *  {@link SqlTemplateValueTypeRegistry}とJavaBeanを指定してインスタンスを作成します。
     *
     * @param valueTypeRegistry SQLテンプレートのパラメータの変換処理を管理する処理。
     * @param object JavaBeanのインスタンス
     */
    public BeanPropertySqlTemplateContext(SqlTemplateValueTypeRegistry valueTypeRegistry, final @NonNull Object object) {
        super(valueTypeRegistry);
        this.value = object;
    }

    /**
     * {@inheritDoc}
     * @return {@link StandardEvaluationContext} のインスタンスを返します。
     */
    @Override
    public StandardEvaluationContext createEvaluationContext() {
        final StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
        evaluationContext.setPropertyAccessors(List.of(new CustomReflectivePropertyAccessor(ignoreNotFoundProperty)));
        evaluationContext.setRootObject(value);
        return evaluationContext;
    }
}