Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 4575713f by Tony CHEMIT at 2018-07-10T10:40:21Z Revoir la clé d'unicité sur le référentiel taille-taille - Closes #992 - - - - - 15 changed files: - + dto/src/main/java/fr/ird/observe/dto/referential/LengthLengthParameterReference.java - + dto/src/main/java/fr/ird/observe/dto/referential/LengthWeightParameterReference.java - dto/src/main/java/fr/ird/observe/dto/referential/WithLengthFormula.java - + dto/src/main/java/fr/ird/observe/dto/referential/WithStartEndDate.java - persistence/src/main/java/fr/ird/observe/entities/referentiel/AbstractFormulaSupportTopiaDao.java - services/src/main/java/fr/ird/observe/services/validation/ValidationContext.java - services/src/main/java/fr/ird/observe/services/validation/validators/ObserveReferentialCollectionUniqueKeyDtoValidator.java → services/src/main/java/fr/ird/observe/services/validation/validators/ObserveLengthFormulaCollectionUniqueKeyDtoValidator.java - validation/src/main/resources/fr/ird/observe/dto/referential/LengthLengthParameterDto-create-error-validation.xml - validation/src/main/resources/fr/ird/observe/dto/referential/LengthLengthParameterDto-update-error-validation.xml - validation/src/main/resources/fr/ird/observe/dto/referential/LengthWeightParameterDto-create-error-validation.xml - validation/src/main/resources/fr/ird/observe/dto/referential/LengthWeightParameterDto-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/java/fr/ird/observe/dto/referential/LengthLengthParameterReference.java ===================================== @@ -0,0 +1,35 @@ +package fr.ird.observe.dto.referential; + +/*- + * #%L + * ObServe :: Dto + * %% + * 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 fr.ird.observe.dto.reference.ReferentialDtoReferenceAware; + +import java.util.Date; + +public class LengthLengthParameterReference extends GeneratedLengthLengthParameterReference implements WithStartEndDate { + + public LengthLengthParameterReference(ReferentialDtoReferenceAware dto, String oceanLabel, String speciesLabel, String sexLabel, Date startDate, Date endDate, String inputSizeMeasureTypeCode, String inputSizeMeasureTypeLabel, String outputSizeMeasureTypeCode, String outputSizeMeasureTypeLabel, String inputOutputFormula, String outputInputFormula) { + super(dto, oceanLabel, speciesLabel, sexLabel, startDate, endDate, inputSizeMeasureTypeCode, inputSizeMeasureTypeLabel, outputSizeMeasureTypeCode, outputSizeMeasureTypeLabel, inputOutputFormula, outputInputFormula); + } + +} ===================================== dto/src/main/java/fr/ird/observe/dto/referential/LengthWeightParameterReference.java ===================================== @@ -0,0 +1,35 @@ +package fr.ird.observe.dto.referential; + +/*- + * #%L + * ObServe :: Dto + * %% + * 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 fr.ird.observe.dto.reference.ReferentialDtoReferenceAware; + +import java.util.Date; + +public class LengthWeightParameterReference extends GeneratedLengthWeightParameterReference implements WithStartEndDate { + + public LengthWeightParameterReference(ReferentialDtoReferenceAware dto, String oceanLabel, String speciesLabel, String sexLabel, Date startDate, Date endDate, String lengthWeightFormula, String weightLengthFormula, String sizeMeasureTypeCode) { + super(dto, oceanLabel, speciesLabel, sexLabel, startDate, endDate, lengthWeightFormula, weightLengthFormula, sizeMeasureTypeCode); +} + +} ===================================== dto/src/main/java/fr/ird/observe/dto/referential/WithLengthFormula.java ===================================== @@ -22,14 +22,10 @@ package fr.ird.observe.dto.referential; * #L% */ -import com.google.common.collect.Ordering; -import org.apache.commons.lang3.BooleanUtils; - import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** * Created on 22/12/16. @@ -37,7 +33,7 @@ import java.util.stream.Collectors; * @author Tony Chemit - dev@tchemit.fr * @since 6.0 */ -public interface WithLengthFormula extends WithFormula { +public interface WithLengthFormula extends WithFormula, WithStartEndDate { String PROPERTY_OCEAN = "ocean"; String PROPERTY_SPECIES = "species"; @@ -47,32 +43,26 @@ public interface WithLengthFormula extends WithFormula { String PROPERTY_COEFFICIENTS = "coefficients"; String PROPERTY_SOURCE = "source"; - Comparator<Date> START_DATE_COMPARATOR = Ordering.natural().nullsFirst(); - Comparator<Date> END_DATE_COMPARATOR = Ordering.natural().nullsLast(); - Comparator<WithLengthFormula> FORMULA_SUPPORT_START_DATE_COMPARATOR = Comparator.comparing(WithLengthFormula::getStartDate, WithLengthFormula.START_DATE_COMPARATOR); - Comparator<WithLengthFormula> FORMULA_SUPPORT_END_DATE_COMPARATOR = Comparator.comparing(WithLengthFormula::getEndDate, WithLengthFormula.END_DATE_COMPARATOR); + Comparator<WithLengthFormula> FORMULA_SUPPORT_START_DATE_COMPARATOR = Comparator.comparing(WithStartEndDate::getStartDate, WithStartEndDate.START_DATE_COMPARATOR); + Comparator<WithLengthFormula> FORMULA_SUPPORT_END_DATE_COMPARATOR = Comparator.comparing(WithStartEndDate::getEndDate, WithStartEndDate.END_DATE_COMPARATOR); Comparator<WithLengthFormula> FORMULA_SUPPORT_COMPARATOR = FORMULA_SUPPORT_START_DATE_COMPARATOR.thenComparing(FORMULA_SUPPORT_END_DATE_COMPARATOR); static <D extends WithLengthFormula> void sort(List<D> list) { list.sort(FORMULA_SUPPORT_COMPARATOR); } - static <D extends WithLengthFormula> List<D> filter(List<D> list, Date date) { - return list.stream() - .filter(f -> WithLengthFormula.START_DATE_COMPARATOR.compare(f.getStartDate(), date) <= 0 && WithLengthFormula.END_DATE_COMPARATOR.compare(date, f.getEndDate()) <= 0) - .collect(Collectors.toList()); - } +// static <D extends WithStartEndDate> List<D> filter(List<D> list, Date date) { +// return list.stream() +// .filter(f -> WithStartEndDate.START_DATE_COMPARATOR.compare(f.getStartDate(), date) <= 0 && WithStartEndDate.END_DATE_COMPARATOR.compare(date, f.getEndDate()) <= 0) +// .collect(Collectors.toList()); +// } String getFormulaOneVariableName(); String getFormulaTwoVariableName(); - Date getStartDate(); - void setStartDate(Date startDate); - Date getEndDate(); - void setEndDate(Date endDate); void setCoefficients(String coefficients); @@ -96,10 +86,10 @@ public interface WithLengthFormula extends WithFormula { boolean isFormulaOneValid(); - boolean isFormulaTwoValid(); - void setFormulaOneValid(boolean formulaOneValid); + boolean isFormulaTwoValid(); + void setFormulaTwoValid(boolean formulaTwoValid); default void revalidateFormulaTwo() { ===================================== dto/src/main/java/fr/ird/observe/dto/referential/WithStartEndDate.java ===================================== @@ -0,0 +1,26 @@ +package fr.ird.observe.dto.referential; + +import com.google.common.collect.Ordering; +import fr.ird.observe.dto.reference.DtoReferenceAware; + +import java.util.Comparator; +import java.util.Date; + +/** + * Created by tchemit on 10/07/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public interface WithStartEndDate extends DtoReferenceAware { + + Comparator<Date> START_DATE_COMPARATOR = Ordering.natural().nullsFirst(); + Comparator<Date> END_DATE_COMPARATOR = Ordering.natural().nullsLast(); + + Comparator<WithStartEndDate> WITH_START_DATE_COMPARATOR = Comparator.comparing(WithStartEndDate::getStartDate, START_DATE_COMPARATOR); + Comparator<WithStartEndDate> WITH_END_DATE_COMPARATOR = Comparator.comparing(WithStartEndDate::getEndDate, END_DATE_COMPARATOR); + + Date getStartDate(); + + Date getEndDate(); + +} ===================================== persistence/src/main/java/fr/ird/observe/entities/referentiel/AbstractFormulaSupportTopiaDao.java ===================================== @@ -22,7 +22,7 @@ package fr.ird.observe.entities.referentiel; * #L% */ -import fr.ird.observe.dto.referential.LengthFormulaSupportDto; +import fr.ird.observe.dto.referential.WithStartEndDate; import java.util.Comparator; import java.util.Date; @@ -32,13 +32,13 @@ import java.util.stream.Stream; public class AbstractFormulaSupportTopiaDao<E extends FormulaSupport> extends GeneratedFormulaSupportTopiaDao<E> { - public static final Comparator<FormulaSupport> FORMULA_SUPPORT_START_DATE_COMPARATOR = Comparator.comparing(FormulaSupport::getStartDate, LengthFormulaSupportDto.START_DATE_COMPARATOR); - public static final Comparator<FormulaSupport> FORMULA_SUPPORT_END_DATE_COMPARATOR = Comparator.comparing(FormulaSupport::getEndDate, LengthFormulaSupportDto.END_DATE_COMPARATOR); + public static final Comparator<FormulaSupport> FORMULA_SUPPORT_START_DATE_COMPARATOR = Comparator.comparing(FormulaSupport::getStartDate, WithStartEndDate.START_DATE_COMPARATOR); + public static final Comparator<FormulaSupport> FORMULA_SUPPORT_END_DATE_COMPARATOR = Comparator.comparing(FormulaSupport::getEndDate, WithStartEndDate.END_DATE_COMPARATOR); public static final Comparator<FormulaSupport> FORMULA_SUPPORT_COMPARATOR = FORMULA_SUPPORT_START_DATE_COMPARATOR.thenComparing(FORMULA_SUPPORT_END_DATE_COMPARATOR); public static <E extends FormulaSupport> List<E> sortAndFilter(Stream<E> list, Date date) { return list.sorted(FORMULA_SUPPORT_COMPARATOR) - .filter(f -> LengthFormulaSupportDto.START_DATE_COMPARATOR.compare(f.getStartDate(), date) <= 0 && LengthFormulaSupportDto.END_DATE_COMPARATOR.compare(date, f.getEndDate()) <= 0) + .filter(f -> WithStartEndDate.START_DATE_COMPARATOR.compare(f.getStartDate(), date) <= 0 && WithStartEndDate.END_DATE_COMPARATOR.compare(date, f.getEndDate()) <= 0) .collect(Collectors.toList()); } ===================================== services/src/main/java/fr/ird/observe/services/validation/ValidationContext.java ===================================== @@ -193,6 +193,7 @@ public abstract class ValidationContext extends AbstractSerializableBean { return validationSpeedMaxValue; } + @SuppressWarnings("unused") public Function<ReferentialDto, ReferentialDtoReference> getReferentialReferenceFunction() { return this::toReferentialReference; } ===================================== services/src/main/java/fr/ird/observe/services/validation/validators/ObserveReferentialCollectionUniqueKeyDtoValidator.java → services/src/main/java/fr/ird/observe/services/validation/validators/ObserveLengthFormulaCollectionUniqueKeyDtoValidator.java ===================================== @@ -24,18 +24,18 @@ package fr.ird.observe.services.validation.validators; import com.opensymphony.xwork2.validator.ValidationException; import fr.ird.observe.dto.IdDto; -import fr.ird.observe.dto.reference.ReferentialDtoReference; +import fr.ird.observe.dto.referential.WithStartEndDate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.validator.xwork2.field.NuitonFieldValidatorSupport; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Date; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; -import java.util.Set; -import java.util.TreeSet; import java.util.function.Function; /** @@ -44,9 +44,10 @@ import java.util.function.Function; * @author Tony Chemit - dev@tchemit.fr * @since 4.0.1 */ -public class ObserveReferentialCollectionUniqueKeyDtoValidator extends NuitonFieldValidatorSupport { +public class ObserveLengthFormulaCollectionUniqueKeyDtoValidator extends NuitonFieldValidatorSupport { + + private static final Log log = LogFactory.getLog(ObserveLengthFormulaCollectionUniqueKeyDtoValidator.class); - private static final Log log = LogFactory.getLog(ObserveReferentialCollectionUniqueKeyDtoValidator.class); /** * pour indiquer la propriété qui contient la liste à valider. * <p> @@ -65,7 +66,6 @@ public class ObserveReferentialCollectionUniqueKeyDtoValidator extends NuitonFie * clef unique. */ protected String[] keys; - private Comparator<?> comparator; public String getCollectionFieldName() { return collectionFieldName; @@ -103,70 +103,72 @@ public class ObserveReferentialCollectionUniqueKeyDtoValidator extends NuitonFie throw new ValidationException("keys not defined"); } - Collection<?> col = getCollection(object); - if (log.isDebugEnabled()) { - log.debug("collection found : " + col); - } + Collection<? super WithStartEndDate> col = getCollection(object); - if (log.isDebugEnabled()) { - log.debug("againtBean = " + object); - } + log.debug("collection found : " + col); + log.debug("againstBean = " + object); boolean answer = true; @SuppressWarnings("unchecked") - Set<Object> hashCodes = new TreeSet<>((Comparator<? super Object>) getComparator()); - Function decoratorService = (Function) getFieldValue("referentialReferenceFunction", object); - ReferentialDtoReference referentialDtoReference = (ReferentialDtoReference) decoratorService.apply(object); - hashCodes.add(referentialDtoReference); + Function<Object, WithStartEndDate> decoratorService = (Function) getFieldValue("referentialReferenceFunction", object); + WithStartEndDate referentialDtoReference = decoratorService.apply(object); + + Date startDate = referentialDtoReference.getStartDate(); + Date endDate = referentialDtoReference.getEndDate(); String idToExclude = ((IdDto) object).getId(); - int index = -1; + List<WithStartEndDate> challenges = new LinkedList<>(); for (Object o : col) { - index++; - String id = ((IdDto) o).getId(); if (Objects.equals(idToExclude, id)) { - // Do not treat again object continue; - } - boolean wasAdded = hashCodes.add(o); - if (!wasAdded) { - answer = false; - if (log.isDebugEnabled()) { - log.debug("duplicated unique entry at " + index); - } + if (equals(referentialDtoReference, o)) { + // same common key + challenges.add((WithStartEndDate) o); break; } + } + if (challenges.isEmpty()) { + // no other entries with same common key + return; } - if (!answer) { + Iterator<WithStartEndDate> iterator = challenges.iterator(); + while (answer && iterator.hasNext()) { + WithStartEndDate challenge = iterator.next(); + Date challengeStartDate = challenge.getStartDate(); + Date challengeEndDate = challenge.getEndDate(); + int min = WithStartEndDate.START_DATE_COMPARATOR.compare(startDate, challengeStartDate); + if (min == 0) { + // same lower bound + answer = false; + continue; + } + if (min < 0) { + // only valid if check upper bound is lower than chanllenge min bound + answer = WithStartEndDate.END_DATE_COMPARATOR.compare(endDate, challengeStartDate) < 0; + continue; + } + // check min is after challenge min + answer = WithStartEndDate.END_DATE_COMPARATOR.compare(startDate, challengeEndDate) > 0; + } + + if (!answer) { String fieldName = getFieldName(); addFieldError(fieldName, object); - } } - @Override - public String getValidatorType() { - return "observeReferentialCollectionUniqueKeyDto"; - } - private Comparator<?> getComparator() { - if (comparator == null) { - comparator = new MyComparator<>(keys); - } - return comparator; - } - - private Object getPropertyValue(String key, Object o) { + Object getPropertyValue(String key, Object o) { Object result; @@ -193,7 +195,7 @@ public class ObserveReferentialCollectionUniqueKeyDtoValidator extends NuitonFie * property * @throws ValidationException if any pb to retreave the collection */ - private Collection<?> getCollection(Object object) throws ValidationException { + Collection<? super WithStartEndDate> getCollection(Object object) throws ValidationException { String fieldName = getCollectionFieldName(); @@ -227,53 +229,38 @@ public class ObserveReferentialCollectionUniqueKeyDtoValidator extends NuitonFie } - return (Collection<?>) obj; + return (Collection) obj; } - @SuppressWarnings("ComparatorNotSerializable") - private class MyComparator<O> implements Comparator<O> { - - private final String[] comparatorKeys; - - MyComparator(String... comparatorKeys) { - - this.comparatorKeys = comparatorKeys; - } - - @Override - public int compare(O o1, O o2) { - - boolean equals = true; - for (String key : comparatorKeys) { + protected boolean equals(Object o1, Object o2) { + boolean equals = true; - Object property1 = getPropertyValue(key, o1); - Object property2 = getPropertyValue(key, o2); + for (String key : keys) { - equals = equals(property1, property2); + Object property1 = getPropertyValue(key, o1); + Object property2 = getPropertyValue(key, o2); - if (!equals) { - break; - } + if (property1 instanceof Date) { + property1 = ((Date) property1).getTime(); } - - return equals ? 0 : -1; - } - - protected boolean equals(Object o1, Object o2) { - - if (o1 instanceof Date) { - o1 = ((Date) o1).getTime(); - } - if (o2 instanceof Date) { - o2 = ((Date) o2).getTime(); + if (property2 instanceof Date) { + property2 = ((Date) property2).getTime(); } - return Objects.equals(o1, o2); + equals = Objects.equals(property1, property2); + if (!equals) { + break; + } } + return equals; + } + @Override + public String getValidatorType() { + return "observeLengthFormulaCollectionUniqueKeyDto"; } } ===================================== validation/src/main/resources/fr/ird/observe/dto/referential/LengthLengthParameterDto-create-error-validation.xml ===================================== @@ -32,10 +32,10 @@ <message>observe.validation.lengthLengthParameter.required.species</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> @@ -47,10 +47,10 @@ <message>observe.validation.lengthLengthParameter.null.ocean</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> @@ -62,25 +62,38 @@ <message>observe.validation.lengthLengthParameter.null.sex</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> </field> <field name="startDate"> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> </field> - + <field name="endDate"> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + </field> <field name="inputSizeMeasureType"> <!-- pas de inputSizeMeasureType selectionne --> @@ -95,6 +108,14 @@ </param> <message>observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType</message> </field-validator> + + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> + </field-validator> </field> @@ -112,6 +133,14 @@ </param> <message>observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType</message> </field-validator> + + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> + </field-validator> </field> <field name="inputOutputFormula"> ===================================== validation/src/main/resources/fr/ird/observe/dto/referential/LengthLengthParameterDto-update-error-validation.xml ===================================== @@ -32,10 +32,11 @@ <message>observe.validation.lengthLengthParameter.required.species</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> </field> @@ -46,12 +47,12 @@ <message>observe.validation.lengthLengthParameter.null.ocean</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> - <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> </field> @@ -61,24 +62,38 @@ <message>observe.validation.lengthLengthParameter.null.sex</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> - <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> </field-validator> </field> + <field name="startDate"> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> - <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> + </field-validator> + </field> + <field name="endDate"> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> </field-validator> </field> - <field name="inputSizeMeasureType"> <!-- pas de inputSizeMeasureType selectionne --> @@ -93,6 +108,14 @@ </param> <message>observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType</message> </field-validator> + + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> + </field-validator> </field> @@ -110,6 +133,14 @@ </param> <message>observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType</message> </field-validator> + + <!-- clef unique species - gender - ocean - inputSizeMeasureTypeCode - outputSizeMeasureTypeCode --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,inputSizeMeasureTypeCode,outputSizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthLengthParameter.invalid.uniqueKey</message> + </field-validator> </field> <field name="inputOutputFormula"> ===================================== validation/src/main/resources/fr/ird/observe/dto/referential/LengthWeightParameterDto-create-error-validation.xml ===================================== @@ -32,10 +32,10 @@ <message>observe.validation.lengthWeightParameter.required.species</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> @@ -47,10 +47,10 @@ <message>observe.validation.lengthWeightParameter.null.ocean</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> @@ -62,25 +62,40 @@ <message>observe.validation.lengthWeightParameter.null.sex</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> </field> <field name="startDate"> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> </field> + <field name="endDate"> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + </field> + <field name="sizeMeasureType"> <!-- pas de sizeMeasureType renseigne --> <field-validator type="required"> @@ -94,6 +109,14 @@ </param> <message>observe.validation.lengthWeightParameter.disabled.sizeMeasureType</message> </field-validator> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> + </field-validator> + </field> <field name="lengthWeightFormula"> ===================================== validation/src/main/resources/fr/ird/observe/dto/referential/LengthWeightParameterDto-update-error-validation.xml ===================================== @@ -26,43 +26,36 @@ "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> - <!--<field name="code">--> - - <!--<!– clef unique sur le code –>--> - <!--<field-validator type="referentialCode" short-circuit="true">--> - <!--<message>observe.validation.referentiel.invalid.code.uniqueKey##${code}</message>--> - <!--</field-validator>--> - - <!--</field>--> - <field name="species"> <!-- pas de species selectionne --> <field-validator type="required" short-circuit="true"> <message>observe.validation.lengthWeightParameter.required.species</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> + </field> <field name="ocean"> <!-- pas de ocean renseigne --> - <field-validator type="required"> + <field-validator type="required" short-circuit="true"> <message>observe.validation.lengthWeightParameter.null.ocean</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> + </field> <field name="sex"> @@ -71,38 +64,62 @@ <message>observe.validation.lengthWeightParameter.null.sex</message> </field-validator> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> + </field> <field name="startDate"> - <!-- clef unique species - gender - ocean - startDate --> - <field-validator type="observeReferentialCollectionUniqueKeyDto" short-circuit="true"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> <param name="collectionFieldName">editingReferentielList</param> - <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> <!--<param name="againstMe">true</param>--> <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> </field-validator> </field> + <field name="endDate"> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ endDate == null || startDate == null || endDate.after(startDate) ]]> + </param> + <message>observe.validation.lengthFormula.endDate.before.startDate</message> + </field-validator> + </field> + <field name="sizeMeasureType"> <!-- pas de sizeMeasureType renseigne --> - <field-validator type="required"> + <field-validator type="required" short-circuit="true"> <message>observe.validation.lengthWeightParameter.null.sizeMeasureType</message> </field-validator> <!-- sizeMeasureType desactive --> - <field-validator type="fieldexpression"> + <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> <![CDATA[ sizeMeasureType == null || sizeMeasureType.enabled ]]> </param> <message>observe.validation.lengthWeightParameter.disabled.sizeMeasureType</message> </field-validator> + <!-- clef unique species - gender - ocean - startDate - sizeMeasureType --> + <field-validator type="observeLengthFormulaCollectionUniqueKeyDto" short-circuit="true"> + <param name="collectionFieldName">editingReferentielList</param> + <param name="keys">speciesLabel,sexLabel,oceanLabel,startDate,sizeMeasureTypeCode</param> + <!--<param name="againstMe">true</param>--> + <message>observe.validation.lengthWeightParameter.invalid.uniqueKey</message> + </field-validator> + </field> <field name="lengthWeightFormula"> ===================================== validation/src/main/resources/i18n/validation_en_GB.properties ===================================== @@ -451,10 +451,11 @@ observe.validation.hooksComposition.desactivated.hookSize=Selected hook size is observe.validation.hooksComposition.desactivated.hookType=Selected hook type is disabled. observe.validation.hooksComposition.required.hookType=Hook type must be filled. observe.validation.hooksComposition.required.proportion=Proportion must be filled. +observe.validation.lengthFormula.endDate.before.startDate=End date must be after start date observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType=Selected Input Size measure type is disabled observe.validation.lengthLengthParameter.invalid.inputOutputFormula=Formula is not valid. observe.validation.lengthLengthParameter.invalid.outputInputFormula=Formula is not valid. -observe.validation.lengthLengthParameter.invalid.uniqueKey=Tuple (gender/ocean/species/startDate) must be unique. +observe.validation.lengthLengthParameter.invalid.uniqueKey=Tuple (species/ocean/gender/input size measure/ output size measure/startDate) must be unique. observe.validation.lengthLengthParameter.null.inputSizeMeasureType=Input size measure type is not filled. observe.validation.lengthLengthParameter.null.ocean=Ocean is not filled. observe.validation.lengthLengthParameter.null.outputSizeMeasureType=Output size measure type is not filled. @@ -467,7 +468,7 @@ observe.validation.lengthLengthParameter.required.species=Species must be filled observe.validation.lengthLengthParameter.required.startDate=Start date must be filled. observe.validation.lengthWeightParameter.disabled.sizeMeasureType=Selected size measure type is disabled. observe.validation.lengthWeightParameter.invalid.lengthWeightFormula=Formula is not valid. -observe.validation.lengthWeightParameter.invalid.uniqueKey=Tuple (gender/ocean/species/startDate) must be unique. +observe.validation.lengthWeightParameter.invalid.uniqueKey=Tuple (species/ocean/gender/sizeMeasureType/startDate) must be unique. observe.validation.lengthWeightParameter.invalid.weightLengthFormula=Formula is not valid. observe.validation.lengthWeightParameter.null.ocean=Ocean is not filled. observe.validation.lengthWeightParameter.null.sizeMeasureType=Size measure type is not filled. ===================================== validation/src/main/resources/i18n/validation_es_ES.properties ===================================== @@ -453,10 +453,11 @@ observe.validation.hooksComposition.desactivated.hookSize=El tamaño de avanzuel observe.validation.hooksComposition.desactivated.hookType=El tipo de avanzuelo seleccionado está desactivado. observe.validation.hooksComposition.required.hookType=La selección de un tipo de avanzuelo es mandatoria. observe.validation.hooksComposition.required.proportion=La proporción está vacía. +observe.validation.lengthFormula.endDate.before.startDate=End date must be after start date \#TODO observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType=Le type de mensuration d'entrée sélectionné est désactivé. \#TODO observe.validation.lengthLengthParameter.invalid.inputOutputFormula=La formule n'est pas valide. \#TODO observe.validation.lengthLengthParameter.invalid.outputInputFormula=La formule n'est pas valide. \#TODO -observe.validation.lengthLengthParameter.invalid.uniqueKey=Tupla (sexo/océano/especie) debe ser única, la tupla ya se ha usado. +observe.validation.lengthLengthParameter.invalid.uniqueKey=Tupla (especiesexo/océano/input size measure/ output size measure/startDate) debe ser única, la tupla ya se ha usado. #TODO observe.validation.lengthLengthParameter.null.inputSizeMeasureType=Le type de mensuration d'entrée n'est pas renseigné. \#TODO observe.validation.lengthLengthParameter.null.ocean=No se ha seleccionado oceano. observe.validation.lengthLengthParameter.null.outputSizeMeasureType=Le type de mensuration de sortie n'est pas renseigné. \#TODO @@ -469,7 +470,7 @@ observe.validation.lengthLengthParameter.required.species=Especie no especificad observe.validation.lengthLengthParameter.required.startDate=fecha de comienzo de validez no especificada. observe.validation.lengthWeightParameter.disabled.sizeMeasureType=Le type de mensuration sélectionné est désactivé. \#TODO observe.validation.lengthWeightParameter.invalid.lengthWeightFormula=Relación de peso introducida no es coherente. -observe.validation.lengthWeightParameter.invalid.uniqueKey=Tupla (sexo/océano/especie) debe ser única, la tupla ya se ha usado. +observe.validation.lengthWeightParameter.invalid.uniqueKey=Tupla (especie/sexo/océano/sizeMeasureType/startDate) debe ser única, la tupla ya se ha usado. #TODO observe.validation.lengthWeightParameter.invalid.weightLengthFormula=Relación de talla introducida no es coherente. observe.validation.lengthWeightParameter.null.ocean=No se ha seleccionado oceano. observe.validation.lengthWeightParameter.null.sizeMeasureType=Type de mensuration non renseigné. \#TODO ===================================== validation/src/main/resources/i18n/validation_fr_FR.properties ===================================== @@ -451,10 +451,11 @@ observe.validation.hooksComposition.desactivated.hookSize=La taille d'hameçon s observe.validation.hooksComposition.desactivated.hookType=Le type d'hameçon sélectionné est désactivée. observe.validation.hooksComposition.required.hookType=La sélection d'un type d'hameçon est obligatoire. observe.validation.hooksComposition.required.proportion=Proportion non renseignée. +observe.validation.lengthFormula.endDate.before.startDate=La date de fin doit être ultérieure à celle de débuts observe.validation.lengthLengthParameter.disabled.inputSizeMeasureType=Le type de mensuration d'entrée sélectionné est désactivé. observe.validation.lengthLengthParameter.invalid.inputOutputFormula=La formule n'est pas valide. observe.validation.lengthLengthParameter.invalid.outputInputFormula=La formule n'est pas valide. -observe.validation.lengthLengthParameter.invalid.uniqueKey=Le tuple (sexe/océan/espèce/date de début) doit être unique +observe.validation.lengthLengthParameter.invalid.uniqueKey=Le tuple (espèce/sexe/océan/type de measure en entrée/type de mesure en sortie/date de début) doit être unique observe.validation.lengthLengthParameter.null.inputSizeMeasureType=Le type de mensuration d'entrée n'est pas renseigné. observe.validation.lengthLengthParameter.null.ocean=Aucun océan sélectionné. observe.validation.lengthLengthParameter.null.outputSizeMeasureType=Le type de mensuration de sortie n'est pas renseigné. @@ -467,7 +468,7 @@ observe.validation.lengthLengthParameter.required.species=L'espèce n'est pas re observe.validation.lengthLengthParameter.required.startDate=date de début de validité non renseignée. observe.validation.lengthWeightParameter.disabled.sizeMeasureType=Le type de mensuration sélectionné est désactivé. observe.validation.lengthWeightParameter.invalid.lengthWeightFormula=La relation poids saisie n'est pas cohérente. -observe.validation.lengthWeightParameter.invalid.uniqueKey=Le tuple (sexe/océan/espèce/date de début) doit être unique +observe.validation.lengthWeightParameter.invalid.uniqueKey=Le tuple (espèce/sexe/océan/type de measure/date de début) doit être unique observe.validation.lengthWeightParameter.invalid.weightLengthFormula=La relation taille saisie n'est pas cohérente. observe.validation.lengthWeightParameter.null.ocean=Aucun océan sélectionné. observe.validation.lengthWeightParameter.null.sizeMeasureType=Type de mensuration non renseigné. ===================================== validation/src/main/resources/validators.xml ===================================== @@ -54,7 +54,7 @@ <!-- Les validateurs spécifique aux Dto dans observe --> <validator name="collectionUniqueKeyDto" class="fr.ird.observe.services.validation.validators.CollectionUniqueKeyDtoValidator"/> <validator name="observeCollectionUniqueKeyDto" class="fr.ird.observe.services.validation.validators.ObserveCollectionUniqueKeyDtoValidator"/> - <validator name="observeReferentialCollectionUniqueKeyDto" class="fr.ird.observe.services.validation.validators.ObserveReferentialCollectionUniqueKeyDtoValidator"/> + <validator name="observeLengthFormulaCollectionUniqueKeyDto" class="fr.ird.observe.services.validation.validators.ObserveLengthFormulaCollectionUniqueKeyDtoValidator"/> <validator name="openableDto" class="fr.ird.observe.services.validation.validators.OpenableDtoFieldValidator"/> <validator name="species_lengthDto" class="fr.ird.observe.services.validation.validators.SpeciesLengthFieldDtoValidator"/> <validator name="species_weightDto" class="fr.ird.observe.services.validation.validators.SpeciesWeightFieldDtoValidator"/> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/4575713fd28cb2cd53d95b9c9f43... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/4575713fd28cb2cd53d95b9c9f43... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT