package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import java.util.LinkedHashMap; import com.gh.mygreen.xlsmapper.ArgUtils; /** * 値が指定した範囲内かどうかチェックする。 * <pメッセージキーは、「cellFieldError.range」。 * <p>メッセージ中で利用可能な変数は次の通り。 * <ul> * <li>「validatedValue」:検証対象の値のオブジェクト。 * <li>「formattedValidatedValue」:{@link FieldFormatter}により、文字列にフォーマットした検証対象の値。 * <li>「min」:下限値となる最小値。 * <li>「formattedMin」:{@link FieldFormatter}により、文字列にフォーマットした上限値となる最大値。 * <li>「max」:上限値となる最大値。 * <li>「formattedMax」:{@link FieldFormatter}により、文字列にフォーマットした上限値となる最大値。 * * @version 1.0 * @author T.TSUCHIE * */ public class RangeValidator<T extends Comparable<T>> extends AbstractFieldValidator<T> { private final T min; private final T max; /** エラーメッセージ中のための値のフォーマッタ */ private FieldFormatter<T> formatter; /** * 値の範囲となる最小値と最大値を指定するコンストラクタ * <p>値のフォーマットは、{@link DefaultFieldFormatter} を利用します。 * @param min 下限値となる最小値 * @param max 上限値となる最大値 */ public RangeValidator(final T min, final T max) { this(min, max, new DefaultFieldFormatter<T>(null)); } /** * 値のフォーマットするための書式を指定するコンストラクタ * <p>値のフォーマットは、{@link DefaultFieldFormatter} を利用します。 * @param min 下限値となる最小値 * @param max 上限値となる最大値 * @param pattern メッセージ中に表示するための値をフォーマットする際の書式。 */ public RangeValidator(final T min, final T max, final String pattern) { this(min, max, new DefaultFieldFormatter<T>(pattern)); } /** * 値のフォーマッタ指定するコンストラクタ * * @since 1.0 * @param min 下限値となる最小値 * @param max 上限値となる最大値 * @param formatter エラーメッセージ中のための値のフォーマッタ * @throws IllegalArgumentException formatter is null. */ public RangeValidator(final T min, final T max, final FieldFormatter<T> formatter) { super(); ArgUtils.notNull(min, "min"); ArgUtils.notNull(max, "max"); ArgUtils.notMax(min, max, "min"); ArgUtils.notNull(formatter, "formatter"); this.min = min; this.max = max; this.formatter = formatter; } @Override public String getDefaultMessageKey() { return "cellFieldError.range"; } @Override protected boolean validate(final T value) { if(isNullValue(value)) { return true; } if(value.compareTo(getMin()) >= 0 && value.compareTo(getMax()) <= 0) { return true; } return false; } @Override protected LinkedHashMap<String, Object> getMessageVars(final T value) { final LinkedHashMap<String, Object> vars = new LinkedHashMap<>(); vars.put("validatedValue", value); vars.put("formattedValidatedValue", formatter.format(value)); vars.put("min", getMin()); vars.put("formattedMin", formatter.format(getMin())); vars.put("max", getMax()); vars.put("formattedMax", formatter.format(getMax())); return vars; } /** * Validatorの下限値となる最小値を取得する。 * @return 最小値。 */ public T getMin() { return min; } /** * Validatorの上限値となる最大値を取得する。 * @return 最大値。 */ public T getMax() { return max; } }