remove ImdgValidationContext.java, IValidatorContext.java, IValidationRule.java, IValidator.java, ValidatorImpl.java from clearing-utils
This commit is contained in:
parent
a7875f2396
commit
b6f516d81d
12 changed files with 13 additions and 270 deletions
|
|
@ -1,7 +0,0 @@
|
||||||
package ru.spcex.clearing.validation.common.context;
|
|
||||||
|
|
||||||
public interface IValidatorContext {
|
|
||||||
default <S> S getStoredObject(Enum<?> storedObject) {
|
|
||||||
throw new UnsupportedOperationException("not implemented");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
package ru.spcex.clearing.validation.common.context;
|
|
||||||
|
|
||||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
|
||||||
public class ImdgValidationContext<T> implements IValidatorContext {
|
|
||||||
private final Map<String, Imdg<?>> imdgs;
|
|
||||||
private final Map<Enum<?>, Object> storedObjects;
|
|
||||||
private T validatedObject;
|
|
||||||
|
|
||||||
public ImdgValidationContext() {
|
|
||||||
this.imdgs = new HashMap<>();
|
|
||||||
this.storedObjects = new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addImdg(String key, Imdg<?> imdg) {
|
|
||||||
imdgs.put(key, imdg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValidatedObject(T validatedObject) {
|
|
||||||
this.validatedObject = validatedObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T getValidatedObject() {
|
|
||||||
return validatedObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* !!!не использовать один Enum в разных местах
|
|
||||||
*/
|
|
||||||
public void storeObject(Enum<?> storedObject, Object anyObject) {
|
|
||||||
storedObjects.put(storedObject, anyObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <S> S getStoredObject(Enum<?> storedObject) {
|
|
||||||
Object o = storedObjects.get(storedObject);
|
|
||||||
return (S) o;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <V extends SpcexObjectBase> Imdg<V> obtainMap(String mapName, Class<V> clazz) {
|
|
||||||
Imdg<?> imdg = imdgs.get(mapName);
|
|
||||||
if (imdg == null) {
|
|
||||||
throw new IllegalStateException(mapName + " imdg wasn't added to validation context");
|
|
||||||
}
|
|
||||||
return (Imdg<V>) imdg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
import ru.clearing.platform.dictionary.AbstractDictionary;
|
import ru.clearing.platform.dictionary.AbstractDictionary;
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.IValidatorContext;
|
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Правило валидации, описывающее какую ошибку возвращать и при каких условиях
|
|
||||||
* Все необходимые данные берет из контекста
|
|
||||||
* @param <C> контекст
|
|
||||||
*/
|
|
||||||
public interface IValidationRule<C extends IValidatorContext> {
|
|
||||||
Optional<EnumMessage> validate(C context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* для логов
|
|
||||||
*/
|
|
||||||
default String ruleName() {
|
|
||||||
return getClass().getSimpleName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* если у валидатора был вызван метод проверить все, этот метод может использоваться для более тонкой настройки
|
|
||||||
* по дефолту - выполнять проверку даже если предыдущие выполнены с ошибками
|
|
||||||
*/
|
|
||||||
default boolean runIfErrorsPresent() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************** методы для сокращения кода ***************
|
|
||||||
default Optional<EnumMessage> of(IEnumId error) {
|
|
||||||
return Optional.of(new EnumMessage(error));
|
|
||||||
}
|
|
||||||
|
|
||||||
default Optional<EnumMessage> of(IEnumId error, Object... args) {
|
|
||||||
return Optional.of(new EnumMessage(error, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
default Optional<EnumMessage> empty() {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
|
||||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
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.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package ru.spcex.clearing.validation.common.rules;
|
package ru.spcex.clearing.validation.common.rules;
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.context.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
package ru.spcex.clearing.validation.common.validator;
|
|
||||||
|
|
||||||
|
|
||||||
import ru.spcex.clearing.validation.common.rules.IValidationRule;
|
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Валидатор, в который можно добавлять правила проверок.
|
|
||||||
* Будет выполнять их в том порядке, в котором их добавляли
|
|
||||||
*/
|
|
||||||
public interface IValidator {
|
|
||||||
/**
|
|
||||||
* метод для добавления правил валидации
|
|
||||||
* если положить правило с некорректными типами, при вызове validate будет ClassCastException
|
|
||||||
*/
|
|
||||||
void addRule(IValidationRule<?> rule);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* если хотим добавить проверки другого валидатора<br>
|
|
||||||
* они будут выполняться только если проверки этого успешно пройдены
|
|
||||||
* возвращает себя
|
|
||||||
*/
|
|
||||||
IValidator chain(IValidator anotherValidator);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* валидирует все (подходит для случаев когда проверки не полагаются на то что предыдущие проверки прошли нормально)
|
|
||||||
*/
|
|
||||||
Collection<EnumMessage> validateAll();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* валидирует до первой ошибки
|
|
||||||
*/
|
|
||||||
Optional<EnumMessage> tillFirstError();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* валидирует все, возвращает первую ошибку - для совместимости
|
|
||||||
*/
|
|
||||||
Optional<EnumMessage> validateAllReturnFirst();
|
|
||||||
|
|
||||||
default <S> S getStored(Enum<?> storedObject) {
|
|
||||||
throw new UnsupportedOperationException("not implemented");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,6 +7,7 @@ import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
import ru.spcex.clearing.platform.messaging.service.Status;
|
import ru.spcex.clearing.platform.messaging.service.Status;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
||||||
package ru.spcex.clearing.validation.common.validator;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import ru.spcex.clearing.validation.common.context.IValidatorContext;
|
|
||||||
import ru.spcex.clearing.validation.common.rules.IValidationRule;
|
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Валидатор, предназначенный для правил у которых есть "контекст" валидации
|
|
||||||
*/
|
|
||||||
public class ValidatorImpl<C extends IValidatorContext> implements IValidator {
|
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
|
||||||
private List<IValidationRule<C>> rules = new ArrayList<>();
|
|
||||||
private C context;
|
|
||||||
private IValidator chainedValidator;
|
|
||||||
|
|
||||||
public ValidatorImpl(C context) {this.context = context;}
|
|
||||||
|
|
||||||
public ValidatorImpl(C context, IValidationRule<?>... rules) { //<C>
|
|
||||||
this.context = context;
|
|
||||||
for (IValidationRule<?> rule : rules) {
|
|
||||||
addRule(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContext(C context) {
|
|
||||||
this.context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void addRule(IValidationRule<?> rule) {
|
|
||||||
rules.add((IValidationRule<C>) rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IValidator chain(IValidator anotherValidator) {
|
|
||||||
if (chainedValidator == null) {
|
|
||||||
chainedValidator = anotherValidator;
|
|
||||||
} else {
|
|
||||||
chainedValidator.chain(anotherValidator);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<EnumMessage> validateAll() {
|
|
||||||
List<EnumMessage> errors = new ArrayList<>();
|
|
||||||
Instant begin = Instant.now();
|
|
||||||
for (IValidationRule<C> rule : rules) {
|
|
||||||
if (rule.runIfErrorsPresent() || errors.size() == 0) {
|
|
||||||
Optional<EnumMessage> validationError;
|
|
||||||
validationError = rule.validate(context);
|
|
||||||
validationError.ifPresent(errors::add);
|
|
||||||
if (validationError.isPresent()) {
|
|
||||||
log.debug("validating stage: {} error", rule.ruleName());
|
|
||||||
} else {
|
|
||||||
log.debug("validating stage: {} complete", rule.ruleName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.debug("validation {} in {} ms",
|
|
||||||
errors.size() == 0 ? "successfully completed" : "completed with errors",
|
|
||||||
Instant.now().toEpochMilli() - begin.toEpochMilli());
|
|
||||||
if (chainedValidator != null && errors.size() == 0) errors.addAll(chainedValidator.validateAll());
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<EnumMessage> tillFirstError() {
|
|
||||||
Instant begin = Instant.now();
|
|
||||||
for (IValidationRule<C> rule : rules) {
|
|
||||||
log.debug("validating stage: {}", rule.ruleName());
|
|
||||||
Optional<EnumMessage> validationError;
|
|
||||||
validationError = rule.validate(context);
|
|
||||||
if (validationError.isPresent()) {
|
|
||||||
log.debug("validation stage: {} completed with error {} in {} ms",
|
|
||||||
rule.ruleName(), validationError.get().getSubject().getId(),
|
|
||||||
Instant.now().toEpochMilli() - begin.toEpochMilli());
|
|
||||||
return validationError;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.debug("validation successfully completed in {} ms", Instant.now().toEpochMilli() - begin.toEpochMilli());
|
|
||||||
if (chainedValidator != null) return chainedValidator.tillFirstError();
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<EnumMessage> validateAllReturnFirst() {
|
|
||||||
Collection<EnumMessage> allErrors = validateAll();
|
|
||||||
if (allErrors.size() > 0) {
|
|
||||||
EnumMessage error = allErrors.iterator().next();
|
|
||||||
return Optional.of(error);
|
|
||||||
} else
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <S> S getStored(Enum<?> storedObject) {
|
|
||||||
return context.getStoredObject(storedObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
public C getContext() {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Reference in a new issue