From 58d0e9655daa912b867d07ddec0454c950d4f9c8 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 16 Jan 2023 16:38:49 +0300 Subject: [PATCH] EnumPresentRule validator (commit for test) --- .../scheduler/config/ValidationConfig.java | 63 +++++++++++++++++++ .../clearing/scheduler/error/Errors.java | 21 +++++++ .../validation/rules/EnumPresentRule.java | 48 ++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ValidationConfig.java create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/Errors.java create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/validation/rules/EnumPresentRule.java diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ValidationConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ValidationConfig.java new file mode 100644 index 000000000..3948ed69a --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ValidationConfig.java @@ -0,0 +1,63 @@ +package ru.spcex.clearing.scheduler.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.platform.dictionary.TaskDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerNewRequest; +import ru.spcex.clearing.scheduler.validation.rules.EnumPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +@Configuration +public class ValidationConfig { + private final Map> imdgs; + + public ValidationConfig(ImdgProvider imdgProvider) { + this.imdgs = new HashMap<>(); + BiConsumer> addImdg = (s, aClass) -> imdgs.put(s, imdgProvider.getImdg(s, aClass)); + addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); + addImdg.accept(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + addImdg.accept(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + } + + /** + * чтобы во всех валидаторах был один экземпляр Imdg + */ + private Imdg getImdg(String key) { + return imdgs.get(key); + } + + @Bean("plannerNewRequestValidator") + public Function plannerNewRequestValidator() { + return plannerNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(plannerNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); + addImdg.accept(IMDGDistributedNames.Map_TaskDictionary); + addImdg.accept(IMDGDistributedNames.Map_TaskStatusDictionary); + return new ValidatorImpl<>(context, + EnumPresentRule.instance("task", + PlannerNewRequest::getTask, + IMDGDistributedNames.Map_TaskDictionary, + TaskDictionary.class) + ); + }; + } + +} diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/Errors.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/Errors.java new file mode 100644 index 000000000..7fdec8a3e --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/Errors.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.scheduler.error; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum Errors implements IEnumId { + WrongFieldValue(10003L) + + ; + + private final Long id; + + Errors(Long id) { + this.id = id; + } + + + @Override + public Long getId() { + return null; + } +} diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/validation/rules/EnumPresentRule.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/validation/rules/EnumPresentRule.java new file mode 100644 index 000000000..0acec99af --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/validation/rules/EnumPresentRule.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.scheduler.validation.rules; + +import ru.spcex.clearing.scheduler.error.Errors; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public class EnumPresentRule implements IValidationRule> { + protected final Function getEnumCode; + protected final String dictionaryName; + protected final String fieldName; + protected final Class enumClass; + + public EnumPresentRule(String fieldName, Function getEnumCode, String dictionaryName, Class enumClass) { + this.fieldName = fieldName; + this.getEnumCode = getEnumCode; + this.dictionaryName = dictionaryName; + this.enumClass = enumClass; + } + + public static EnumPresentRule instance(String fieldName, + Function getEnumCode, + String dictionaryName, + Class enumClass) { + return new EnumPresentRule<>(fieldName, getEnumCode, dictionaryName, enumClass); + } + + @Override + public Optional validate(ImdgValidationContext context) { + T validatedObject = context.getValidatedObject(); + String enumCode = getEnumCode.apply(validatedObject); + Imdg dictImdg = context.obtainMap( + dictionaryName, + enumClass + ); + D taskFromMap = dictImdg.getSingleObjectByFieldValues(Map.of("code", enumCode)); + if (taskFromMap == null) { + return of(Errors.WrongFieldValue, fieldName); + } + return empty(); + } +}