Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 0a984bc1 by Tony Chemit at 2023-11-26T14:46:34+01:00 Add a new hook when loading a dto for from and validation (we will use it in Validation interceptor to load on dto some properties used for validation) - - - - - 8e9ef36f by Tony Chemit at 2023-11-26T14:46:35+01:00 Use new hook loadDtoFroValidation in EntityInterceptor (so now we can have exact same behaviour than in application forms (but need to double check any overrides)) - - - - - 7 changed files: - core/persistence/java/src/main/java/fr/ird/observe/entities/data/ll/logbook/SetSpi.java - core/persistence/java/src/main/java/fr/ird/observe/entities/data/ll/observation/SetSpi.java - core/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/observation/SetSpi.java - core/persistence/java/src/main/java/fr/ird/observe/spi/validation/ValidationHelper.java - toolkit/persistence/src/main/java/fr/ird/observe/spi/context/EditableDtoEntityContext.java - toolkit/persistence/src/main/java/fr/ird/observe/spi/validation/EntityInterceptor.java - toolkit/persistence/src/main/java/fr/ird/observe/spi/validation/ValidationMessageDetector.java Changes: ===================================== core/persistence/java/src/main/java/fr/ird/observe/entities/data/ll/logbook/SetSpi.java ===================================== @@ -79,7 +79,7 @@ public class SetSpi extends GeneratedSetSpi { @Override public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) { - super.loadDtoForValidation(context, entity, dto); + super.loadDtoForValidation(context, parent, entity, dto); dto.setOtherSets(getBrothers(context, parent)); } ===================================== core/persistence/java/src/main/java/fr/ird/observe/entities/data/ll/observation/SetSpi.java ===================================== @@ -116,7 +116,7 @@ public class SetSpi extends GeneratedSetSpi { @Override public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) { - super.loadDtoForValidation(context, entity, dto); + super.loadDtoForValidation(context, parent, entity, dto); dto.setOtherSets(getBrothers(context, parent)); } ===================================== core/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/observation/SetSpi.java ===================================== @@ -69,7 +69,7 @@ public class SetSpi extends GeneratedSetSpi { @Override public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) { - super.loadDtoForValidation(context, entity, dto); + super.loadDtoForValidation(context, parent, entity, dto); Route route = Activity.SPI.getParent(context, parent.getTopiaId()); Date routeDate = route.getDate(); dto.setStartSetDate(routeDate); ===================================== core/persistence/java/src/main/java/fr/ird/observe/spi/validation/ValidationHelper.java ===================================== @@ -77,7 +77,7 @@ public class ValidationHelper { try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) { // We need to inject species dto (required by some validators) Set<SpeciesDto> species = Species.loadEntitiesToDto(context); - ValidationMessageDetector detector = ValidationMessageDetector.forData(toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder); + ValidationMessageDetector detector = ValidationMessageDetector.forData(context, toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder); long t0 = TimeLog.getTime(); try { validateData(detector, validationContext, entity, species); @@ -99,7 +99,7 @@ public class ValidationHelper { try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) { // We need to inject species dto (required by some validators) Set<SpeciesDto> species = Species.loadEntitiesToDto(context); - ValidationMessageDetector detector = ValidationMessageDetector.forData(toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder); + ValidationMessageDetector detector = ValidationMessageDetector.forData(context, toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder); for (String dataId : request.getDataIds()) { DataDtoEntityContext<?, ?, ?, ?> spi; if (TripAware.isSeineId(dataId)) { @@ -122,7 +122,7 @@ public class ValidationHelper { ReferentialLocale referentialLocale = context.getReferentialLocale(); try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) { - ValidationMessageDetector detector = ValidationMessageDetector.forReferential(toValidatorsMap(request), validationContext, referentialLocale, resultBuilder); + ValidationMessageDetector detector = ValidationMessageDetector.forReferential(context, toValidatorsMap(request), validationContext, referentialLocale, resultBuilder); boolean notPersisted = entity.isNotPersisted(); if (notPersisted) { entity.setTopiaId("__create"); @@ -150,7 +150,7 @@ public class ValidationHelper { try (ServiceValidationContext validationContext = (ServiceValidationContext) context.createServiceValidationContext(configuration, request)) { ReferentialLocale referentialLocale = context.getReferentialLocale(); try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) { - ValidationMessageDetector detector = ValidationMessageDetector.forReferential(toValidatorsMap(request), validationContext, referentialLocale, resultBuilder); + ValidationMessageDetector detector = ValidationMessageDetector.forReferential(context, toValidatorsMap(request), validationContext, referentialLocale, resultBuilder); for (Class<? extends ReferentialDto> type : request.getReferentialTypes()) { ReferentialDtoEntityContext<?, ?, ?, ?> spi = context.fromReferentialDto(type); validateReferential(context, spi, detector, validationContext); ===================================== toolkit/persistence/src/main/java/fr/ird/observe/spi/context/EditableDtoEntityContext.java ===================================== @@ -104,6 +104,12 @@ public abstract class EditableDtoEntityContext< super.loadDtoForValidation(context, entity, dto); } + @Override + public void loadDtoForValidation(ServiceContext context, E entity, D dto) { + PE parent = getParent(context, entity.getTopiaId()); + loadDtoForValidation(context, parent, entity, dto); + } + public final Form<D> preCreate(ServiceContext context, String parentId) { PE parent = parentSpi().loadEntity(context, parentId); E preCreated = newEntity(context.now()); ===================================== toolkit/persistence/src/main/java/fr/ird/observe/spi/validation/EntityInterceptor.java ===================================== @@ -26,6 +26,7 @@ import fr.ird.observe.dto.BusinessDto; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.Entity; import fr.ird.observe.spi.context.DtoEntityContext; +import fr.ird.observe.spi.service.ServiceContext; import fr.ird.observe.validation.ValidationContextSupport; import fr.ird.observe.validation.api.result.ValidationResultDtoMessage; import io.ultreia.java4all.decoration.Decorator; @@ -62,10 +63,14 @@ public class EntityInterceptor<D extends BusinessDto, E extends Entity> { this.cache = new TreeMap<>(); } - LinkedList<ValidationResultDtoMessage> intercept(MessagesCollector messagesCollector, ValidationContextSupport validationDataContext, E e) { + LinkedList<ValidationResultDtoMessage> intercept(ServiceContext context, MessagesCollector messagesCollector, ValidationContextSupport validationDataContext, E e) { e.registerDecorator(decorator); if (validator != null) { - D dto = cache.computeIfAbsent(e.getTopiaId(), id -> spi.toDto(referentialLocale, e)); + D dto = cache.computeIfAbsent(e.getTopiaId(), id -> { + D result = spi.toDto(referentialLocale, e); + spi.loadDtoForValidation(context, e, result); + return result; + }); if (dataContextConsumer != null) { dataContextConsumer.accept(dto.getId()); validationDataContext.add(dto); ===================================== toolkit/persistence/src/main/java/fr/ird/observe/spi/validation/ValidationMessageDetector.java ===================================== @@ -26,6 +26,7 @@ import fr.ird.observe.dto.BusinessDto; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.Entity; import fr.ird.observe.navigation.id.IdProject; +import fr.ird.observe.spi.service.ServiceContext; import fr.ird.observe.validation.ValidationContextSupport; import fr.ird.observe.validation.ValidatorsMap; import fr.ird.observe.validation.api.result.ValidationResultBuilder; @@ -59,6 +60,7 @@ public class ValidationMessageDetector { private static class ValidationEntityVisitor implements TopiaEntityVisitor { + private final ServiceContext context; private final ValidationContextSupport validationDataContext; private final Map<Class<?>, EntityInterceptor<?, ?>> interceptors; private final Deque<Entity> path; @@ -68,10 +70,12 @@ public class ValidationMessageDetector { private final boolean canWalkInSubclasses; - ValidationEntityVisitor(ValidationContextSupport validationDataContext, + ValidationEntityVisitor(ServiceContext context, + ValidationContextSupport validationDataContext, Map<Class<?>, EntityInterceptor<?, ?>> interceptors, ValidationResultBuilder resultBuilder, MessagesCollector messagesCollector, boolean canWalkInSubclasses) { + this.context = context; this.validationDataContext = validationDataContext; this.interceptors = interceptors; this.resultBuilder = resultBuilder; @@ -140,7 +144,7 @@ public class ValidationMessageDetector { if (interceptor == null) { return; } - LinkedList<ValidationResultDtoMessage> messages = interceptor.intercept(messagesCollector, validationDataContext, e); + LinkedList<ValidationResultDtoMessage> messages = interceptor.intercept(context,messagesCollector, validationDataContext, e); resultBuilder.addMessages(getPath(), messages); } @@ -178,7 +182,8 @@ public class ValidationMessageDetector { } } - public static ValidationMessageDetector forData(ValidatorsMap validators, + public static ValidationMessageDetector forData(ServiceContext context, + ValidatorsMap validators, ValidationContextSupport validationDataContext, IdProject selectModel, ReferentialLocale referentialLocale, @@ -187,33 +192,38 @@ public class ValidationMessageDetector { validationDataContext, selectModel, referentialLocale); - return new ValidationMessageDetector(referentialLocale, + return new ValidationMessageDetector(context, + referentialLocale, validationDataContext, resultBuilder, interceptors, true); } - public static ValidationMessageDetector forReferential(ValidatorsMap validators, + public static ValidationMessageDetector forReferential(ServiceContext context, + ValidatorsMap validators, ValidationContextSupport validationDataContext, ReferentialLocale referentialLocale, ValidationResultBuilder resultBuilder) { Map<Class<?>, EntityInterceptor<?, ?>> interceptors = EntityInterceptors.forReferential(validators, validationDataContext, referentialLocale); - return new ValidationMessageDetector(referentialLocale, + return new ValidationMessageDetector(context, + referentialLocale, validationDataContext, resultBuilder, interceptors, false); } - private ValidationMessageDetector(ReferentialLocale referentialLocale, + private ValidationMessageDetector(ServiceContext context, + ReferentialLocale referentialLocale, ValidationContextSupport validationDataContext, ValidationResultBuilder resultBuilder, Map<Class<?>, EntityInterceptor<?, ?>> interceptors, boolean canWalkInSubclasses) { - this.entityVisitor = new ValidationEntityVisitor(validationDataContext, + this.entityVisitor = new ValidationEntityVisitor(context, + validationDataContext, interceptors, resultBuilder, new MessagesCollector(referentialLocale.getLocale()), View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/1c40214edd7c59c09569e4aeb... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/1c40214edd7c59c09569e4aeb... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)