MapSqlTemplateContext.java
package com.github.mygreen.splate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import com.github.mygreen.splate.type.SqlTemplateValueTypeRegistry;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
/**
* SQLテンプレートのパラメータを{@link Map} として渡すときのSQLテンプレートのコンテキスト。
* SQLテンプレート中では、マップのキー名で参照できます。
*
*
* @version 0.3
* @author T.TSUCHIE
*
*/
public class MapSqlTemplateContext extends SqlTemplateContext<StandardEvaluationContext> {
private Map<String, Object> values = new HashMap<>();
/**
* SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか。
*
* @since 0.3
* @param ignoreNotFoundProperty SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか設定します。
* @return SQLテンプレート中に存在しないプロパティが定義されているとき、{@literal null} として無視するかどうか返します。
*/
@Setter
@Getter
private boolean ignoreNotFoundProperty;
/**
* コンストラクタ。
*/
public MapSqlTemplateContext() {
super();
}
/**
* テンプレート中の変数を指定してインスタンスを作成します。
* @param variables SQLテンプレート中のパラメータとして渡すマップ。
*/
public MapSqlTemplateContext(@NonNull Map<String, Object> variables) {
super();
this.values.putAll(variables);
}
/**
* {@link SqlTemplateValueTypeRegistry}を指定してインスタンスを作成します。
* @param valueTypeRegistry SQLテンプレートのパラメータの変換処理を管理する処理。
*/
public MapSqlTemplateContext(SqlTemplateValueTypeRegistry valueTypeRegistry) {
super(valueTypeRegistry);
}
/**
* {@link SqlTemplateValueTypeRegistry}とテンプレート中の変数を指定してインスタンスを作成します。
* @param valueTypeRegistry SQLテンプレートのパラメータの変換処理を管理する処理。
* @param variables SQLテンプレート中で使用可能な変数
*/
public MapSqlTemplateContext(SqlTemplateValueTypeRegistry valueTypeRegistry, @NonNull Map<String, Object> variables) {
super(valueTypeRegistry);
this.values.putAll(variables);
}
/**
* {@inheritDoc}
* @return {@link StandardEvaluationContext} のインスタンスを返します。
*/
@Override
public StandardEvaluationContext createEvaluationContext() {
StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
evaluationContext.setPropertyAccessors(List.of(
new CustomMapAccessor(ignoreNotFoundProperty)
,new CustomReflectivePropertyAccessor(ignoreNotFoundProperty)));
evaluationContext.setRootObject(values);
return evaluationContext;
}
/**
* SQLテンプレート中で使用可能な変数を追加します。
*
* @param name 変数名
* @param value 値
* @return 自身のインスタンス
*/
public MapSqlTemplateContext addVariable(@NonNull String name, Object value) {
this.values.put(name, value);
return this;
}
/**
* SQLテンプレート中で使用可能な変数を追加します。
*
* @param variables 変数のマップ
* @return 自身のインスタンス
*/
public MapSqlTemplateContext addVariables(@NonNull Map<String, Object> variables) {
this.values.putAll(variables);
return this;
}
}