ArraySizeValidator.java

package com.gh.mygreen.xlsmapper.validation.fieldvalidation.impl;

import java.util.Map;

import com.gh.mygreen.xlsmapper.util.ArgUtils;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.AbstractArrayFieldValidator;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.ArrayCellField;

/**
 * 配列やリストが指定したサイズかチェックする。
 *
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class ArraySizeValidator<E> extends AbstractArrayFieldValidator<E> {

    /** 最小サイズ */
    private final int min;

    /** 最大サイズ */
    private final int max;

    /**
     * 制約のサイズを指定するコンストラクタ。
     *
     * @param min 最小サイズ
     * @param max 最大サイズ
     * @throws IllegalArgumentException {@literal min <=0 or max <= 0 or min > max}
     */
    public ArraySizeValidator(final int min, final int max) {
        ArgUtils.notMin(min, 0, "min");
        ArgUtils.notMin(max, 0, "max");
        ArgUtils.notMax(min, max, "min");
        this.min = min;
        this.max = max;

    }

    @Override
    public ArraySizeValidator<E> addGroup(final Class<?>... group) {
        return (ArraySizeValidator<E>)super.addGroup(group);
    }

    @Override
    public String getMessageKey() {
        return "cellFieldError.arraySize";

    }

    @Override
    protected Map<String, Object> getMessageVariables(final ArrayCellField<E> cellField) {

        final Map<String, Object> vars = super.getMessageVariables(cellField);
        vars.put("size", cellField.getValueAsList().size());
        vars.put("min", getMin());
        vars.put("max", getMax());

        return vars;
    }

    @Override
    protected void onValidate(final ArrayCellField<E> cellField) {

        final int length = cellField.getValueAsList().size();
        if(getMin() <= length && length <= getMax()) {
            return;
        }

        error(cellField);
    }

    /**
     * 最小サイズを取得する
     * @return 最小サイズ
     */
    public int getMin() {
        return min;
    }

    /**
     * 最大サイズを取得する
     * @return 最大サイズ
     */
    public int getMax() {
        return max;
    }

}