Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe
Commits:
-
8c0a556c
by Tony CHEMIT at 2018-06-16T09:08:19Z
9 changed files:
- dto/src/main/models/Observe.model
- persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineEntityDtoBinder.java
- services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java
- + services/src/main/java/fr/ird/observe/services/validation/validators/ActivitySeineObservedSystemValidator.java
- validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml
- validation/src/main/resources/i18n/validation_en_GB.properties
- validation/src/main/resources/i18n/validation_es_ES.properties
- validation/src/main/resources/i18n/validation_fr_FR.properties
- validation/src/main/resources/validators.xml
Changes:
| ... | ... | @@ -631,6 +631,7 @@ nextFpaZone {*:0..1} fr.ird.observe.dto.referential.FpaZoneReference |
| 631 | 631 |
dataQuality {*:0..1} fr.ird.observe.dto.referential.DataQualityReference
|
| 632 | 632 |
setSeine {*:0..1} fr.ird.observe.dto.data.seine.SetSeineReference
|
| 633 | 633 |
observedSystem {*:*} fr.ird.observe.dto.referential.seine.ObservedSystemReference
|
| 634 |
+nonTargetCatchSpecies {*:*} fr.ird.observe.dto.referential.SpeciesReference | unique
|
|
| 634 | 635 |
|
| 635 | 636 |
data.seine.ActivitySeineStub > data.Data
|
| 636 | 637 |
time + {*:1} Date
|
| ... | ... | @@ -10,22 +10,28 @@ package fr.ird.observe.binder.data.seine; |
| 10 | 10 |
* it under the terms of the GNU General Public License as
|
| 11 | 11 |
* published by the Free Software Foundation, either version 3 of the
|
| 12 | 12 |
* License, or (at your option) any later version.
|
| 13 |
- *
|
|
| 13 |
+ *
|
|
| 14 | 14 |
* This program is distributed in the hope that it will be useful,
|
| 15 | 15 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 16 | 16 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 17 | 17 |
* GNU General Public License for more details.
|
| 18 |
- *
|
|
| 18 |
+ *
|
|
| 19 | 19 |
* You should have received a copy of the GNU General Public
|
| 20 | 20 |
* License along with this program. If not, see
|
| 21 | 21 |
* <http://www.gnu.org/licenses/gpl-3.0.html>.
|
| 22 | 22 |
* #L%
|
| 23 | 23 |
*/
|
| 24 | 24 |
|
| 25 |
+import com.google.common.collect.ImmutableSet;
|
|
| 25 | 26 |
import fr.ird.observe.binder.data.DataEntityDtoBinderSupport;
|
| 27 |
+import fr.ird.observe.binder.referential.common.SpeciesEntityReferenceBinder;
|
|
| 26 | 28 |
import fr.ird.observe.dto.data.seine.ActivitySeineDto;
|
| 27 | 29 |
import fr.ird.observe.dto.referential.ReferentialLocale;
|
| 30 |
+import fr.ird.observe.dto.referential.SpeciesReference;
|
|
| 28 | 31 |
import fr.ird.observe.entities.seine.ActivitySeine;
|
| 32 |
+import fr.ird.observe.entities.seine.NonTargetCatch;
|
|
| 33 |
+ |
|
| 34 |
+import java.util.stream.Collectors;
|
|
| 29 | 35 |
|
| 30 | 36 |
/**
|
| 31 | 37 |
* Created on 24/11/15.
|
| ... | ... | @@ -40,9 +46,7 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act |
| 40 | 46 |
|
| 41 | 47 |
@Override
|
| 42 | 48 |
public void copyToEntity(ReferentialLocale referentialLocale, ActivitySeineDto dto, ActivitySeine entity) {
|
| 43 |
- |
|
| 44 | 49 |
copyDtoDataFieldsToEntity(dto, entity);
|
| 45 |
- |
|
| 46 | 50 |
entity.setTime(dto.getTime());
|
| 47 | 51 |
entity.setLatitude(dto.getLatitude());
|
| 48 | 52 |
entity.setLongitude(dto.getLongitude());
|
| ... | ... | @@ -60,14 +64,11 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act |
| 60 | 64 |
entity.setNextFpaZone(toEntity(dto.getNextFpaZone()));
|
| 61 | 65 |
entity.setObservedSystem(toEntitySet(dto.getObservedSystem()));
|
| 62 | 66 |
entity.setDataQuality(toEntity(dto.getDataQuality()));
|
| 63 |
- |
|
| 64 | 67 |
}
|
| 65 | 68 |
|
| 66 | 69 |
@Override
|
| 67 | 70 |
public void copyToDto(ReferentialLocale referentialLocale, ActivitySeine entity, ActivitySeineDto dto) {
|
| 68 |
- |
|
| 69 | 71 |
copyEntityDataFieldsToDto(entity, dto);
|
| 70 |
- |
|
| 71 | 72 |
dto.setTime(entity.getTime());
|
| 72 | 73 |
dto.setLatitude(entity.getLatitude());
|
| 73 | 74 |
dto.setLongitude(entity.getLongitude());
|
| ... | ... | @@ -88,6 +89,12 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act |
| 88 | 89 |
dto.setObservedSystem(toReferentialReferenceList(referentialLocale, entity.getObservedSystem()));
|
| 89 | 90 |
dto.setFloatingObjectEmpty(entity.isFloatingObjectEmpty());
|
| 90 | 91 |
dto.setDataQuality(toReferentialReference(referentialLocale, entity.getDataQuality()));
|
| 92 |
+ ImmutableSet.Builder<SpeciesReference> nonTargetSpecies = ImmutableSet.builder();
|
|
| 93 |
+ if (entity.getSetSeine() != null && entity.getSetSeine().isNonTargetCatchNotEmpty()) {
|
|
| 94 |
+ SpeciesEntityReferenceBinder binder = new SpeciesEntityReferenceBinder();
|
|
| 95 |
+ nonTargetSpecies.addAll(entity.getSetSeine().getNonTargetCatch().stream().map(NonTargetCatch::getSpecies).map(s -> binder.toReference(referentialLocale, s)).collect(Collectors.toSet()));
|
|
| 96 |
+ }
|
|
| 97 |
+ dto.setNonTargetCatchSpecies(nonTargetSpecies.build());
|
|
| 91 | 98 |
}
|
| 92 | 99 |
|
| 93 | 100 |
}
|
| ... | ... | @@ -313,7 +313,7 @@ public class ValidateServiceLocalTest extends ServiceLocalTestSupport { |
| 313 | 313 |
|
| 314 | 314 |
assertValidateResult(result, TripSeineDto.class, 4);
|
| 315 | 315 |
assertValidateResult(result, RouteDto.class, 38); // 55
|
| 316 |
- assertValidateResult(result, ActivitySeineDto.class, 68); // 1516
|
|
| 316 |
+ assertValidateResult(result, ActivitySeineDto.class, 69); // 1516
|
|
| 317 | 317 |
assertValidateResult(result, TransmittingBuoyDto.class, 1);
|
| 318 | 318 |
assertValidateResult(result, SetSeineDto.class, 3);
|
| 319 | 319 |
assertValidateResult(result, NonTargetCatchDto.class, 3);
|
| 1 |
+package fr.ird.observe.services.validation.validators;
|
|
| 2 |
+ |
|
| 3 |
+/*-
|
|
| 4 |
+ * #%L
|
|
| 5 |
+ * ObServe :: Services API
|
|
| 6 |
+ * %%
|
|
| 7 |
+ * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io
|
|
| 8 |
+ * %%
|
|
| 9 |
+ * This program is free software: you can redistribute it and/or modify
|
|
| 10 |
+ * it under the terms of the GNU General Public License as
|
|
| 11 |
+ * published by the Free Software Foundation, either version 3 of the
|
|
| 12 |
+ * License, or (at your option) any later version.
|
|
| 13 |
+ *
|
|
| 14 |
+ * This program is distributed in the hope that it will be useful,
|
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 |
+ * GNU General Public License for more details.
|
|
| 18 |
+ *
|
|
| 19 |
+ * You should have received a copy of the GNU General Public
|
|
| 20 |
+ * License along with this program. If not, see
|
|
| 21 |
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 |
+ * #L%
|
|
| 23 |
+ */
|
|
| 24 |
+ |
|
| 25 |
+import com.google.common.collect.ImmutableMap;
|
|
| 26 |
+import com.google.common.collect.Maps;
|
|
| 27 |
+import com.opensymphony.xwork2.validator.ValidationException;
|
|
| 28 |
+import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
|
|
| 29 |
+import fr.ird.observe.dto.data.seine.ActivitySeineDto;
|
|
| 30 |
+import fr.ird.observe.dto.decoration.DecoratorService;
|
|
| 31 |
+import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator;
|
|
| 32 |
+import fr.ird.observe.dto.referential.SpeciesReference;
|
|
| 33 |
+import fr.ird.observe.dto.referential.seine.ObservedSystemReference;
|
|
| 34 |
+import fr.ird.observe.services.validation.SeineBycatchObservedSystemConfig;
|
|
| 35 |
+ |
|
| 36 |
+import java.util.Collection;
|
|
| 37 |
+import java.util.LinkedHashSet;
|
|
| 38 |
+import java.util.List;
|
|
| 39 |
+import java.util.Set;
|
|
| 40 |
+ |
|
| 41 |
+/**
|
|
| 42 |
+ * Created by tchemit on 15/06/2018.
|
|
| 43 |
+ *
|
|
| 44 |
+ * @author Tony Chemit - dev@tchemit.fr
|
|
| 45 |
+ */
|
|
| 46 |
+public class ActivitySeineObservedSystemValidator extends FieldValidatorSupport {
|
|
| 47 |
+ |
|
| 48 |
+ @Override
|
|
| 49 |
+ public void validate(Object object) throws ValidationException {
|
|
| 50 |
+ |
|
| 51 |
+ if (object == null) {
|
|
| 52 |
+ // pas d'objet, donc rien a faire
|
|
| 53 |
+ return;
|
|
| 54 |
+ }
|
|
| 55 |
+ |
|
| 56 |
+ ActivitySeineDto activitySeineDto = (ActivitySeineDto) object;
|
|
| 57 |
+ if (!activitySeineDto.getNonTargetCatchSpecies().isEmpty()) {
|
|
| 58 |
+ List<ObservedSystemReference> observedSystemReferences = (List<ObservedSystemReference>) getFieldValue("observedSystems", object);
|
|
| 59 |
+ ImmutableMap<String, ObservedSystemReference> map = Maps.uniqueIndex(observedSystemReferences, ObservedSystemReference::getId);
|
|
| 60 |
+ Collection<ObservedSystemReference> observedSystems = activitySeineDto.getObservedSystem();
|
|
| 61 |
+ SeineBycatchObservedSystemConfig seineBycatchObservedSystemConfig = (SeineBycatchObservedSystemConfig) getFieldValue("seineBycatchObservedSystemConfig", object);
|
|
| 62 |
+ DecoratorService decoratorService = (DecoratorService) stack.findValue("decoratorService");
|
|
| 63 |
+ ReferentialReferenceDecorator<ObservedSystemReference> decorator = decoratorService.getReferentialReferenceDecorator(ObservedSystemReference.class);
|
|
| 64 |
+ Set<String> labels = new LinkedHashSet<>();
|
|
| 65 |
+ for (SpeciesReference speciesReference : activitySeineDto.getNonTargetCatchSpecies()) {
|
|
| 66 |
+ |
|
| 67 |
+ Collection<String> requiredObservedSystemBySpeciesId = seineBycatchObservedSystemConfig.getRequiredObservedSystemBySpeciesId(speciesReference.getTopiaId());
|
|
| 68 |
+ if (!requiredObservedSystemBySpeciesId.isEmpty()) {
|
|
| 69 |
+ |
|
| 70 |
+ log.debug("Required observed system: " + requiredObservedSystemBySpeciesId);
|
|
| 71 |
+ // must check that at least one of those observed system are in
|
|
| 72 |
+ boolean found = false;
|
|
| 73 |
+ for (ObservedSystemReference observedSystemReference : activitySeineDto.getObservedSystem()) {
|
|
| 74 |
+ if (requiredObservedSystemBySpeciesId.contains(observedSystemReference.getTopiaId())) {
|
|
| 75 |
+ found = true;
|
|
| 76 |
+ break;
|
|
| 77 |
+ }
|
|
| 78 |
+ }
|
|
| 79 |
+ if (!found) {
|
|
| 80 |
+ log.debug("references: " + observedSystems);
|
|
| 81 |
+ for (String observedSystemId : requiredObservedSystemBySpeciesId) {
|
|
| 82 |
+ ObservedSystemReference ref = map.get(observedSystemId);
|
|
| 83 |
+ log.debug("Required observed system id: " + observedSystemId);
|
|
| 84 |
+ log.debug("Required observed system: " + ref);
|
|
| 85 |
+ labels.add(decorator.toString(ref));
|
|
| 86 |
+ }
|
|
| 87 |
+ }
|
|
| 88 |
+ }
|
|
| 89 |
+ }
|
|
| 90 |
+ if (!labels.isEmpty()) {
|
|
| 91 |
+ // there is some missing system observed
|
|
| 92 |
+ stack.set("observedSystemLabels", labels);
|
|
| 93 |
+ addFieldError(getFieldName(), object);
|
|
| 94 |
+ }
|
|
| 95 |
+ }
|
|
| 96 |
+ }
|
|
| 97 |
+ |
|
| 98 |
+ @Override
|
|
| 99 |
+ public String getValidatorType() {
|
|
| 100 |
+ return "activitySeine_observedSystem";
|
|
| 101 |
+ }
|
|
| 102 |
+}
|
| ... | ... | @@ -318,13 +318,17 @@ |
| 318 | 318 |
</field-validator>
|
| 319 | 319 |
|
| 320 | 320 |
<!-- systeme observe selectionnee desactive -->
|
| 321 |
- <field-validator type="collectionFieldExpression">
|
|
| 321 |
+ <field-validator type="collectionFieldExpression" short-circuit="true">
|
|
| 322 | 322 |
<param name="collectionFieldName">observedSystem</param>
|
| 323 | 323 |
<param name="mode">ALL</param>
|
| 324 | 324 |
<param name="useSensitiveContext">true</param>
|
| 325 | 325 |
<param name="expression"><![CDATA[ current.enabled ]]></param>
|
| 326 | 326 |
<message>observe.validation.activity.desactivated.observedSystem</message>
|
| 327 | 327 |
</field-validator>
|
| 328 |
+ <!--observed systems required by nonTargetCatches-->
|
|
| 329 |
+ <field-validator type="activitySeine_observedSystem" short-circuit="true">
|
|
| 330 |
+ <message>observe.validation.activity.required.observedSystem.for.nonTargetCatch##${observedSystemLabels}</message>
|
|
| 331 |
+ </field-validator>
|
|
| 328 | 332 |
|
| 329 | 333 |
</field>
|
| 330 | 334 |
|
| ... | ... | @@ -354,6 +354,7 @@ observe.validation.activity.required.comment.for.vesselActivity=A comment is req |
| 354 | 354 |
observe.validation.activity.required.date=Observation date must be filled.
|
| 355 | 355 |
observe.validation.activity.required.latitude=Latitude must be filled.
|
| 356 | 356 |
observe.validation.activity.required.longitude=Longitude must be filled.
|
| 357 |
+observe.validation.activity.required.observedSystem.for.nonTargetCatch=Some of the following observed systems are required for the non target catches \: %s
|
|
| 357 | 358 |
observe.validation.activity.required.quadrant=quadrant must be filled.
|
| 358 | 359 |
observe.validation.activity.required.time=Time must be filled.
|
| 359 | 360 |
observe.validation.activity.required.vesselActivity=must be filled.
|
| ... | ... | @@ -356,6 +356,7 @@ observe.validation.activity.required.comment.for.vesselActivity=Se necesita un c |
| 356 | 356 |
observe.validation.activity.required.date=La fecha de observación de la actividad es mandatoria.
|
| 357 | 357 |
observe.validation.activity.required.latitude=La latitud debe ser introducida
|
| 358 | 358 |
observe.validation.activity.required.longitude=La longitud debe ser introducida
|
| 359 |
+observe.validation.activity.required.observedSystem.for.nonTargetCatch=Some of the following observed systems are required for the non target catches \: %s \#TODO
|
|
| 359 | 360 |
observe.validation.activity.required.quadrant=Se debe seleccionar el cuadrante.
|
| 360 | 361 |
observe.validation.activity.required.time=La hora de observación para la actividad es mandatoria.
|
| 361 | 362 |
observe.validation.activity.required.vesselActivity=Se debe seleccionar la actividad del barco.
|
| ... | ... | @@ -354,6 +354,7 @@ observe.validation.activity.required.comment.for.vesselActivity=Un commentaire e |
| 354 | 354 |
observe.validation.activity.required.date=La date d'observation de l'activité est obligatoire.
|
| 355 | 355 |
observe.validation.activity.required.latitude=La latitude doit être renseignée.
|
| 356 | 356 |
observe.validation.activity.required.longitude=La longitude doit être renseignée.
|
| 357 |
+observe.validation.activity.required.observedSystem.for.nonTargetCatch=Certains systèmes observés parmis les suivants sont obligatoires en regard des captures de faunes accessoires \: %s
|
|
| 357 | 358 |
observe.validation.activity.required.quadrant=Le quadrant doit être sélectionné.
|
| 358 | 359 |
observe.validation.activity.required.time=L'heure d'observation de l'activité est obligatoire.
|
| 359 | 360 |
observe.validation.activity.required.vesselActivity=L'activité du navire est obligatoire.
|
| ... | ... | @@ -67,5 +67,6 @@ |
| 67 | 67 |
<validator name="coordinateLongitudeDto" class="fr.ird.observe.services.validation.validators.CoordinateLongitudeDtoFieldValidator"/>
|
| 68 | 68 |
<validator name="referentialCode" class="fr.ird.observe.services.validation.validators.ReferentialCodeValidator"/>
|
| 69 | 69 |
<validator name="nonTargetCatchObservedSystem" class="fr.ird.observe.services.validation.validators.NonTargetCatchObservedSystemValidator"/>
|
| 70 |
+ <validator name="activitySeine_observedSystem" class="fr.ird.observe.services.validation.validators.ActivitySeineObservedSystemValidator"/>
|
|
| 70 | 71 |
|
| 71 | 72 |
</validators>
|