GroupValidatorSupport.java

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

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import com.gh.mygreen.xlsmapper.validation.DefaultGroup;

/**
 * バリデーション時のヒントとなるグループを指定することが可能なValidatorのサポートクラス。
 *
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public abstract class GroupValidatorSupport {

    /**
     * バリデーション時のヒントとなるグループ
     */
    protected Set<Class<?>> settingGroups = new LinkedHashSet<>();

    /**
     * 値が空のときでも検証を行うかどうか。
     * @return trueの場合、検証を行う。
     */
    protected boolean validateOnEmptyValue() {
        return false;
    }

    /**
     * バリデーション時のヒントを追加する。
     * @param groups バリデーション時のヒント。
     * @return 自身のインスタンス。
     */
    public GroupValidatorSupport addGroup(final Class<?>... groups) {
        this.settingGroups.addAll(Arrays.asList(groups));

        return this;
    }

    /**
     * 設定されているバリデーションのグループを取得する。
     * @return
     */
    public Set<Class<?>> getSettingGroups() {
        return settingGroups;
    }

    /**
     * バリデーション時のヒントが該当するかどうか。
     * @param validationGroups 判定対象のグループ
     * @return 該当する。
     */
    protected boolean containsValidationGroups(final List<Class<?>> validationGroups) {

        // バリデーション時のグループの指定が無い場合
        if(getSettingGroups().isEmpty() && validationGroups.isEmpty()) {
            return true;

        }

        // デフォルトグループ指定されている場合、該当する。
        if(validationGroups.isEmpty()) {
            for(Class<?> settingGroup : getSettingGroups()) {
                if(DefaultGroup.class.isAssignableFrom(settingGroup)) {
                    return true;
                }
            }
        }

        for(Class<?> group : validationGroups) {

            if(getSettingGroups().isEmpty() && DefaultGroup.class.isAssignableFrom(group)) {
                return true;
            }

            if(getSettingGroups().contains(group)) {
                return true;
            }

            // 親子関係のチェック
            for(Class<?> parent : getSettingGroups()) {
                if(parent.isAssignableFrom(group)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * エラー用のメッセージキーを取得します。
     * @return メッセージキー。独自に指定するような場合は、nullを返します。
     */
    protected String getMessageKey() {
        return null;
    }


}