Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: d22c04d4 by Tony CHEMIT at 2018-09-22T17:54:27Z Widget température °C/°F : message de validation perfectible - Closes #960 - - - - - 21 changed files: - client/src/main/java/fr/ird/observe/client/ui/actions/content/ShowTechnicalInformationsAction.java - client/src/main/java/fr/ird/observe/client/ui/content/ContentUIInitializer.java - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/ActivityLonglineUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/data/seine/ActivitySeineUIHandler.java - client/src/main/java/fr/ird/observe/client/validation/ClientValidationContext.java - + dto/src/main/java/fr/ird/observe/dto/data/longline/TripLonglineDto.java - dto/src/main/models/Observe.model - persistence/src/main/java/fr/ird/observe/binder/data/longline/TripLonglineActivityEntityDtoBinder.java - persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineStubEntityDtoBinder.java - services/pom.xml - + services/src/main/java/fr/ird/observe/services/validation/validators/TemperatureBoundFieldValidator.java - + services/src/main/java/fr/ird/observe/services/validation/validators/TemperatureCompareFieldValidator.java - validation/pom.xml - validation/src/main/resources/fr/ird/observe/dto/data/longline/ActivityLonglineDto-create-error-validation.xml - validation/src/main/resources/fr/ird/observe/dto/data/longline/ActivityLonglineDto-update-error-validation.xml - validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-create-error-validation.xml - 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: ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/ShowTechnicalInformationsAction.java ===================================== @@ -1,5 +1,27 @@ package fr.ird.observe.client.ui.actions.content; +/*- + * #%L + * ObServe :: Client + * %% + * 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.client.ObserveSwingApplicationContext; import fr.ird.observe.client.ui.ObserveKeyStrokes; import fr.ird.observe.client.ui.ObserveMainUI; ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ContentUIInitializer.java ===================================== @@ -52,8 +52,8 @@ import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.ReferentialDtoReference; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.swingx.JXDatePicker; import org.jdesktop.swingx.JXMonthView; import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; @@ -63,6 +63,7 @@ import org.nuiton.jaxx.runtime.swing.editor.EnumEditor; import org.nuiton.jaxx.runtime.swing.renderer.DecoratorListCellRenderer; import org.nuiton.jaxx.runtime.swing.renderer.EnumEditorRenderer; import org.nuiton.jaxx.validator.JAXXValidator; +import org.nuiton.jaxx.validator.swing.SwingValidator; import org.nuiton.jaxx.validator.swing.SwingValidatorUtil; import org.nuiton.jaxx.widgets.datetime.DateTimeEditor; import org.nuiton.jaxx.widgets.datetime.TimeEditor; @@ -346,6 +347,10 @@ public class ContentUIInitializer<E extends IdDto, UI extends ContentUI<E, UI>> editor.setConfig(new TemperatureEditorConfig(TemperatureFormat.C, getBean(), label.getText(), propertyName)); editor.init(label); + editor.getModel().addPropertyChangeListener("format", e -> { + ((SwingValidator<?>) ui.getObjectById("validator")).doValidate(); + }); + } private void init(JLabel editor) { ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/ActivityLonglineUIHandler.java ===================================== @@ -251,7 +251,7 @@ class ActivityLonglineUIHandler extends ContentOpenableUIHandler<ActivityLonglin ClientValidationContext validationContext = ObserveSwingApplicationContext.get().getValidationContext(); validationContext.setCoordinatesEditor("coordinate", getUi().getCoordinatesEditor()); - + validationContext.setTemperatureEditorModel("seaSurfaceTemperature", getUi().getSeaSurfaceTemperature().getModel()); } @Override ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/seine/ActivitySeineUIHandler.java ===================================== @@ -140,7 +140,7 @@ class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySeineDto, ClientValidationContext validationContext = ObserveSwingApplicationContext.get().getValidationContext(); validationContext.setCoordinatesEditor("coordinate", getUi().getCoordinatesEditor()); - + validationContext.setTemperatureEditorModel("seaSurfaceTemperature", getUi().getSeaSurfaceTemperature().getModel()); } @Override ===================================== client/src/main/java/fr/ird/observe/client/validation/ClientValidationContext.java ===================================== @@ -8,12 +8,12 @@ * 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>. @@ -39,6 +39,7 @@ import fr.ird.observe.services.ObserveServicesProvider; import fr.ird.observe.services.validation.ValidationContext; import fr.ird.observe.services.validation.ValidationDataContext; import org.nuiton.jaxx.widgets.gis.absolute.CoordinatesEditor; +import org.nuiton.jaxx.widgets.temperature.TemperatureEditorModel; import java.util.List; import java.util.Map; @@ -52,6 +53,9 @@ import java.util.function.Supplier; */ public class ClientValidationContext extends ValidationContext { + private Map<String, CoordinatesEditor> coordinatesEditors = new TreeMap<>(); + private Map<String, TemperatureEditorModel> temperatureEditorModels = new TreeMap<>(); + public ClientValidationContext(ClientConfig config, ValidationDataContext validationDataContext) { super(validationDataContext, ObserveSwingApplicationContext.get().getDecoratorService(), @@ -118,14 +122,13 @@ public class ClientValidationContext extends ValidationContext { public void reset() { super.reset(); coordinatesEditors.clear(); + temperatureEditorModels.clear(); } public ObserveOpenDataManager getOpenDataManager() { return ObserveSwingApplicationContext.get().getOpenDataManager(); } - private Map<String, CoordinatesEditor> coordinatesEditors = new TreeMap<>(); - public Map<String, CoordinatesEditor> getCoordinatesEditors() { return coordinatesEditors; } @@ -138,4 +141,16 @@ public class ClientValidationContext extends ValidationContext { coordinatesEditors.put(name, editor); } + public Map<String, TemperatureEditorModel> getTemperatureEditorModels() { + return temperatureEditorModels; + } + + public TemperatureEditorModel getTemperatureEditorModel(String name) { + return temperatureEditorModels.get(name); + } + + public void setTemperatureEditorModel(String name, TemperatureEditorModel editor) { + temperatureEditorModels.put(name, editor); + } + } ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/TripLonglineDto.java ===================================== @@ -0,0 +1,56 @@ +package fr.ird.observe.dto.data.longline; + +/*- + * #%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 com.google.common.collect.Iterables; +import fr.ird.observe.dto.IdHelper; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class TripLonglineDto extends GeneratedTripLonglineDto { + + private static final Logger log = LogManager.getLogger(TripLonglineDto.class); + private static final long serialVersionUID = 3977866185675257699L; + + public TripLonglineActivityDto getPreviousActivity(String activitySeineId) { + + TripLonglineActivityDto previous = null; + + if (activitySeineId != null) { + + int currentPosition = Iterables.indexOf(getActivityLongline(), IdHelper.newIdPredicate(activitySeineId)::test); + if (currentPosition >= 1) { + previous = Iterables.get(getActivityLongline(), currentPosition - 1); + } + } + + if (previous != null) { + log.debug("previous activity " + previous.getTimeStamp()); + + } else { + log.debug("no previous activity for " + activityLongline); + } + + return previous; + } +} ===================================== dto/src/main/models/Observe.model ===================================== @@ -348,6 +348,7 @@ activityLongline + {*} data.longline.TripLonglineActivity | ordered unique data.longline.TripLonglineActivity > data.Data timeStamp + {*:1} Date +seaSurfaceTemperature + {*:1} Float data.longline.TripLonglineGearUse > data.Data | form=data.longline.GearUseFeaturesLongline gearUseFeaturesLongline + {*} data.longline.GearUseFeaturesLongline | ordered ===================================== persistence/src/main/java/fr/ird/observe/binder/data/longline/TripLonglineActivityEntityDtoBinder.java ===================================== @@ -53,6 +53,6 @@ public class TripLonglineActivityEntityDtoBinder extends DataEntityDtoBinderSupp copyEntityDataFieldsToDto(entity, dto); dto.setTimeStamp(entity.getTimeStamp()); - + dto.setSeaSurfaceTemperature(entity.getSeaSurfaceTemperature()); } } ===================================== persistence/src/main/java/fr/ird/observe/binder/data/seine/ActivitySeineStubEntityDtoBinder.java ===================================== @@ -52,6 +52,7 @@ public class ActivitySeineStubEntityDtoBinder extends DataEntityDtoBinderSupport dto.setLastUpdateDate(entity.getLastUpdateDate()); dto.setLatitude(entity.getLatitude()); dto.setLongitude(entity.getLongitude()); + dto.setSeaSurfaceTemperature(entity.getSeaSurfaceTemperature()); boolean isFindeVeille = entity.getVesselActivitySeine() != null && ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE.equals(entity.getVesselActivitySeine().getCode()); ===================================== services/pom.xml ===================================== @@ -157,6 +157,10 @@ <groupId>io.ultreia.java4all.topia</groupId> <artifactId>service-script</artifactId> </dependency> + <dependency> + <groupId>io.ultreia.java4all.jaxx</groupId> + <artifactId>jaxx-widgets-temperature</artifactId> + </dependency> </dependencies> ===================================== services/src/main/java/fr/ird/observe/services/validation/validators/TemperatureBoundFieldValidator.java ===================================== @@ -0,0 +1,149 @@ +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.opensymphony.xwork2.validator.ValidationException; +import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; +import org.nuiton.jaxx.widgets.temperature.I18nEnumHelper; +import org.nuiton.jaxx.widgets.temperature.TemperatureEditorModel; +import org.nuiton.jaxx.widgets.temperature.TemperatureFormat; + +import java.util.Map; + +/** + * To validate that the temperature is in correct bound. + * <p> + * Created by tchemit on 22/09/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class TemperatureBoundFieldValidator extends FieldValidatorSupport { + + /** + * Default temperature format (min and max are based on this format). + */ + private TemperatureFormat defaultTemperatureFormat; + /** + * Min temperature. + */ + private Float min; + /** + * Max temperature. + */ + private Float max; + + public void setDefaultTemperatureFormat(String defaultTemperatureFormat) { + this.defaultTemperatureFormat = TemperatureFormat.valueOf(defaultTemperatureFormat); + } + + public void setMin(String min) { + this.min = Float.valueOf(min); + } + + public void setMax(String max) { + this.max = Float.valueOf(max); + } + + @Override + public void validate(Object object) throws ValidationException { + + if (min == null) { + throw new ValidationException("No parameter 'min' filled"); + } + if (max == null) { + throw new ValidationException("No parameter 'max' filled"); + } + if (min >= max) { + throw new ValidationException(String.format("No parameter 'min' (%s) is greater than 'max' (%s)", min, max)); + } + String fieldName = getFieldName(); + if (fieldName == null) { + throw new ValidationException("No parameter 'fieldName' filled"); + } + Float temperature = (Float) getFieldValue(fieldName, object); + if (temperature == null) { + return; + } + + @SuppressWarnings("unchecked") Map<String, TemperatureEditorModel> map = (Map<String, TemperatureEditorModel>) getFieldValue("temperatureEditorModels", object); + TemperatureFormat temperatureFormat = defaultTemperatureFormat; + if (map != null) { + + TemperatureEditorModel temperatureEditorModel = map.get(fieldName); + //FIXME une validation est lancé dans l'ui alors que l'on ne devrait pas et on a pas ce composant alors + if (temperatureEditorModel != null) { + temperatureFormat = temperatureEditorModel.getFormat(); + } + } + + if (temperature < min || temperature > max) { + float min; + float max; + if (temperatureFormat.equals(defaultTemperatureFormat)) { + min = this.min; + max = this.max; + } else { + min = defaultTemperatureFormat.convert(this.min, temperatureFormat); + max = defaultTemperatureFormat.convert(this.max, temperatureFormat); + } + stack.set(fieldName + "Bound", new TemperatureResult(min, max, I18nEnumHelper.getLabel(temperatureFormat))); + try { + addFieldError(fieldName, object); + } finally { + stack.pop(); + } + } + + } + + @Override + public String getValidatorType() { + return "temperatureBound"; + } + + static class TemperatureResult { + private final float min; + private final float max; + private final String format; + + TemperatureResult(float min, float max, String format) { + this.min = min; + this.max = max; + this.format = format; + } + + public float getMin() { + return min; + } + + public float getMax() { + return max; + } + + public String getFormat() { + return format; + } + } + +} + ===================================== services/src/main/java/fr/ird/observe/services/validation/validators/TemperatureCompareFieldValidator.java ===================================== @@ -0,0 +1,159 @@ +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.opensymphony.xwork2.validator.ValidationException; +import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; +import io.ultreia.java4all.lang.Numbers; +import org.nuiton.jaxx.widgets.temperature.I18nEnumHelper; +import org.nuiton.jaxx.widgets.temperature.TemperatureEditorModel; +import org.nuiton.jaxx.widgets.temperature.TemperatureFormat; + +import java.util.Map; + +/** + * To validate that the temperature is in correct bound. + * <p> + * Created by tchemit on 22/09/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class TemperatureCompareFieldValidator extends FieldValidatorSupport { + + /** + * Name of the field to compare against. + */ + private String compareFieldName; + + /** + * Default temperature format (max are based on this format). + */ + private TemperatureFormat defaultTemperatureFormat; + /** + * Compare temperature format (compare temperature is base on this format). + */ + private TemperatureFormat compareTemperatureFormat; + /** + * Max temperature. + */ + private Float max; + + public void setDefaultTemperatureFormat(String defaultTemperatureFormat) { + this.defaultTemperatureFormat = TemperatureFormat.valueOf(defaultTemperatureFormat); + } + + public void setCompareTemperatureFormat(String compareTemperatureFormat) { + this.compareTemperatureFormat = TemperatureFormat.valueOf(compareTemperatureFormat); + } + + public void setMax(String max) { + this.max = Float.valueOf(max); + } + + public void setCompareFieldName(String compareFieldName) { + this.compareFieldName = compareFieldName; + } + + @Override + public void validate(Object object) throws ValidationException { + + String fieldName = getFieldName(); + if (fieldName == null) { + throw new ValidationException("No parameter 'fieldName' filled"); + } + if (compareFieldName == null) { + throw new ValidationException("No parameter 'compareFieldName' filled"); + } + if (max == null) { + throw new ValidationException("No parameter 'max' filled"); + } + Float temperature = (Float) getFieldValue(fieldName, object); + if (temperature == null) { + return; + } + Float againstTemperature = (Float) getFieldValue(compareFieldName, object); + if (againstTemperature == null) { + return; + } + @SuppressWarnings("unchecked") Map<String, TemperatureEditorModel> map = (Map<String, TemperatureEditorModel>) getFieldValue("temperatureEditorModels", object); + TemperatureFormat temperatureFormat = defaultTemperatureFormat; + if (map != null) { + + TemperatureEditorModel temperatureEditorModel = map.get(fieldName); + //FIXME une validation est lancé dans l'ui alors que l'on ne devrait pas et on a pas ce composant alors + if (temperatureEditorModel != null) { + temperatureFormat = temperatureEditorModel.getFormat(); + } + } + + if (Math.abs(temperature - againstTemperature) > max) { + float max; + if (temperatureFormat.equals(defaultTemperatureFormat)) { + max = this.max; + } else { + max = Numbers.roundOneDigit(defaultTemperatureFormat.convert(this.max, temperatureFormat) - 32); + } + if (!temperatureFormat.equals(compareTemperatureFormat)) { + againstTemperature = compareTemperatureFormat.convert(againstTemperature, temperatureFormat); + } + stack.set(fieldName + "Compare", new TemperatureResult(max, againstTemperature, I18nEnumHelper.getLabel(temperatureFormat))); + try { + addFieldError(fieldName, object); + } finally { + stack.pop(); + } + } + + } + + @Override + public String getValidatorType() { + return "temperatureCompare"; + } + + static class TemperatureResult { + private final float max; + private final Float againstTemperature; + private final String format; + + TemperatureResult(float max, Float againstTemperature, String format) { + this.max = max; + this.againstTemperature = againstTemperature; + this.format = format; + } + + public Float getAgainstTemperature() { + return againstTemperature; + } + + public float getMax() { + return max; + } + + public String getFormat() { + return format; + } + } + +} + ===================================== validation/pom.xml ===================================== @@ -191,6 +191,11 @@ <artifactId>jaxx-widgets-gis</artifactId> <version>${lib.version.java4all.jaxx}</version> </dependency> + <dependency> + <groupId>io.ultreia.java4all.jaxx</groupId> + <artifactId>jaxx-widgets-temperature</artifactId> + <version>${lib.version.java4all.jaxx}</version> + </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> ===================================== validation/src/main/resources/fr/ird/observe/dto/data/longline/ActivityLonglineDto-create-error-validation.xml ===================================== @@ -77,16 +77,14 @@ <field name="seaSurfaceTemperature"> <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> - <field-validator type="fieldexpressionwithparams" short-circuit="true"> - <param name="doubleParams">min:12.0|max:35.0</param> - <param name="expression"> - <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> - </param> + <field-validator type="temperatureBound" short-circuit="true"> + <param name="min">12.0</param> + <param name="max">35.0</param> + <param name="defaultTemperatureFormat">C</param> <message> - observe.validation.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} + observe.validation.activity.bound.seaSurfaceTemperature##${seaSurfaceTemperatureBound.min}##${seaSurfaceTemperatureBound.max}##${seaSurfaceTemperatureBound.format} </message> </field-validator> - </field> <field name="quadrant"> ===================================== validation/src/main/resources/fr/ird/observe/dto/data/longline/ActivityLonglineDto-update-error-validation.xml ===================================== @@ -62,13 +62,22 @@ <field name="seaSurfaceTemperature"> <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> - <field-validator type="fieldexpressionwithparams" short-circuit="true"> - <param name="doubleParams">min:12.0|max:35.0</param> - <param name="expression"> - <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> - </param> + <field-validator type="temperatureBound" short-circuit="true"> + <param name="min">12.0</param> + <param name="max">35.0</param> + <param name="defaultTemperatureFormat">C</param> + <message> + observe.validation.activity.bound.seaSurfaceTemperature##${seaSurfaceTemperatureBound.min}##${seaSurfaceTemperatureBound.max}##${seaSurfaceTemperatureBound.format} + </message> + </field-validator> + <!-- coherence temperature surface (delta de 12° par rapport a celle de l'activity precedente) --> + <field-validator type="temperatureCompare" short-circuit="true"> + <param name="max">12.0</param> + <param name="defaultTemperatureFormat">C</param> + <param name="compareTemperatureFormat">C</param> + <param name="compareFieldName">currentTrip.getPreviousActivity(id).seaSurfaceTemperature</param> <message> - observe.validation.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} + observe.validation.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperatureCompare.againstTemperature}##${currentTrip.getPreviousActivity(id).timeStamp}##${seaSurfaceTemperatureCompare.max}##${seaSurfaceTemperatureCompare.format} </message> </field-validator> ===================================== validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-create-error-validation.xml ===================================== @@ -251,28 +251,12 @@ <field name="seaSurfaceTemperature"> <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> - <field-validator type="fieldexpressionwithparams" short-circuit="true"> - <param name="doubleParams">min:12.0|max:35.0</param> - <param name="expression"> - <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> - </param> - <message> - observe.validation.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} - </message> - </field-validator> - - <!-- coherence temperature surface (delta de 12° par rapport a celle de l'activity precedente) --> - <field-validator type="fieldexpression"> - <param name="expression"><![CDATA[ - seaSurfaceTemperature == null || previousActivity == null || previousActivity.seaSurfaceTemperature == null || - (previousActivity.seaSurfaceTemperature > seaSurfaceTemperature ? - previousActivity.seaSurfaceTemperature - seaSurfaceTemperature <= 12.0 - : seaSurfaceTemperature - previousActivity.seaSurfaceTemperature <= 12.0 - ) - ]]> - </param> + <field-validator type="temperatureBound" short-circuit="true"> + <param name="min">12.0</param> + <param name="max">35.0</param> + <param name="defaultTemperatureFormat">C</param> <message> - observe.validation.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperature}##${previousActivity.seaSurfaceTemperature}##${previousActivity.time} + observe.validation.activity.bound.seaSurfaceTemperature##${seaSurfaceTemperatureBound.min}##${seaSurfaceTemperatureBound.max}##${seaSurfaceTemperatureBound.format} </message> </field-validator> ===================================== validation/src/main/resources/fr/ird/observe/dto/data/seine/ActivitySeineDto-update-error-validation.xml ===================================== @@ -180,28 +180,22 @@ <field name="seaSurfaceTemperature"> <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> - <field-validator type="fieldexpressionwithparams" short-circuit="true"> - <param name="doubleParams">min:12.0|max:35.0</param> - <param name="expression"> - <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> - </param> + <field-validator type="temperatureBound" short-circuit="true"> + <param name="min">12.0</param> + <param name="max">35.0</param> + <param name="defaultTemperatureFormat">C</param> <message> - observe.validation.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} + observe.validation.activity.bound.seaSurfaceTemperature##${seaSurfaceTemperatureBound.min}##${seaSurfaceTemperatureBound.max}##${seaSurfaceTemperatureBound.format} </message> </field-validator> - <!-- coherence temperature surface (delta de 12° par rapport a celle de l'activity precedente) --> - <field-validator type="fieldexpression"> - <param name="expression"><![CDATA[ - seaSurfaceTemperature == null || previousActivity == null || previousActivity.seaSurfaceTemperature == null || - (previousActivity.seaSurfaceTemperature > seaSurfaceTemperature ? - previousActivity.seaSurfaceTemperature - seaSurfaceTemperature <= 12.0 - : seaSurfaceTemperature - previousActivity.seaSurfaceTemperature <= 12.0 - ) - ]]> - </param> + <field-validator type="temperatureCompare" short-circuit="true"> + <param name="max">12.0</param> + <param name="defaultTemperatureFormat">C</param> + <param name="compareTemperatureFormat">C</param> + <param name="compareFieldName">currentRoute.getPreviousActivity(id).seaSurfaceTemperature</param> <message> - observe.validation.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperature}##${previousActivity.seaSurfaceTemperature}##${previousActivity.time} + observe.validation.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperatureCompare.againstTemperature}##${currentRoute.getPreviousActivity(id).time}##${seaSurfaceTemperatureCompare.max}##${seaSurfaceTemperatureCompare.format} </message> </field-validator> ===================================== validation/src/main/resources/i18n/validation_en_GB.properties ===================================== @@ -325,7 +325,7 @@ observe.common.WindDto.speedRange=Speed range observe.common.WindDto.waveHeight=Wave weight observe.validation.activity.bound.latitude=Latitude must be between %1$s and %2$s. observe.validation.activity.bound.longitude=Longitude must be between %1$s and %2$s. -observe.validation.activity.bound.seaSurfaceTemperature=Temperature must be between %1$s and %2$s. +observe.validation.activity.bound.seaSurfaceTemperature=Temperature must be between %1$s%3$s and %2$s%3$s. observe.validation.activity.bound.vesselSpeed=Vessel speed must be between %1$s and %2$s. observe.validation.activity.comment.tobig=Comment size is bound to 1024 characters. observe.validation.activity.desactivated.currentFpaZone=Selected current Fpa zone is disabled. @@ -340,7 +340,7 @@ observe.validation.activity.desactivated.vesselActivity=Selected vessel activity observe.validation.activity.desactivated.wind=Selected wind is disabled. observe.validation.activity.duplicated.time=There is already another activity at this time. observe.validation.activity.invalid.quadrant=Quadrant is not coherent with ocean (%1$s) of trip (indian\: 1,2, atlantic 1,2,3,4). -observe.validation.activity.invalid.seaSurfaceTemperature=Sea temperature (%1$s) can't vary to more than 12° from surface temperature (%2$s) of the previous activity %3$s. +observe.validation.activity.invalid.seaSurfaceTemperature=Sea temperature can't vary to more than %3$s%4$s from surface temperature (%1$s%4$s) of the previous activity %2$s. observe.validation.activity.invalid.speed=Activity speed is %s nb, which is more than the maximum authorized which is %s nd. observe.validation.activity.null.dcp=No floating object selected. observe.validation.activity.null.fpaZone=Fpa zone is not filled. ===================================== validation/src/main/resources/i18n/validation_es_ES.properties ===================================== @@ -327,7 +327,7 @@ observe.common.WindDto.speedRange=Texto velocidad del viento observe.common.WindDto.waveHeight=Texto descriptivo de «altura media de la ola» observe.validation.activity.bound.latitude=La latitud dada debe estar comprendida entre %1$s y %2$s. observe.validation.activity.bound.longitude=La longitud dada debe estar comprendida entre %1$s y %2$s. -observe.validation.activity.bound.seaSurfaceTemperature=La temperatura debe estar comprendida entre %1$s y %2$s. +observe.validation.activity.bound.seaSurfaceTemperature=La temperatura debe estar comprendida entre %1$s%3$s y %2$s%3$s. observe.validation.activity.bound.vesselSpeed=La Velocidad del viento estar comprendida entre %1$s y %2$s. observe.validation.activity.comment.tobig=La longitud del campo comentarios está limitada a 1024 carácteres. observe.validation.activity.desactivated.currentFpaZone=La zona actual debe ser desactivada @@ -342,7 +342,7 @@ observe.validation.activity.desactivated.vesselActivity=Actividad del barco sele observe.validation.activity.desactivated.wind=La fuerza del viento seleccionada está desactivada. observe.validation.activity.duplicated.time=Ya existe una actividad a esa hora. observe.validation.activity.invalid.quadrant=El cuadrante no es coherente con el informe del oceano (%1$s) de la marea (indico \: 1,2, atlantico \: 1, 2, 3, 4) -observe.validation.activity.invalid.seaSurfaceTemperature=La temperatura superficial (%1$s) no puede variar mas de 12° con respecto a la temperatura superficial (%2$s) de la actividad anterio %3$s. +observe.validation.activity.invalid.seaSurfaceTemperature=La temperatura superficial no puede variar mas de %3$s%4$s con respecto a la temperatura superficial (%1$s%4$s) de la actividad anterio %2$s. observe.validation.activity.invalid.speed=La velocidad de la actividad actual es %s nudos, mientras que la velocidad máxima es %s nudos. observe.validation.activity.null.dcp=No se ha introducido objeto flotante. observe.validation.activity.null.fpaZone=La selección de una zona FPA es obligatoria. ===================================== validation/src/main/resources/i18n/validation_fr_FR.properties ===================================== @@ -325,7 +325,7 @@ observe.common.WindDto.speedRange=Libellé vitesse vent observe.common.WindDto.waveHeight=Libellé Hauteur moyenne vagues observe.validation.activity.bound.latitude=La latitude doit être comprise entre %1$s et %2$s. observe.validation.activity.bound.longitude=La longitude doit être comprise entre %1$s et %2$s. -observe.validation.activity.bound.seaSurfaceTemperature=La température doit être comprise entre %1$s et %2$s. +observe.validation.activity.bound.seaSurfaceTemperature=La température doit être comprise entre %1$s%3$s et %2$s%3$s. observe.validation.activity.bound.vesselSpeed=La vitesse navire doit être comprise entre %1$s et %2$s. observe.validation.activity.comment.tobig=La taille du commentaire est limitée à 1024 caractères. observe.validation.activity.desactivated.currentFpaZone=La zone courante est désactivée. @@ -340,7 +340,7 @@ observe.validation.activity.desactivated.vesselActivity=L'activité bateau séle observe.validation.activity.desactivated.wind=Le vent Beaufort sélectionné est désactivé. observe.validation.activity.duplicated.time=Il existe déjà une autre activité à cette heure. observe.validation.activity.invalid.quadrant=Le quadrant n'est pas cohérent par rapport à l'océan (%1$s) de la marée (indien \: 1 -observe.validation.activity.invalid.seaSurfaceTemperature=La température surface (%1$s) ne peut pas varier de plus de 12° par rapport à la température surface (%2$s) de l'activité précédente %3$s. +observe.validation.activity.invalid.seaSurfaceTemperature=La température surface ne peut pas varier de plus de %3$s%4$s par rapport à la température surface (%1$s%4$s) de l'activité précédente %2$s. observe.validation.activity.invalid.speed=La vitesse de l'activité courante est de %s nd, alors que la vitesse maximale autorisée est %s nd observe.validation.activity.null.dcp=Aucun objet flottant saisi. observe.validation.activity.null.fpaZone=La sélection d'une zone FPA est obligatoire. ===================================== validation/src/main/resources/validators.xml ===================================== @@ -69,5 +69,7 @@ <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"/> + <validator name="temperatureBound" class="fr.ird.observe.services.validation.validators.TemperatureBoundFieldValidator"/> + <validator name="temperatureCompare" class="fr.ird.observe.services.validation.validators.TemperatureCompareFieldValidator"/> </validators> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/d22c04d46aa280dcd0a276df0c33... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/d22c04d46aa280dcd0a276df0c33... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT