package com.sample.domain.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import lombok.extern.slf4j.Slf4j;

/**
 * 基底入力チェッククラス
 */
@Slf4j
public abstract class AbstractValidator<T> implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void validate(final Object target, final Errors errors) {
        try {
            boolean hasErrors = errors.hasErrors();

            if (!hasErrors || passThruBeanValidation(hasErrors)) {
                // 各機能で実装しているバリデーションを実行する
                doValidate((T) target, errors);
            }
        } catch (RuntimeException e) {
            log.error("validate error", e);
            throw e;
        }
    }

    /**
     * 入力チェックを実施します。
     *
     * @param form
     * @param errors
     */
    protected abstract void doValidate(final T form, final Errors errors);

    /**
     * 相関チェックバリデーションを実施するかどうかを示す値を返します。<br />
     * デフォルトは、JSR-303バリデーションでエラーがあった場合は相関チェックを実施しません。
     * 
     * @return
     */
    protected boolean passThruBeanValidation(boolean hasErrors) {
        return false;
    }
}