package ru.hflabs.rcd.task; import org.springframework.validation.Errors; import ru.hflabs.rcd.exception.constraint.task.IllegalCronSyntaxException; import ru.hflabs.rcd.exception.search.UnknownTaskDefinitionException; import ru.hflabs.rcd.model.task.TaskDescriptor; import ru.hflabs.rcd.service.ITaskDefinitionRepository; import ru.hflabs.rcd.service.document.ChangeValidatorService; import ru.hflabs.util.core.FormatUtil; /** * Класс <class>TaskDescriptorValidator</class> реализует сервис валидации дескриптора задачи * * @author Nazin Alexander */ public class TaskDescriptorValidator extends ChangeValidatorService<TaskDescriptor> { /** Сервис работы с репозиторием предопределенных задач */ private ITaskDefinitionRepository taskDefinitionRepository; public TaskDescriptorValidator() { super(TaskDescriptor.class); } public void setTaskDefinitionRepository(ITaskDefinitionRepository taskDefinitionRepository) { this.taskDefinitionRepository = taskDefinitionRepository; } @Override protected TaskDescriptor formatValue(TaskDescriptor target) { target.setName(FormatUtil.parseString(target.getName())); target.setCron(FormatUtil.parseString(target.getCron())); return super.formatValue(target); } /** * Выполняет валидацию параметров дескриптора * * @param errors контейнер ошибок * @param target проверяемый дескриптор */ private void doValidateParameters(Errors errors, TaskDescriptor target) { errors.pushNestedPath(TaskDescriptor.PARAMETERS); try { doValidateAnnotations(errors, target.getParameters()); } finally { errors.popNestedPath(); } } /** * Выполняет валидацию на основе предопределенного дескриптора * * @param errors контейнер ошибок * @param target проверяемый дескриптор */ private void doValidatePredefinedDescriptor(Errors errors, TaskDescriptor target) { try { // Выполняет заполнение динамических target = taskDefinitionRepository.populate(target); // Выполняем валидацию параметров doValidateParameters(errors, target); } catch (UnknownTaskDefinitionException ex) { rejectValue(errors, TaskDescriptor.NAME, ex, target.getName()); } catch (IllegalCronSyntaxException ex) { rejectValue(errors, TaskDescriptor.CRON, ex, target.getCron()); } } @Override protected void doValidate(Errors errors, TaskDescriptor target) { super.doValidate(errors, target); if (!errors.hasErrors()) { doValidatePredefinedDescriptor(errors, target); } } }