diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index c1366595f..c46b1de32 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -105,9 +105,11 @@ public class ValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(sTrades); context.addImdg(IMDGDistributedNames.Map_Security, imdgSecurity); - context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); + context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity); + context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, STradesValidationRule.SecurityPresentFond, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java index 6190efd41..80921ae77 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java @@ -9,6 +9,7 @@ import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; @@ -29,8 +30,12 @@ public enum STradesValidationRule implements IValidationRule securityImdg = context.obtainMap(IMDGDistributedNames.Map_Security, Security.class); - Security security = securityImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", validatedObject.getSecCode())); + SecuritySelector slctr = new SecuritySelector<>( + context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), + context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), + context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class) + ); + Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode()); if (security == null) { return of(ClearingError.SecurityNotFound, validatedObject.getSecCode()); } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritiesServiceImdgConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritiesServiceImdgConfig.java index 93a4cca9a..747b138c1 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritiesServiceImdgConfig.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritiesServiceImdgConfig.java @@ -6,7 +6,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.securities.config.element.SecuritiesServiceSettings; -import ru.spcex.clearing.util.security.SecuritySelector; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @@ -45,10 +44,4 @@ public class SecuritiesServiceImdgConfig { pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); return pool; } - - @Autowired - @Bean - public SecuritySelector securitySelector(ImdgProvider imdgProvider) { - return new SecuritySelector(imdgProvider); - } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritySelectorConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritySelectorConfig.java new file mode 100644 index 000000000..4f82bae4e --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/SecuritySelectorConfig.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.securities.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; + +@Configuration +public class SecuritySelectorConfig { + @Autowired + @Bean + public SecuritySelector securitySelector(ImdgProvider imdgProvider) { + return new SecuritySelector<>(imdgProvider, Security.class); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java index 6e79de2a7..a7b227771 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java @@ -19,7 +19,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdate import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.securities.validation.ListingValidationProvider; -import ru.spcex.clearing.util.security.SecuritySelector; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; @@ -28,6 +27,7 @@ import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.utils.error.ValidationException; import java.time.Instant; @@ -42,7 +42,7 @@ public class ListingService extends QueueConsumer implements InitializingBean { private final ListingValidationProvider validation; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; - private final SecuritySelector securitySelector; + private final SecuritySelector securitySelector; private final RequestHelper requestHelper; @Autowired @@ -52,7 +52,7 @@ public class ListingService extends QueueConsumer implements InitializingBean { ListingValidationProvider validation, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, - SecuritySelector securitySelector, + SecuritySelector securitySelector, RequestHelper requestHelper) { super(kafkaQueue, kafkaProducer); this.validation = validation; diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ListingValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ListingValidationProvider.java index f9cabe1d1..81fcde979 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ListingValidationProvider.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ListingValidationProvider.java @@ -10,7 +10,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdateRequest; import ru.spcex.clearing.securities.errors.SecuritiesError; -import ru.spcex.clearing.util.security.SecuritySelector; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.clearing.validation.common.rules.SpecialIdPresentRule; @@ -19,6 +18,7 @@ import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.utils.enumeration.EnumMessage; @@ -36,10 +36,10 @@ public class ListingValidationProvider { final Imdg currencyCodeDictionaryImdg; final Imdg listingImdg; final Imdg marketImdg; - final SecuritySelector securitySelector; + final SecuritySelector securitySelector; - public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector securitySelector) { + public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector securitySelector) { this.securitySelector = securitySelector; this.workflowStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, SpcexObjectBase.class); this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, SpcexObjectBase.class); diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/AbstractServiceTest.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/AbstractServiceTest.java index 75a4070f8..aca650384 100644 --- a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/AbstractServiceTest.java +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/AbstractServiceTest.java @@ -16,6 +16,7 @@ import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.platform.dictionary.*; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.securities.config.ErrorResolverConfig; +import ru.spcex.clearing.securities.config.SecuritySelectorConfig; import ru.spcex.clearing.securities.config.ValidationConfig; import ru.spcex.clearing.securities.service.cud.*; import ru.spcex.clearing.securities.validation.ListingValidationProvider; @@ -23,7 +24,6 @@ import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.clearing.util.security.SecuritySelector; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -40,7 +40,7 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProv FixedIncomeSecurityService.class, MoneyMarketSecurityService.class, ListingService.class, ListingValidationProvider.class, - SecuritySelector.class, + SecuritySelectorConfig.class, ImdgTestConfig.class, KafkaTestConfig.class, ValidationProvider.class, diff --git a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/SecuritySelector.java b/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/SecuritySelector.java deleted file mode 100644 index bbc7f9794..000000000 --- a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/SecuritySelector.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.spcex.clearing.util.security; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; -import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; -import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -@Component -public class SecuritySelector { - - private final Imdg fixedIncomeSecurityImdg; - private final Imdg moneyMarketSecurityImdg; - private final Imdg equitySecurity; - - @Autowired - public SecuritySelector(ImdgProvider imdgProvider) { - this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); - this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); - this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); - } - - public Security selectSecurityById(Long securityId) { - Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId); - if (security != null) return security; - security = moneyMarketSecurityImdg.getSingleObjectByID(securityId); - if (security != null) return security; - security = equitySecurity.getSingleObjectByID(securityId); - if (security != null) return security; - - return security; // null - } -} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java new file mode 100644 index 000000000..c7c1a375e --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java @@ -0,0 +1,48 @@ +package ru.spcex.platform.imdg.api.predicate.specific; + +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Map; +import java.util.function.Function; + +public class SecuritySelector { + + private final Imdg fixedIncomeSecurityImdg; + private final Imdg moneyMarketSecurityImdg; + private final Imdg equitySecurity; + + public SecuritySelector(ImdgProvider imdgProvider, Class clazz) { + this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, clazz); + this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, clazz); + this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, clazz); + } + + public SecuritySelector(Imdg fixedIncomeSecurityImdg, + Imdg moneyMarketSecurityImdg, + Imdg equitySecurity) { + this.fixedIncomeSecurityImdg = fixedIncomeSecurityImdg; + this.moneyMarketSecurityImdg = moneyMarketSecurityImdg; + this.equitySecurity = equitySecurity; + } + + public T selectSecurityById(Long securityId) { + return selectSecurityByAnything(imdg -> imdg.getSingleObjectByID(securityId)); + } + + public T selectSecurityBySymbol(String securitySymbol) { + Map fields = Map.of("securitySymbol", securitySymbol); + return selectSecurityByAnything(imdg -> imdg.getFirstObjectByFieldValues(fields)); + } + + private T selectSecurityByAnything(Function, T> retriever) { + T security = retriever.apply(fixedIncomeSecurityImdg); + if (security != null) return security; + security = retriever.apply(moneyMarketSecurityImdg); + if (security != null) return security; + security = retriever.apply(equitySecurity); + return security;// null + } +}