package ru.hflabs.rcd.service.document.recodeRule; import org.springframework.validation.Errors; import ru.hflabs.rcd.accessor.RuleFieldAccessor; import ru.hflabs.rcd.exception.constraint.IllegalPrimaryKeyException; import ru.hflabs.rcd.exception.constraint.document.IllegalFieldException; import ru.hflabs.rcd.exception.constraint.rule.IllegalRecodeRuleException; import ru.hflabs.rcd.model.document.Field; import ru.hflabs.rcd.model.path.FieldNamedPath; import ru.hflabs.rcd.model.rule.RecodeRule; import ru.hflabs.rcd.service.document.IFieldService; import ru.hflabs.rcd.service.document.RuleChangeValidator; import ru.hflabs.rcd.service.rule.IRecodeRuleService; import ru.hflabs.rcd.service.rule.IRecodeRuleSetService; import ru.hflabs.util.core.EqualsUtil; import static ru.hflabs.rcd.accessor.Accessors.FROM_RULE_INJECTOR; import static ru.hflabs.rcd.accessor.Accessors.TO_RULE_INJECTOR; /** * Класс <class>RecodeRuleValidator</class> реализует базовый валидатор для правила перекодирования * * @author Nazin Alexander */ public class RecodeRuleChangeValidator extends RuleChangeValidator<FieldNamedPath, Field, RecodeRule, IFieldService> { /** Сервис работы с наборами правил перекодирования */ private IRecodeRuleSetService recodeRuleSetService; /** Сервис работы с правилами перекодирования */ private IRecodeRuleService recodeRuleService; public RecodeRuleChangeValidator(boolean mustExist) { super(mustExist, RecodeRule.class, FROM_RULE_INJECTOR, TO_RULE_INJECTOR, IllegalRecodeRuleException.class); } public void setRecodeRuleSetService(IRecodeRuleSetService recodeRuleSetService) { this.recodeRuleSetService = recodeRuleSetService; } public void setRecodeRuleService(IRecodeRuleService recodeRuleService) { this.recodeRuleService = recodeRuleService; } @Override protected void doValidateField(Errors errors, RecodeRule target, RuleFieldAccessor<FieldNamedPath, Field, RecodeRule> accessor) { // Проверяем поле super.doValidateField(errors, target, accessor); // Проверяем, что значение поля принадлежит МЕТА-полю, по которому производится перекодировка if (!errors.hasErrors()) { String rrsMetaFieldId = accessor.applyRelativeId(target.getRelative()); String ruleMetaFieldId = accessor.apply(target).getMetaFieldId(); if (!EqualsUtil.equals(rrsMetaFieldId, ruleMetaFieldId)) { reject(errors, new IllegalFieldException(String.format("Recode rule should belong to META field with ID '%s'", rrsMetaFieldId))); } } } /** * Выполняет валидацию набора правил перекодирования * * @param errors контейнер ошибок * @param target проверяемое правило */ private void doValidateRuleSet(Errors errors, RecodeRule target) { String relativeId = target.getRelativeId(); try { target.injectRecodeRuleSet(recodeRuleSetService.findByID(relativeId, false, false)); } catch (IllegalPrimaryKeyException ex) { reject(errors, ex, relativeId); } } @Override protected void doValidateCommon(Errors errors, RecodeRule target) { // Проверяем существование набора правил перекодирования doValidateRuleSet(errors, target); // Проверяем существование значение полей if (!errors.hasErrors()) { super.doValidateCommon(errors, target); } } @Override protected RecodeRule findExisted(RecodeRule target, boolean exist) { return recodeRuleService.findUniqueByRelativeId( target.getRecodeRuleSetId(), target.getFromFieldId(), false, true); } }