STrades validation: проверка security для Fond

This commit is contained in:
ialbert 2023-07-27 17:56:53 +03:00
parent 6fbf4efa1c
commit cf1db1b604
9 changed files with 83 additions and 55 deletions

View file

@ -105,9 +105,11 @@ public class ValidationConfig {
ImdgValidationContext<STrades> 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,

View file

@ -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<ImdgValidationConte
if (TextUtil.isEmpty(validatedObject.getSecCode())) {
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
}
Imdg<Security> securityImdg = context.obtainMap(IMDGDistributedNames.Map_Security, Security.class);
Security security = securityImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", validatedObject.getSecCode()));
SecuritySelector<Security> 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());
}

View file

@ -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);
}
}

View file

@ -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<Security> securitySelector(ImdgProvider imdgProvider) {
return new SecuritySelector<>(imdgProvider, Security.class);
}
}

View file

@ -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<Security> 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<Security> securitySelector,
RequestHelper requestHelper) {
super(kafkaQueue, kafkaProducer);
this.validation = validation;

View file

@ -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<SpcexObjectBase> currencyCodeDictionaryImdg;
final Imdg<Listing> listingImdg;
final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
final SecuritySelector securitySelector;
final SecuritySelector<Security> securitySelector;
public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector securitySelector) {
public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector<Security> securitySelector) {
this.securitySelector = securitySelector;
this.workflowStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, SpcexObjectBase.class);
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, SpcexObjectBase.class);

View file

@ -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,

View file

@ -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<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private final Imdg<EquitySecurity> 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
}
}

View file

@ -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<T extends SpcexObjectBase> {
private final Imdg<T> fixedIncomeSecurityImdg;
private final Imdg<T> moneyMarketSecurityImdg;
private final Imdg<T> equitySecurity;
public SecuritySelector(ImdgProvider imdgProvider, Class<T> 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<T> fixedIncomeSecurityImdg,
Imdg<T> moneyMarketSecurityImdg,
Imdg<T> 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<String, String> fields = Map.of("securitySymbol", securitySymbol);
return selectSecurityByAnything(imdg -> imdg.getFirstObjectByFieldValues(fields));
}
private T selectSecurityByAnything(Function<Imdg<T>, 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
}
}