PatternValidator.java

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

import java.util.Map;
import java.util.regex.Pattern;

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


/**
 * 正規表現を指定し、入力値チェックする。
 * <ul>
 *  <li>メッセージキーは、「cellFieldError.pattern」。</li>
 *   <li>「validatedValue」:検証対象の値のオブジェクト。</li>
 *   <li>「pattern」:正規表現の式。</li>
 *   <li>「description」:正規表現の名称。指定されていない場合は、null。</li>
 * </ul>
 *
 * @version 2.0
 * @author T.TSUCHIE
 *
 */
public class PatternValidator extends AbstractFieldValidator<String> {

    private final Pattern pattern;

    private final String description;

    /**
     * 正規表現のパターンを指定するコンストラクタ。
     * @param pattern 正規表現のパターン。
     */
    public PatternValidator(final String pattern) {
        this(Pattern.compile(pattern));
    }

    /**
     * 正規表現のパターンを指定するコンストラクタ。
     * @param pattern 正規表現のパターン。
     */
    public PatternValidator(final Pattern pattern) {
        this(pattern, null);
    }

    /**
     * 正規表現のパターンとその名称を指定するコンストラクタ。
     *
     * @since 1.5.1
     * @param pattern 正規表現のパターン。
     * @param description エラーメッセージ中で使用するパターンの名称。
     */
    public PatternValidator(final String pattern, final String description) {
        this(Pattern.compile(pattern), description);
    }

    /**
     * 正規表現のパターンとその名称を指定するコンストラクタ。
     *
     * @since 1.5.1
     * @param pattern 正規表現のパターン。
     * @param description エラーメッセージ中で使用するパターンの名称。
     */
    public PatternValidator(final Pattern pattern, final String description) {
        super();
        ArgUtils.notNull(pattern, "pattern");
        this.pattern = pattern;
        this.description = description;
    }

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

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

    @Override
    protected Map<String, Object> getMessageVariables(final CellField<String> cellField) {
        final Map<String, Object> vars = super.getMessageVariables(cellField);
        vars.put("pattern", getPattern().pattern());
        vars.put("description", getDescription());
        return vars;
    }

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

        if(pattern.matcher(cellField.getValue()).matches()) {
            return;
        }

        error(cellField);
    }

    /**
     * 設定されている正規表現を取得する。
     * @return pattern を取得する
     */
    public Pattern getPattern() {
        return pattern;
    }

    /**
     * 正規表現に対する名称を取得する。
     * @since 1.5.1
     * @return パターン名を取得する。指定されていない場合はnullを返す。
     */
    public String getDescription() {
        return description;
    }
}