Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 8c0a556c by Tony CHEMIT at 2018-06-16T09:08:19Z Validation système observé / RHN - Closes #973 - - - - - 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: ===================================== dto/src/main/models/Observe.model ===================================== --- a/dto/src/main/models/Observe.model +++ b/dto/src/main/models/Observe.model @@ -631,6 +631,7 @@ nextFpaZone {*:0..1} fr.ird.observe.dto.referential.FpaZoneReference dataQuality {*:0..1} fr.ird.observe.dto.referential.DataQualityReference setSeine {*:0..1} fr.ird.observe.dto.data.seine.SetSeineReference observedSystem {*:*} fr.ird.observe.dto.referential.seine.ObservedSystemReference +nonTargetCatchSpecies {*:*} fr.ird.observe.dto.referential.SpeciesReference | unique data.seine.ActivitySeineStub > data.Data time + {*:1} Date ===================================== persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineEntityDtoBinder.java ===================================== --- a/persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineEntityDtoBinder.java +++ b/persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineEntityDtoBinder.java @@ -10,22 +10,28 @@ package fr.ird.observe.binder.data.seine; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ +import com.google.common.collect.ImmutableSet; import fr.ird.observe.binder.data.DataEntityDtoBinderSupport; +import fr.ird.observe.binder.referential.common.SpeciesEntityReferenceBinder; import fr.ird.observe.dto.data.seine.ActivitySeineDto; import fr.ird.observe.dto.referential.ReferentialLocale; +import fr.ird.observe.dto.referential.SpeciesReference; import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.NonTargetCatch; + +import java.util.stream.Collectors; /** * Created on 24/11/15. @@ -40,9 +46,7 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act @Override public void copyToEntity(ReferentialLocale referentialLocale, ActivitySeineDto dto, ActivitySeine entity) { - copyDtoDataFieldsToEntity(dto, entity); - entity.setTime(dto.getTime()); entity.setLatitude(dto.getLatitude()); entity.setLongitude(dto.getLongitude()); @@ -60,14 +64,11 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act entity.setNextFpaZone(toEntity(dto.getNextFpaZone())); entity.setObservedSystem(toEntitySet(dto.getObservedSystem())); entity.setDataQuality(toEntity(dto.getDataQuality())); - } @Override public void copyToDto(ReferentialLocale referentialLocale, ActivitySeine entity, ActivitySeineDto dto) { - copyEntityDataFieldsToDto(entity, dto); - dto.setTime(entity.getTime()); dto.setLatitude(entity.getLatitude()); dto.setLongitude(entity.getLongitude()); @@ -88,6 +89,12 @@ public class ActivitySeineEntityDtoBinder extends DataEntityDtoBinderSupport<Act dto.setObservedSystem(toReferentialReferenceList(referentialLocale, entity.getObservedSystem())); dto.setFloatingObjectEmpty(entity.isFloatingObjectEmpty()); dto.setDataQuality(toReferentialReference(referentialLocale, entity.getDataQuality())); + ImmutableSet.Builder<SpeciesReference> nonTargetSpecies = ImmutableSet.builder(); + if (entity.getSetSeine() != null && entity.getSetSeine().isNonTargetCatchNotEmpty()) { + SpeciesEntityReferenceBinder binder = new SpeciesEntityReferenceBinder(); + nonTargetSpecies.addAll(entity.getSetSeine().getNonTargetCatch().stream().map(NonTargetCatch::getSpecies).map(s -> binder.toReference(referentialLocale, s)).collect(Collectors.toSet())); + } + dto.setNonTargetCatchSpecies(nonTargetSpecies.build()); } } ===================================== services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java ===================================== --- a/services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java +++ b/services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java @@ -313,7 +313,7 @@ public class ValidateServiceLocalTest extends ServiceLocalTestSupport { assertValidateResult(result, TripSeineDto.class, 4); assertValidateResult(result, RouteDto.class, 38); // 55 - assertValidateResult(result, ActivitySeineDto.class, 68); // 1516 + assertValidateResult(result, ActivitySeineDto.class, 69); // 1516 assertValidateResult(result, TransmittingBuoyDto.class, 1); assertValidateResult(result, SetSeineDto.class, 3); assertValidateResult(result, NonTargetCatchDto.class, 3); ===================================== services/src/main/java/fr/ird/observe/services/validation/validators/ActivitySeineObservedSystemValidator.java ===================================== --- /dev/null +++ b/services/src/main/java/fr/ird/observe/services/validation/validators/ActivitySeineObservedSystemValidator.java @@ -0,0 +1,102 @@ +package fr.ird.observe.services.validation.validators; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.opensymphony.xwork2.validator.ValidationException; +import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; +import fr.ird.observe.dto.data.seine.ActivitySeineDto; +import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; +import fr.ird.observe.dto.referential.SpeciesReference; +import fr.ird.observe.dto.referential.seine.ObservedSystemReference; +import fr.ird.observe.services.validation.SeineBycatchObservedSystemConfig; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Created by tchemit on 15/06/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class ActivitySeineObservedSystemValidator extends FieldValidatorSupport { + + @Override + public void validate(Object object) throws ValidationException { + + if (object == null) { + // pas d'objet, donc rien a faire + return; + } + + ActivitySeineDto activitySeineDto = (ActivitySeineDto) object; + if (!activitySeineDto.getNonTargetCatchSpecies().isEmpty()) { + List<ObservedSystemReference> observedSystemReferences = (List<ObservedSystemReference>) getFieldValue("observedSystems", object); + ImmutableMap<String, ObservedSystemReference> map = Maps.uniqueIndex(observedSystemReferences, ObservedSystemReference::getId); + Collection<ObservedSystemReference> observedSystems = activitySeineDto.getObservedSystem(); + SeineBycatchObservedSystemConfig seineBycatchObservedSystemConfig = (SeineBycatchObservedSystemConfig) getFieldValue("seineBycatchObservedSystemConfig", object); + DecoratorService decoratorService = (DecoratorService) stack.findValue("decoratorService"); + ReferentialReferenceDecorator<ObservedSystemReference> decorator = decoratorService.getReferentialReferenceDecorator(ObservedSystemReference.class); + Set<String> labels = new LinkedHashSet<>(); + for (SpeciesReference speciesReference : activitySeineDto.getNonTargetCatchSpecies()) { + + Collection<String> requiredObservedSystemBySpeciesId = seineBycatchObservedSystemConfig.getRequiredObservedSystemBySpeciesId(speciesReference.getTopiaId()); + if (!requiredObservedSystemBySpeciesId.isEmpty()) { + + log.debug("Required observed system: " + requiredObservedSystemBySpeciesId); + // must check that at least one of those observed system are in + boolean found = false; + for (ObservedSystemReference observedSystemReference : activitySeineDto.getObservedSystem()) { + if (requiredObservedSystemBySpeciesId.contains(observedSystemReference.getTopiaId())) { + found = true; + break; + } + } + if (!found) { + log.debug("references: " + observedSystems); + for (String observedSystemId : requiredObservedSystemBySpeciesId) { + ObservedSystemReference ref = map.get(observedSystemId); + log.debug("Required observed system id: " + observedSystemId); + log.debug("Required observed system: " + ref); + labels.add(decorator.toString(ref)); + } + } + } + } + if (!labels.isEmpty()) { + // there is some missing system observed + stack.set("observedSystemLabels", labels); + addFieldError(getFieldName(), object); + } + } + } + + @Override + public String getValidatorType() { + return "activitySeine_observedSystem"; + } +} ===================================== validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml ===================================== --- a/validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml +++ b/validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml @@ -318,13 +318,17 @@ </field-validator> <!-- systeme observe selectionnee desactive --> - <field-validator type="collectionFieldExpression"> + <field-validator type="collectionFieldExpression" short-circuit="true"> <param name="collectionFieldName">observedSystem</param> <param name="mode">ALL</param> <param name="useSensitiveContext">true</param> <param name="expression"><![CDATA[ current.enabled ]]></param> <message>observe.validation.activity.desactivated.observedSystem</message> </field-validator> + <!--observed systems required by nonTargetCatches--> + <field-validator type="activitySeine_observedSystem" short-circuit="true"> + <message>observe.validation.activity.required.observedSystem.for.nonTargetCatch##${observedSystemLabels}</message> + </field-validator> </field> ===================================== validation/src/main/resources/i18n/validation_en_GB.properties ===================================== --- a/validation/src/main/resources/i18n/validation_en_GB.properties +++ b/validation/src/main/resources/i18n/validation_en_GB.properties @@ -354,6 +354,7 @@ observe.validation.activity.required.comment.for.vesselActivity=A comment is req observe.validation.activity.required.date=Observation date must be filled. observe.validation.activity.required.latitude=Latitude must be filled. observe.validation.activity.required.longitude=Longitude must be filled. +observe.validation.activity.required.observedSystem.for.nonTargetCatch=Some of the following observed systems are required for the non target catches \: %s observe.validation.activity.required.quadrant=quadrant must be filled. observe.validation.activity.required.time=Time must be filled. observe.validation.activity.required.vesselActivity=must be filled. ===================================== validation/src/main/resources/i18n/validation_es_ES.properties ===================================== --- a/validation/src/main/resources/i18n/validation_es_ES.properties +++ b/validation/src/main/resources/i18n/validation_es_ES.properties @@ -356,6 +356,7 @@ observe.validation.activity.required.comment.for.vesselActivity=Se necesita un c observe.validation.activity.required.date=La fecha de observación de la actividad es mandatoria. observe.validation.activity.required.latitude=La latitud debe ser introducida observe.validation.activity.required.longitude=La longitud debe ser introducida +observe.validation.activity.required.observedSystem.for.nonTargetCatch=Some of the following observed systems are required for the non target catches \: %s \#TODO observe.validation.activity.required.quadrant=Se debe seleccionar el cuadrante. observe.validation.activity.required.time=La hora de observación para la actividad es mandatoria. observe.validation.activity.required.vesselActivity=Se debe seleccionar la actividad del barco. ===================================== validation/src/main/resources/i18n/validation_fr_FR.properties ===================================== --- a/validation/src/main/resources/i18n/validation_fr_FR.properties +++ b/validation/src/main/resources/i18n/validation_fr_FR.properties @@ -354,6 +354,7 @@ observe.validation.activity.required.comment.for.vesselActivity=Un commentaire e observe.validation.activity.required.date=La date d'observation de l'activité est obligatoire. observe.validation.activity.required.latitude=La latitude doit être renseignée. observe.validation.activity.required.longitude=La longitude doit être renseignée. +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 observe.validation.activity.required.quadrant=Le quadrant doit être sélectionné. observe.validation.activity.required.time=L'heure d'observation de l'activité est obligatoire. observe.validation.activity.required.vesselActivity=L'activité du navire est obligatoire. ===================================== validation/src/main/resources/validators.xml ===================================== --- a/validation/src/main/resources/validators.xml +++ b/validation/src/main/resources/validators.xml @@ -67,5 +67,6 @@ <validator name="coordinateLongitudeDto" class="fr.ird.observe.services.validation.validators.CoordinateLongitudeDtoFieldValidator"/> <validator name="referentialCode" class="fr.ird.observe.services.validation.validators.ReferentialCodeValidator"/> <validator name="nonTargetCatchObservedSystem" class="fr.ird.observe.services.validation.validators.NonTargetCatchObservedSystemValidator"/> + <validator name="activitySeine_observedSystem" class="fr.ird.observe.services.validation.validators.ActivitySeineObservedSystemValidator"/> </validators> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/8c0a556ca195d9c0a3057bb9b656... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/8c0a556ca195d9c0a3057bb9b656... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT