Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe

Commits:

9 changed files:

Changes:

  • dto/src/main/models/Observe.model
    ... ... @@ -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
    

  • persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineEntityDtoBinder.java
    ... ... @@ -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
     }

  • services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java
    ... ... @@ -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);
    

  • services/src/main/java/fr/ird/observe/services/validation/validators/ActivitySeineObservedSystemValidator.java
    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
    +}

  • validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml
    ... ... @@ -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
     
    

  • validation/src/main/resources/i18n/validation_en_GB.properties
    ... ... @@ -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.
    

  • validation/src/main/resources/i18n/validation_es_ES.properties
    ... ... @@ -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.
    

  • validation/src/main/resources/i18n/validation_fr_FR.properties
    ... ... @@ -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.
    

  • validation/src/main/resources/validators.xml
    ... ... @@ -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>