LengthExactValidator.java

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

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.gh.mygreen.xlsmapper.util.ArgUtils;
import com.gh.mygreen.xlsmapper.util.Utils;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.AbstractFieldValidator;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.CellField;

/**
 * 文字列が指定した文字長かどうか検証する。
 * <ul>
 *   <li>メッセージキーは、「cellFieldError.lengthExact」。</li>
 *   <li>「validatedValue」:検証対象の値のオブジェクト。</li>
 *   <li>「length」:実際の値の文字長。</li>
 *   <li>「requiredLengths」:指定した文字長。</li>
 * </ul>
 *
 * @since 2.0
 * @author T.TSUCHIE
 */
public class LengthExactValidator extends AbstractFieldValidator<String> {

    /** 必要な文字長 */
    private final List<Integer> requiredLengths;

    /**
     * 文字長を指定するコンストラクタ
     *
     * @param requiredLengths 必要な文字長。複数指定可能。
     */
    public LengthExactValidator(final int... requiredLengths) {
        ArgUtils.notEmpty(requiredLengths, "requiredLengths");
        this.requiredLengths = Arrays.stream(requiredLengths)
                .filter(l -> l >= 0)
                .sorted()
                .distinct()
                .boxed()
                .collect(Collectors.toList());
    }

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

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

    @Override
    protected Map<String, Object> getMessageVariables(final CellField<String> cellField) {
        final Map<String, Object> vars = super.getMessageVariables(cellField);

        vars.put("length", cellField.getValue().length());
        vars.put("requiredLengths", getRequiredLengths());

        return vars;
    }

    @Override
    protected void onValidate(final CellField<String> cellField) {

        final int length = cellField.getValue().length();
        if(requiredLengths.contains(length)) {
            return;
        }

        error(cellField);
    }

    /**
     * 比較対象の文字長の候補を取得する。
     * @return 文字長の候補を取得する。
     */
    public int[] getRequiredLengths() {
        return Utils.toArray(requiredLengths);
    }

}