Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
-
0a984bc1
by Tony Chemit at 2023-11-26T14:46:34+01:00
-
8e9ef36f
by Tony Chemit at 2023-11-26T14:46:35+01:00
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:
| ... | ... | @@ -79,7 +79,7 @@ public class SetSpi extends GeneratedSetSpi { |
| 79 | 79 | |
| 80 | 80 | @Override
|
| 81 | 81 | public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) {
|
| 82 | - super.loadDtoForValidation(context, entity, dto);
|
|
| 82 | + super.loadDtoForValidation(context, parent, entity, dto);
|
|
| 83 | 83 | dto.setOtherSets(getBrothers(context, parent));
|
| 84 | 84 | }
|
| 85 | 85 |
| ... | ... | @@ -116,7 +116,7 @@ public class SetSpi extends GeneratedSetSpi { |
| 116 | 116 | |
| 117 | 117 | @Override
|
| 118 | 118 | public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) {
|
| 119 | - super.loadDtoForValidation(context, entity, dto);
|
|
| 119 | + super.loadDtoForValidation(context, parent, entity, dto);
|
|
| 120 | 120 | dto.setOtherSets(getBrothers(context, parent));
|
| 121 | 121 | }
|
| 122 | 122 |
| ... | ... | @@ -69,7 +69,7 @@ public class SetSpi extends GeneratedSetSpi { |
| 69 | 69 | |
| 70 | 70 | @Override
|
| 71 | 71 | public void loadDtoForValidation(ServiceContext context, Activity parent, Set entity, SetDto dto) {
|
| 72 | - super.loadDtoForValidation(context, entity, dto);
|
|
| 72 | + super.loadDtoForValidation(context, parent, entity, dto);
|
|
| 73 | 73 | Route route = Activity.SPI.getParent(context, parent.getTopiaId());
|
| 74 | 74 | Date routeDate = route.getDate();
|
| 75 | 75 | dto.setStartSetDate(routeDate);
|
| ... | ... | @@ -77,7 +77,7 @@ public class ValidationHelper { |
| 77 | 77 | try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) {
|
| 78 | 78 | // We need to inject species dto (required by some validators)
|
| 79 | 79 | Set<SpeciesDto> species = Species.loadEntitiesToDto(context);
|
| 80 | - ValidationMessageDetector detector = ValidationMessageDetector.forData(toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder);
|
|
| 80 | + ValidationMessageDetector detector = ValidationMessageDetector.forData(context, toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder);
|
|
| 81 | 81 | long t0 = TimeLog.getTime();
|
| 82 | 82 | try {
|
| 83 | 83 | validateData(detector, validationContext, entity, species);
|
| ... | ... | @@ -99,7 +99,7 @@ public class ValidationHelper { |
| 99 | 99 | try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) {
|
| 100 | 100 | // We need to inject species dto (required by some validators)
|
| 101 | 101 | Set<SpeciesDto> species = Species.loadEntitiesToDto(context);
|
| 102 | - ValidationMessageDetector detector = ValidationMessageDetector.forData(toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder);
|
|
| 102 | + ValidationMessageDetector detector = ValidationMessageDetector.forData(context, toValidatorsMap(request), validationContext, validationContext.getSelectModel(), referentialLocale, resultBuilder);
|
|
| 103 | 103 | for (String dataId : request.getDataIds()) {
|
| 104 | 104 | DataDtoEntityContext<?, ?, ?, ?> spi;
|
| 105 | 105 | if (TripAware.isSeineId(dataId)) {
|
| ... | ... | @@ -122,7 +122,7 @@ public class ValidationHelper { |
| 122 | 122 | ReferentialLocale referentialLocale = context.getReferentialLocale();
|
| 123 | 123 | |
| 124 | 124 | try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) {
|
| 125 | - ValidationMessageDetector detector = ValidationMessageDetector.forReferential(toValidatorsMap(request), validationContext, referentialLocale, resultBuilder);
|
|
| 125 | + ValidationMessageDetector detector = ValidationMessageDetector.forReferential(context, toValidatorsMap(request), validationContext, referentialLocale, resultBuilder);
|
|
| 126 | 126 | boolean notPersisted = entity.isNotPersisted();
|
| 127 | 127 | if (notPersisted) {
|
| 128 | 128 | entity.setTopiaId("__create");
|
| ... | ... | @@ -150,7 +150,7 @@ public class ValidationHelper { |
| 150 | 150 | try (ServiceValidationContext validationContext = (ServiceValidationContext) context.createServiceValidationContext(configuration, request)) {
|
| 151 | 151 | ReferentialLocale referentialLocale = context.getReferentialLocale();
|
| 152 | 152 | try (ValidationResultBuilder resultBuilder = ValidationResultBuilder.create()) {
|
| 153 | - ValidationMessageDetector detector = ValidationMessageDetector.forReferential(toValidatorsMap(request), validationContext, referentialLocale, resultBuilder);
|
|
| 153 | + ValidationMessageDetector detector = ValidationMessageDetector.forReferential(context, toValidatorsMap(request), validationContext, referentialLocale, resultBuilder);
|
|
| 154 | 154 | for (Class<? extends ReferentialDto> type : request.getReferentialTypes()) {
|
| 155 | 155 | ReferentialDtoEntityContext<?, ?, ?, ?> spi = context.fromReferentialDto(type);
|
| 156 | 156 | validateReferential(context, spi, detector, validationContext);
|
| ... | ... | @@ -104,6 +104,12 @@ public abstract class EditableDtoEntityContext< |
| 104 | 104 | super.loadDtoForValidation(context, entity, dto);
|
| 105 | 105 | }
|
| 106 | 106 | |
| 107 | + @Override
|
|
| 108 | + public void loadDtoForValidation(ServiceContext context, E entity, D dto) {
|
|
| 109 | + PE parent = getParent(context, entity.getTopiaId());
|
|
| 110 | + loadDtoForValidation(context, parent, entity, dto);
|
|
| 111 | + }
|
|
| 112 | + |
|
| 107 | 113 | public final Form<D> preCreate(ServiceContext context, String parentId) {
|
| 108 | 114 | PE parent = parentSpi().loadEntity(context, parentId);
|
| 109 | 115 | E preCreated = newEntity(context.now());
|
| ... | ... | @@ -26,6 +26,7 @@ import fr.ird.observe.dto.BusinessDto; |
| 26 | 26 | import fr.ird.observe.dto.referential.ReferentialLocale;
|
| 27 | 27 | import fr.ird.observe.entities.Entity;
|
| 28 | 28 | import fr.ird.observe.spi.context.DtoEntityContext;
|
| 29 | +import fr.ird.observe.spi.service.ServiceContext;
|
|
| 29 | 30 | import fr.ird.observe.validation.ValidationContextSupport;
|
| 30 | 31 | import fr.ird.observe.validation.api.result.ValidationResultDtoMessage;
|
| 31 | 32 | import io.ultreia.java4all.decoration.Decorator;
|
| ... | ... | @@ -62,10 +63,14 @@ public class EntityInterceptor<D extends BusinessDto, E extends Entity> { |
| 62 | 63 | this.cache = new TreeMap<>();
|
| 63 | 64 | }
|
| 64 | 65 | |
| 65 | - LinkedList<ValidationResultDtoMessage> intercept(MessagesCollector messagesCollector, ValidationContextSupport validationDataContext, E e) {
|
|
| 66 | + LinkedList<ValidationResultDtoMessage> intercept(ServiceContext context, MessagesCollector messagesCollector, ValidationContextSupport validationDataContext, E e) {
|
|
| 66 | 67 | e.registerDecorator(decorator);
|
| 67 | 68 | if (validator != null) {
|
| 68 | - D dto = cache.computeIfAbsent(e.getTopiaId(), id -> spi.toDto(referentialLocale, e));
|
|
| 69 | + D dto = cache.computeIfAbsent(e.getTopiaId(), id -> {
|
|
| 70 | + D result = spi.toDto(referentialLocale, e);
|
|
| 71 | + spi.loadDtoForValidation(context, e, result);
|
|
| 72 | + return result;
|
|
| 73 | + });
|
|
| 69 | 74 | if (dataContextConsumer != null) {
|
| 70 | 75 | dataContextConsumer.accept(dto.getId());
|
| 71 | 76 | validationDataContext.add(dto);
|
| ... | ... | @@ -26,6 +26,7 @@ import fr.ird.observe.dto.BusinessDto; |
| 26 | 26 | import fr.ird.observe.dto.referential.ReferentialLocale;
|
| 27 | 27 | import fr.ird.observe.entities.Entity;
|
| 28 | 28 | import fr.ird.observe.navigation.id.IdProject;
|
| 29 | +import fr.ird.observe.spi.service.ServiceContext;
|
|
| 29 | 30 | import fr.ird.observe.validation.ValidationContextSupport;
|
| 30 | 31 | import fr.ird.observe.validation.ValidatorsMap;
|
| 31 | 32 | import fr.ird.observe.validation.api.result.ValidationResultBuilder;
|
| ... | ... | @@ -59,6 +60,7 @@ public class ValidationMessageDetector { |
| 59 | 60 | |
| 60 | 61 | private static class ValidationEntityVisitor implements TopiaEntityVisitor {
|
| 61 | 62 | |
| 63 | + private final ServiceContext context;
|
|
| 62 | 64 | private final ValidationContextSupport validationDataContext;
|
| 63 | 65 | private final Map<Class<?>, EntityInterceptor<?, ?>> interceptors;
|
| 64 | 66 | private final Deque<Entity> path;
|
| ... | ... | @@ -68,10 +70,12 @@ public class ValidationMessageDetector { |
| 68 | 70 | |
| 69 | 71 | private final boolean canWalkInSubclasses;
|
| 70 | 72 | |
| 71 | - ValidationEntityVisitor(ValidationContextSupport validationDataContext,
|
|
| 73 | + ValidationEntityVisitor(ServiceContext context,
|
|
| 74 | + ValidationContextSupport validationDataContext,
|
|
| 72 | 75 | Map<Class<?>, EntityInterceptor<?, ?>> interceptors,
|
| 73 | 76 | ValidationResultBuilder resultBuilder,
|
| 74 | 77 | MessagesCollector messagesCollector, boolean canWalkInSubclasses) {
|
| 78 | + this.context = context;
|
|
| 75 | 79 | this.validationDataContext = validationDataContext;
|
| 76 | 80 | this.interceptors = interceptors;
|
| 77 | 81 | this.resultBuilder = resultBuilder;
|
| ... | ... | @@ -140,7 +144,7 @@ public class ValidationMessageDetector { |
| 140 | 144 | if (interceptor == null) {
|
| 141 | 145 | return;
|
| 142 | 146 | }
|
| 143 | - LinkedList<ValidationResultDtoMessage> messages = interceptor.intercept(messagesCollector, validationDataContext, e);
|
|
| 147 | + LinkedList<ValidationResultDtoMessage> messages = interceptor.intercept(context,messagesCollector, validationDataContext, e);
|
|
| 144 | 148 | resultBuilder.addMessages(getPath(), messages);
|
| 145 | 149 | }
|
| 146 | 150 | |
| ... | ... | @@ -178,7 +182,8 @@ public class ValidationMessageDetector { |
| 178 | 182 | }
|
| 179 | 183 | }
|
| 180 | 184 | |
| 181 | - public static ValidationMessageDetector forData(ValidatorsMap validators,
|
|
| 185 | + public static ValidationMessageDetector forData(ServiceContext context,
|
|
| 186 | + ValidatorsMap validators,
|
|
| 182 | 187 | ValidationContextSupport validationDataContext,
|
| 183 | 188 | IdProject selectModel,
|
| 184 | 189 | ReferentialLocale referentialLocale,
|
| ... | ... | @@ -187,33 +192,38 @@ public class ValidationMessageDetector { |
| 187 | 192 | validationDataContext,
|
| 188 | 193 | selectModel,
|
| 189 | 194 | referentialLocale);
|
| 190 | - return new ValidationMessageDetector(referentialLocale,
|
|
| 195 | + return new ValidationMessageDetector(context,
|
|
| 196 | + referentialLocale,
|
|
| 191 | 197 | validationDataContext,
|
| 192 | 198 | resultBuilder,
|
| 193 | 199 | interceptors,
|
| 194 | 200 | true);
|
| 195 | 201 | }
|
| 196 | 202 | |
| 197 | - public static ValidationMessageDetector forReferential(ValidatorsMap validators,
|
|
| 203 | + public static ValidationMessageDetector forReferential(ServiceContext context,
|
|
| 204 | + ValidatorsMap validators,
|
|
| 198 | 205 | ValidationContextSupport validationDataContext,
|
| 199 | 206 | ReferentialLocale referentialLocale,
|
| 200 | 207 | ValidationResultBuilder resultBuilder) {
|
| 201 | 208 | Map<Class<?>, EntityInterceptor<?, ?>> interceptors = EntityInterceptors.forReferential(validators,
|
| 202 | 209 | validationDataContext,
|
| 203 | 210 | referentialLocale);
|
| 204 | - return new ValidationMessageDetector(referentialLocale,
|
|
| 211 | + return new ValidationMessageDetector(context,
|
|
| 212 | + referentialLocale,
|
|
| 205 | 213 | validationDataContext,
|
| 206 | 214 | resultBuilder,
|
| 207 | 215 | interceptors,
|
| 208 | 216 | false);
|
| 209 | 217 | }
|
| 210 | 218 | |
| 211 | - private ValidationMessageDetector(ReferentialLocale referentialLocale,
|
|
| 219 | + private ValidationMessageDetector(ServiceContext context,
|
|
| 220 | + ReferentialLocale referentialLocale,
|
|
| 212 | 221 | ValidationContextSupport validationDataContext,
|
| 213 | 222 | ValidationResultBuilder resultBuilder,
|
| 214 | 223 | Map<Class<?>, EntityInterceptor<?, ?>> interceptors,
|
| 215 | 224 | boolean canWalkInSubclasses) {
|
| 216 | - this.entityVisitor = new ValidationEntityVisitor(validationDataContext,
|
|
| 225 | + this.entityVisitor = new ValidationEntityVisitor(context,
|
|
| 226 | + validationDataContext,
|
|
| 217 | 227 | interceptors,
|
| 218 | 228 | resultBuilder,
|
| 219 | 229 | new MessagesCollector(referentialLocale.getLocale()),
|