This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 1f8ca0fac8aeb52e48f2d89ab3aa6970a9dadb90 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Nov 10 10:35:19 2015 +0100 Suppression des validateurs non utilisés (refs 7706) --- .../dto/ActivityDebutDePecheSaneDtoValidator.java | 205 ---------- .../dto/ActivityFinDePecheSaneDtoValidator.java | 242 ----------- .../dto/RouteActivitysFieldDtoValidator.java | 132 ------ .../dto/VesselActivityFieldDtoValidator.java | 451 --------------------- .../src/main/resources/validators.xml | 3 - .../src/main/resources/validators.xml | 2 - .../ActivityDebutDePecheSaneValidator.java | 199 --------- .../entities/ActivityFinDePecheSaneValidator.java | 237 ----------- .../entities/RouteActivitysFieldValidator.java | 135 ------ .../entities/VesselActivityFieldValidator.java | 446 -------------------- .../src/test/resources/validators.xml | 2 - .../src/test/resources/validators.xml | 2 - 12 files changed, 2056 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityDebutDePecheSaneDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityDebutDePecheSaneDtoValidator.java deleted file mode 100644 index f31fe9c..0000000 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityDebutDePecheSaneDtoValidator.java +++ /dev/null @@ -1,205 +0,0 @@ -package fr.ird.observe.validation.validator.dto; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.RouteDto; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Date; - -/** - * <!-- START SNIPPET: javadoc --> ActivityDebutDePecheSaneValidator vérifie que - * que l'utilisation d'une activity de début de calée est possible. - * <p/> - * On peut utiliser une activité de ce type uniquement si il n'existe pas déjà - * une telle activité de calée positive et qui n'est pas suivie d'une activité - * de fin de veille. <!-- END SNIPPET: javadoc - * --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class ActivityDebutDePecheSaneDtoValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(ActivityDebutDePecheSaneDtoValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "activityDebutDePecheSane"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - ActivitySeineDto activitySeine = (ActivitySeineDto) object; - - // FIXME migration client-serveur -// if (!activitySeine.isSetOperation()) { -// -// // rien a valider -// return; -// } - - if (activitySeine.getTime() == null) { - - // heure d'obsersation non encore positionne, on ne peut pas valider - return; - } - - // l'activity est une activite de début de pêche - // on doit vérifier qu'il n'existe pas déjà une autre telle - // activité (de caléé positive) qui n'est pas suivi d'une activité - // de fin de pêche - - RouteDto route = (RouteDto) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - boolean valid; - - if (activitySeine.getId() == null) { - - // activity en creation - valid = checkCreateMode(route, activitySeine); - - } else { - - // activity en mise a jour - valid = checkUpdateMode(route, activitySeine); - } - - if (!valid) { - - addError(object); - } - } - - protected boolean checkCreateMode(RouteDto route, ActivitySeineDto activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // recuperation de l'activity de debut de peche juste avant la nouvelle - // activity - // FIXME migration client-serveur -// ActivitySeineDto openSet = -// ActivitySeineDtos.getLastActivityDebutDePechePositiveBefore(route, currentTime); - ActivitySeineDto openSet = null; - - if (openSet == null) { - - // pas de peche positive avant la nouvelle activity - // on autorise donc celle-ci - return true; - } - - // on cherche la fin de pêche associée à l'actitivé retenue - // FIXME migration client-serveur -// ActivitySeineDto closeSet = -// ActivitySeineDtos.getNextActivityFinDePeche(route, openSet); - ActivitySeineDto closeSet = null; - - return closeSet != null && - currentTime.after(closeSet.getTime()); - } - - protected boolean checkUpdateMode(RouteDto route, ActivitySeineDto activitySeine) { - - // on recupere l'activity de fermeture de l'activite de peche - // FIXME migration client-serveur -// ActivitySeineDto closeSet = -// ActivitySeineDtos.getNextActivityFinDePeche(route, activitySeine); - ActivitySeineDto closeSet = null; - - if (closeSet == null) { - // pas d'activity de fin, cela est possible ? - return true; - } - - Date currentTime = activitySeine.getTime(); - - // on doit vérifier que l'heure du debut de set n'est pas apres la fin - return !currentTime.after(closeSet.getTime()); - } - - protected void addError(Object object) { - // la set n'est pas fermee ou bien on veut inserer le debut de peche - // avant la fermeture d'une autre peche ce qui n'est pas possible - String fieldName = getFieldName(); - if (log.isInfoEnabled()) { - log.info("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } -} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDePecheSaneDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDePecheSaneDtoValidator.java deleted file mode 100644 index f83f48f..0000000 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDePecheSaneDtoValidator.java +++ /dev/null @@ -1,242 +0,0 @@ -package fr.ird.observe.validation.validator.dto; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.RouteDto; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Date; - -/** - * <!-- START SNIPPET: javadoc --> ActivityFinDePecheSaneValidator vérifie que - * que l'utilisation d'une activity de fin de pêche est requise ou non. - * <p/> - * On peut utiliser une activité de ce type uniquement si il existe déjà - * une activité de calée positive et sans activity de fin de pêche. - * <!-- END SNIPPET: javadoc --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class ActivityFinDePecheSaneDtoValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(ActivityFinDePecheSaneDtoValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "activityFinDePecheSane"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - ActivitySeineDto activitySeine = (ActivitySeineDto) object; - - // FIXME migration client-serveur -// if (!activitySeine.isActivityFinDePeche()) { -// -// // rien a valider -// return; -// } - - Date currentTime = activitySeine.getTime(); - - if (currentTime == null) { - - // heure d'obsersation non encore positionne, on ne peut pas valider - return; - } - - // l'activity est une activite de début de pêche - // on doit vérifier qu'il n'existe pas déjà une autre telle - // activité (de caléé positive) qui n'est pas suivi d'une activité - // de fin de pêche - - RouteDto route = (RouteDto) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - boolean valid; - - if (activitySeine.getId() == null) { - - // activity en creation - valid = checkCreateMode(route, activitySeine); - - } else { - - // activity en mise a jour - valid = checkUpdateMode(route, activitySeine); - } - - if (!valid) { - - addError(object); - } - - } - - - protected boolean checkCreateMode(RouteDto route, ActivitySeineDto activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // recuperation de l'activity de debut de peche juste avant la nouvelle - // activity - // FIXME migration client-serveur -// ActivitySeineDto openSet = -// ActivitySeineDtos.getLastActivityDebutDePechePositiveBefore(route, currentTime); - ActivitySeineDto openSet = null; - - if (openSet == null) { - - // pas de peche positive avant la nouvelle activity - // pas possible de fermer une peche - return false; - } - - // on cherche la fin de pêche associée à l'actitivé retenue - // FIXME migration client-serveur -// ActivitySeineDto closeSet = ActivitySeineDtos.getNextActivityFinDePeche(route, openSet); - ActivitySeineDto closeSet = null; - - if (closeSet == null) { - - // la set n'est pas fermee, on peut donc ajouter une activity - // de fin de peche - return true; - } - - // la set est deja ferme, on ne peut donc pas creer une activity de - // fin de peche - return false; - } - - protected boolean checkUpdateMode(RouteDto route, ActivitySeineDto activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // on recupere le debut de peche de cette activity de fin de peche - // FIXME migration client-serveur -// ActivitySeineDto openSet = ActivitySeineDtos.getLastActivityDebutDePechePositiveBefore(route, currentTime); - ActivitySeineDto openSet = null; - - if (openSet == null) { - - // la fin de peche ne couvre plus son debut de peche - return false; - } - - if (currentTime.before(openSet.getTime())) { - - // l'activity de fin ne peut pas etre avant le debut de peche - return false; - } - - // on recupere la prochaine activity de peche - // FIXME migration client-serveur -// openSet = ActivitySeineDtos.getNextActivityDebutDePechePositive(route, activitySeine); - - if (openSet == null) { - // pas de set apres cell-ci, donc pas de probleme - return true; - } - - - // il existe une activity de peche apres celle-ci - - if (currentTime.after(openSet.getTime())) { - - // la fin de peche ne couvre plus son debut de peche - return false; - } - - //TODO On doit interdire dans l'éditeur de temps la possibilite - //TODO de saisir une fil de set avant un debut de calee... - return true; - - } - - - protected void addError(Object object) { - // ce qui est requis et ce qui existe n'est pas en adequation - String fieldName = getFieldName(); - if (log.isInfoEnabled()) { - log.info("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } - -} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/RouteActivitysFieldDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/RouteActivitysFieldDtoValidator.java deleted file mode 100644 index f0ca598..0000000 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/RouteActivitysFieldDtoValidator.java +++ /dev/null @@ -1,132 +0,0 @@ -package fr.ird.observe.validation.validator.dto; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.services.dto.seine.RouteDto; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * <!-- START SNIPPET: javadoc --> RouteActivitysFieldValidator vérifie que - * les activtés d'une route sont cohérentes au niveau des activités vessel. - * <p/> - * On vérifie que chaque activté de pêche positive a été fermée. - * <p/> - * <!-- END SNIPPET: javadoc --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class RouteActivitysFieldDtoValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(RouteActivitysFieldDtoValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "routeActivitys"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - // On utilise la route fournie par la pile pour pouvoir la parcourir - // en profondeur (alors que celle offerte par l 'objet est celle de l'ui - // et qu'elle est déconnectée de la base ). - - RouteDto route = (RouteDto) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - if (route.isActivitySeineEmpty()) { - - // aucune activité, donc rien à valider - return; - } - - // récupération des activités de pêche positive sur la route - // FIXME migration client-serveur -// List<ActivitySeineDto> positiveSet = ActivitySeineDtos.getActivityDebutDePechePositive(route); -// -// List<ActivitySeineDto> closedSet = ActivitySeineDtos.getActivityFinDePeche(route); -// -// if (positiveSet.size() < closedSet.size()) { -// -// // il manque une activity de fin de pêche -// String fieldName = getFieldName(); -// if (log.isInfoEnabled()) { -// log.info("missing a activity fin de peche , fieldName : " + fieldName); -// } -// addFieldError(fieldName, object); -// } - } -} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/VesselActivityFieldDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/VesselActivityFieldDtoValidator.java deleted file mode 100644 index 635fa9e..0000000 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/VesselActivityFieldDtoValidator.java +++ /dev/null @@ -1,451 +0,0 @@ -package fr.ird.observe.validation.validator.dto; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.Lists; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.ActivitySeineStubDto; -import fr.ird.observe.services.dto.seine.RouteDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.ArrayList; -import java.util.List; - -/** - * <!-- START SNIPPET: javadoc --> VesselActivityFieldValidator vérifie que - * l'activity vessel d'une activité est cohérente. <!-- END SNIPPET: javadoc - * --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.0 - */ -public class VesselActivityFieldDtoValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(VesselActivityFieldDtoValidator.class); - - private ValueStack stack; - - private String code; - - public void setCode(String code) { - this.code = code; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - if (code == null) { - throw new ValidationException("le parametre code est obligatoire"); - } - - try { - ActivitySeineDto activitySeine = (ActivitySeineDto) object; - if (activitySeine == null) { - if (log.isDebugEnabled()) { - log.debug("pas d'activity!"); - } - // pas d'activity - return; - } -// boolean create = activity.getTopiaId() == null; -// if (!create) { -// // l'activity vessel est uniquement modifiable en mode creation -// return; -// } - - VesselActivitySeineDto property; - property = (VesselActivitySeineDto) getFieldValue(ActivitySeineDto.PROPERTY_VESSEL_ACTIVITY_SEINE, - object); - if (property == null) { - // si pas de valeur, on ne fait rien - if (log.isDebugEnabled()) { - log.debug("pas d'activity vessel!"); - } - return; - } - - boolean valid = true; - - TripSeineDto maree = (TripSeineDto) stack.findValue("tripEntity"); - - if (maree == null) { - - log.warn("COULD NOT FIND DATA CONTEXT! [tripEntity]"); - return; - } - if (log.isDebugEnabled()) { - log.debug("maree : " + maree); - } - RouteDto route = (RouteDto) stack.findValue("routeEntity"); - if (route == null) { - - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - return; - } - if (log.isDebugEnabled()) { - log.debug("route : " + route); - } - - String activityCode = (String) activitySeine.getVesselActivitySeine().getPropertyValue(VesselActivitySeineDto.PROPERTY_CODE); - int nbActivitys = route.sizeActivitySeine(); - - if (code.equals("-16") && !activityCode.equals(ActivitySeineDto.ACTIVITY_FIN_DE_VEILLE)) { - - valid = validate_16(activitySeine, maree, route, nbActivitys, false); - } - - switch (Integer.valueOf(code)) { - case 6: - if (activityCode.equals(ActivitySeineDto.ACTIVITY_FIN_DE_PECHE)) { - valid = validate_6(activitySeine, maree, route, nbActivitys); - } - break; - case 7: - if (activityCode.equals(ActivitySeineDto.ACTIVITY_DEBUT_DE_PECHE)) { - valid = validate_7(activitySeine, maree, route, nbActivitys); - } - break; - case 16: - if (activityCode.equals(ActivitySeineDto.ACTIVITY_FIN_DE_VEILLE)) { - valid = validate_16(activitySeine, maree, route, - nbActivitys, true); - } - break; - } - - - if (!valid) { - String fieldName = getFieldName(); - if (log.isDebugEnabled()) { - log.debug("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } - } catch (ValidationException e) { - throw e; - } catch (Exception e) { - log.error(e.getMessage(), e); - - } - - } - - @Override - public String getValidatorType() { - return "activityvessel"; - } - - /** - * validation de l'activity vessel 6 (debut de peche). - * <p/> - * Pour accepter une activité de début de pêche, on doit vérifier toutes les - * conditions suivantes : - * <p/> - * - si une activité de début de pêches existe sur la route avant cette - * activité, elle doit être fermée. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_6(ActivitySeineDto activitySeine, - TripSeineDto maree, - RouteDto route, - int nbActivitys) { - if (nbActivitys == 0) { - // aucune activity : ok - return true; - } - //FIXME: non l'algo ne fonctionne pas : il faut calculer les intervalles - //FIXME: de set (debut -fin) ou (debut) - //FIXME: si on un intervalle (debut) alors pas possible - //FIXME: sinon on verifier que l'activity qu'on veut créer n'est pas - //FIXME: dans un intervalle (debut-fin) - List<ActivitySeineStubDto> activitySeines = Lists.newArrayList(route.getActivitySeine()); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineDto.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineDto.ACTIVITY_DEBUT_DE_PECHE); - int nbDebutReal = 0; - int lastDebutReal = 0; - for (Integer i : detectDebutSet) { - ActivitySeineStubDto bActivitySeine = activitySeines.get(i); - // FIXME migration client-serveur -// if (bActivitySeine.getReasonForNoFishing() == null -// && bActivitySeine.getSetSeine() != null ) { -// // une senne -// nbDebutReal++; -// lastDebutReal = i; -// } - } - // il n'y a pas d'activity de debut de peche disponible - if (nbDebutReal > detectFinSet.length) { - ActivitySeineStubDto bActivitySeine = activitySeines.get(lastDebutReal); - log.info("il existe deja une activity de peche non fini : " + - bActivitySeine.getTime()); - return false; - } - - // tout est ok - return true; - } - - /** - * validation de l'activity vessel 7 (fin de peche) - * <p/> - * Pour accepter une activité de fin de pêche, on doit vérifier que toutes - * les conditions suivantes sont remplies : - * <p/> - * - une activité de début de pêche (avec coup de senne ?) précède cette - * activité et n'est pas déjà associée à une activité de fin de pêche. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_7(ActivitySeineDto activitySeine, - TripSeineDto maree, - RouteDto route, - int nbActivitys) { - if (nbActivitys == 0) { - // aucune activity : donc pas possible - return false; - } - List<ActivitySeineStubDto> activitySeines = Lists.newArrayList(route.getActivitySeine()); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineDto.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineDto.ACTIVITY_DEBUT_DE_PECHE); - Integer lastFinSet = null; - if (detectFinSet.length > 0) { - lastFinSet = detectFinSet[detectFinSet.length - 1]; - } -// int nbDebutReal = 0; -// Integer lastDebutReal = 0; - Integer lastDebutReal = null; - for (Integer i : detectDebutSet) { - ActivitySeineStubDto bActivitySeine = activitySeines.get(i); - // FIXME migration client-serveur -// if (bActivitySeine.getReasonForNoFishing() == null -// -// && bActivitySeine.getSetSeine() != null ) { -// // une senne -//// nbDebutReal++; -// lastDebutReal = i; -// } - } - if (lastDebutReal == null) { - // pas de set ouverte - log.info("pas d'activity de debut de peche ouverte"); - return false; - } - - // il n'y a pas d'activity de debut de peche disponible - if (lastFinSet != null && lastDebutReal < lastFinSet) { - log.info("pas d'activity de debut de peche disponible"); - return false; - } - - // il existe une set ouverte - ActivitySeineStubDto bActivitySeine = activitySeines.get(lastDebutReal); - - if (bActivitySeine.getTime().after(activitySeine.getTime())) { - log.info("activity de fin " + activitySeine.getTime() + - " doit etre apres celle de debut de peche : " + - bActivitySeine.getTime()); - // pas ok - return false; - } - - // tout est ok - return true; - } - - /** - * validation de l'activity vessel 16 (fin de veille). - * <p/> - * Pour accepter une activité de fin de veille, on doit vérifier toutes les - * conditions suivantes sont remplies : - * <p/> - * <pre> - * - toute activité de début de pêche doit être associée à une activité de - * fin de pêche (sauf si non coup de senne ?). - * - une seule activité de fin par route - * </pre> - * <p/> - * Pour toutes les autres activités (<code>is16 == false</code>), on doit - * vérifier : - * <p/> - * - l'activité est toujours avant une éventuelle activité de fin de - * veille. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @param is16 drapeau pour savoir si on accepte la valeur ou toutes - * les autres valeurs. - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_16(ActivitySeineDto activitySeine, - TripSeineDto maree, - RouteDto route, - int nbActivitys, - boolean is16) { - if (nbActivitys == 0) { - // pas d'autre activity : ok - return true; - } - - if (is16) { - // on est sur une activity de fin de veille - List<ActivitySeineStubDto> activitySeines = Lists.newArrayList(route.getActivitySeine()); - // une seule activity de fin de veille par route - Integer[] detectActivity = detectActivity(route, ActivitySeineDto.ACTIVITY_FIN_DE_VEILLE); - if (activitySeine.getId() == null && detectActivity.length > 0) { - - log.info("il existe deja une activity de fin de veille!"); - return false; - } - - // chemit 2010-05-23 Cela n'est plus d'actualité : On peut avoir une activité après celle de fin de veille - - // l'activity de fin de veille doit toujours etre la plus recente -// Activity lastActivity = route.getLastActivity(); -// if (activity.getTime().before( -// lastActivity.getTime())) { -// // activity pas en derniere position -// log.info("l'activity de fin de veille doit etre la derniere " + -// "activity de la route"); -// -// return false; -// } - // il ne peut pas rester une activity de debut de peche sans fin - // de set (sauf si non coup de senne ?) - Integer[] detectDebutSet = detectActivity(route, ActivitySeineDto.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineDto.ACTIVITY_DEBUT_DE_PECHE); - int nbDebutReal = 0; - for (Integer i : detectDebutSet) { - ActivitySeineStubDto bActivitySeine = activitySeines.get(i); - // FIXME migration client-serveur - // if (bActivitySeine.getReasonForNoFishing() == null - // && bActivitySeine.getSetSeine() != null) { - // // une senne - // nbDebutReal++; - //} - } - if (nbDebutReal > detectFinSet.length) { - log.info("il manque une activity de fin de peche"); - return false; - } - - // tout est ok - return true; - } - - // chemit 2010-05-23 Cela n'est plus d'actualité : On peut avoir une activité après celle de fin de veille - - // on est sur une autre activity que celle de fin de veille, - // elle doit obligatoirement etre avant une eventuelle activity - // de fin de veille - -// List<Activity> activitys = route.getActivity(); -// Integer[] detectActivity = detectActivity(route, 16); -// if (detectActivity.length > 0) { -// Activity activityFinVeille = activites.get(detectActivity[0]); -// if (activity.getTime().after( -// activityFinVeille.getTime())) { -// log.info("activity doit etre avant la fin de veille : " + -// activityFinVeille.getTime()); -// // pas ok -// return false; -// } -// } - - // tout est ok - return true; - } - - /** - * Recupere les positions des activitys d'un certain type - * - * @param route la route à inspecter - * @param code le code du type d'activité à rechercher - * @return les positions des activitys d'un certain type donné - */ - protected Integer[] detectActivity(RouteDto route, String code) { - List<Integer> list = new ArrayList<Integer>(); - int index = 0; - for (ActivitySeineStubDto a : route.getActivitySeine()) { - // FIXME migration client-serveur -// String c = (String) a.getVesselActivitySeine().getPropertyValue(VesselActivitySeineDto.PROPERTY_CODE); -// if (code.equals(c)) { -// list.add(index); -// } - index++; - } - return list.toArray(new Integer[list.size()]); - } -} diff --git a/observe-application-swing/src/main/resources/validators.xml b/observe-application-swing/src/main/resources/validators.xml index f2f63bd..5856328 100644 --- a/observe-application-swing/src/main/resources/validators.xml +++ b/observe-application-swing/src/main/resources/validators.xml @@ -53,7 +53,6 @@ <validator name="fieldexpressionwithparams" class="org.nuiton.validator.xwork2.field.FieldExpressionWithParamsValidator"/> <!-- les validateurs spécifiques à ObServe --> - <validator name="collectionFieldExpression2" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionFieldExpression" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionUniqueKey" class="fr.ird.observe.validation.validator.CollectionUniqueKeyValidator2"/> <validator name="observeCollectionUniqueKey" class="fr.ird.observe.validation.validator.ObserveCollectionUniqueKeyValidator"/> @@ -62,7 +61,6 @@ <!--<validator name="openableEntity" class="fr.ird.observe.business.validation.field.OpenableFieldValidator"/>--> <validator name="species_length" class="fr.ird.observe.validation.validator.entities.SpeciesLengthFieldValidator"/> <validator name="species_weight" class="fr.ird.observe.validation.validator.entities.SpeciesWeightFieldValidator"/> - <validator name="activitybateau" class="fr.ird.observe.validation.validator.entities.VesselActivityFieldValidator"/> <validator name="activitySpeed" class="fr.ird.observe.validation.validator.entities.ActivitySpeedValidator"/> <validator name="activitySimpleSpeed" class="fr.ird.observe.validation.validator.entities.ActivitySimpleSpeedValidator"/> <validator name="activityFinDeVeilleExists" class="fr.ird.observe.validation.validator.entities.ActivityFinDeVeilleExistsValidator"/> @@ -73,7 +71,6 @@ <!--<validator name="openableEntity" class="fr.ird.observe.business.validation.field.OpenableFieldValidator"/>--> <validator name="species_lengthDto" class="fr.ird.observe.validation.validator.dto.SpeciesLengthFieldDtoValidator"/> <validator name="species_weightDto" class="fr.ird.observe.validation.validator.dto.SpeciesWeightFieldDtoValidator"/> - <validator name="activitybateauDto" class="fr.ird.observe.validation.validator.dto.VesselActivityFieldDtoValidator"/> <validator name="activitySpeedDto" class="fr.ird.observe.validation.validator.dto.ActivitySpeedDtoValidator"/> <validator name="activitySimpleSpeedDto" class="fr.ird.observe.validation.validator.dto.ActivitySimpleSpeedDtoValidator"/> <validator name="activityFinDeVeilleExistsDto" class="fr.ird.observe.validation.validator.dto.ActivityFinDeVeilleExistsDtoValidator"/> diff --git a/observe-application-web/src/main/resources/validators.xml b/observe-application-web/src/main/resources/validators.xml index 1f8667a..c75ce35 100644 --- a/observe-application-web/src/main/resources/validators.xml +++ b/observe-application-web/src/main/resources/validators.xml @@ -53,7 +53,6 @@ <validator name="fieldexpressionwithparams" class="org.nuiton.validator.xwork2.field.FieldExpressionWithParamsValidator"/> <!-- les validateurs spécifiques à ObServe --> - <validator name="collectionFieldExpression2" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionFieldExpression" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionUniqueKey" class="fr.ird.observe.validation.validator.CollectionUniqueKeyValidator2"/> <validator name="observeCollectionUniqueKey" class="fr.ird.observe.validation.validator.ObserveCollectionUniqueKeyValidator"/> @@ -62,7 +61,6 @@ <!--<validator name="openableEntity" class="fr.ird.observe.business.validation.field.OpenableFieldValidator"/>--> <validator name="species_length" class="fr.ird.observe.validation.validator.entities.SpeciesLengthFieldValidator"/> <validator name="species_weight" class="fr.ird.observe.validation.validator.entities.SpeciesWeightFieldValidator"/> - <validator name="activitybateau" class="fr.ird.observe.validation.validator.entities.VesselActivityFieldValidator"/> <validator name="activitySpeed" class="fr.ird.observe.validation.validator.entities.ActivitySpeedValidator"/> <validator name="activitySimpleSpeed" class="fr.ird.observe.validation.validator.entities.ActivitySimpleSpeedValidator"/> <validator name="activityFinDeVeilleExists" class="fr.ird.observe.validation.validator.entities.ActivityFinDeVeilleExistsValidator"/> diff --git a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityDebutDePecheSaneValidator.java b/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityDebutDePecheSaneValidator.java deleted file mode 100644 index b0ba32a..0000000 --- a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityDebutDePecheSaneValidator.java +++ /dev/null @@ -1,199 +0,0 @@ -package fr.ird.observe.validation.validator.entities; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.entities.seine.ActivitySeine; -import fr.ird.observe.entities.seine.ActivitySeines; -import fr.ird.observe.entities.seine.Route; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Date; - -/** - * <!-- START SNIPPET: javadoc --> ActivityDebutDePecheSaneValidator vérifie que - * que l'utilisation d'une activity de début de calée est possible. - * <p/> - * On peut utiliser une activité de ce type uniquement si il n'existe pas déjà - * une telle activité de calée positive et qui n'est pas suivie d'une activité - * de fin de veille. <!-- END SNIPPET: javadoc - * --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class ActivityDebutDePecheSaneValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(ActivityDebutDePecheSaneValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "activityDebutDePecheSane"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - ActivitySeine activitySeine = (ActivitySeine) object; - - if (!activitySeine.isSetOperation()) { - - // rien a valider - return; - } - - if (activitySeine.getTime() == null) { - - // heure d'obsersation non encore positionne, on ne peut pas valider - return; - } - - // l'activity est une activite de début de pêche - // on doit vérifier qu'il n'existe pas déjà une autre telle - // activité (de caléé positive) qui n'est pas suivi d'une activité - // de fin de pêche - - Route route = (Route) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - boolean valid; - - if (activitySeine.getTopiaId() == null) { - - // activity en creation - valid = checkCreateMode(route, activitySeine); - - } else { - - // activity en mise a jour - valid = checkUpdateMode(route, activitySeine); - } - - if (!valid) { - - addError(object); - } - } - - protected boolean checkCreateMode(Route route, ActivitySeine activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // recuperation de l'activity de debut de peche juste avant la nouvelle - // activity - ActivitySeine openSet = - ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); - - if (openSet == null) { - - // pas de peche positive avant la nouvelle activity - // on autorise donc celle-ci - return true; - } - - // on cherche la fin de pêche associée à l'actitivé retenue - ActivitySeine closeSet = - ActivitySeines.getNextActivityFinDePeche(route, openSet); - - return closeSet != null && - currentTime.after(closeSet.getTime()); - } - - protected boolean checkUpdateMode(Route route, ActivitySeine activitySeine) { - - // on recupere l'activity de fermeture de l'activite de peche - ActivitySeine closeSet = - ActivitySeines.getNextActivityFinDePeche(route, activitySeine); - - if (closeSet == null) { - // pas d'activity de fin, cela est possible ? - return true; - } - - Date currentTime = activitySeine.getTime(); - - // on doit vérifier que l'heure du debut de set n'est pas apres la fin - return !currentTime.after(closeSet.getTime()); - } - - protected void addError(Object object) { - // la set n'est pas fermee ou bien on veut inserer le debut de peche - // avant la fermeture d'une autre peche ce qui n'est pas possible - String fieldName = getFieldName(); - if (log.isInfoEnabled()) { - log.info("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } -} diff --git a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityFinDePecheSaneValidator.java b/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityFinDePecheSaneValidator.java deleted file mode 100644 index 34e6232..0000000 --- a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/ActivityFinDePecheSaneValidator.java +++ /dev/null @@ -1,237 +0,0 @@ -package fr.ird.observe.validation.validator.entities; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.entities.seine.ActivitySeine; -import fr.ird.observe.entities.seine.ActivitySeines; -import fr.ird.observe.entities.seine.Route; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Date; - -/** - * <!-- START SNIPPET: javadoc --> ActivityFinDePecheSaneValidator vérifie que - * que l'utilisation d'une activity de fin de pêche est requise ou non. - * <p/> - * On peut utiliser une activité de ce type uniquement si il existe déjà - * une activité de calée positive et sans activity de fin de pêche. - * <!-- END SNIPPET: javadoc --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(ActivityFinDePecheSaneValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "activityFinDePecheSane"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - ActivitySeine activitySeine = (ActivitySeine) object; - - if (!activitySeine.isActivityFinDePeche()) { - - // rien a valider - return; - } - - Date currentTime = activitySeine.getTime(); - - if (currentTime == null) { - - // heure d'obsersation non encore positionne, on ne peut pas valider - return; - } - - // l'activity est une activite de début de pêche - // on doit vérifier qu'il n'existe pas déjà une autre telle - // activité (de caléé positive) qui n'est pas suivi d'une activité - // de fin de pêche - - Route route = (Route) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - boolean valid; - - if (activitySeine.getTopiaId() == null) { - - // activity en creation - valid = checkCreateMode(route, activitySeine); - - } else { - - // activity en mise a jour - valid = checkUpdateMode(route, activitySeine); - } - - if (!valid) { - - addError(object); - } - - } - - - protected boolean checkCreateMode(Route route, ActivitySeine activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // recuperation de l'activity de debut de peche juste avant la nouvelle - // activity - ActivitySeine openSet = - ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); - - if (openSet == null) { - - // pas de peche positive avant la nouvelle activity - // pas possible de fermer une peche - return false; - } - - // on cherche la fin de pêche associée à l'actitivé retenue - ActivitySeine closeSet = ActivitySeines.getNextActivityFinDePeche(route, openSet); - - if (closeSet == null) { - - // la set n'est pas fermee, on peut donc ajouter une activity - // de fin de peche - return true; - } - - // la set est deja ferme, on ne peut donc pas creer une activity de - // fin de peche - return false; - } - - protected boolean checkUpdateMode(Route route, ActivitySeine activitySeine) { - - Date currentTime = activitySeine.getTime(); - - // on recupere le debut de peche de cette activity de fin de peche - ActivitySeine openSet = - ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); - - if (openSet == null) { - - // la fin de peche ne couvre plus son debut de peche - return false; - } - - if (currentTime.before(openSet.getTime())) { - - // l'activity de fin ne peut pas etre avant le debut de peche - return false; - } - - // on recupere la prochaine activity de peche - openSet = - ActivitySeines.getNextActivityDebutDePechePositive(route, activitySeine); - - if (openSet == null) { - // pas de set apres cell-ci, donc pas de probleme - return true; - } - - - // il existe une activity de peche apres celle-ci - - if (currentTime.after(openSet.getTime())) { - - // la fin de peche ne couvre plus son debut de peche - return false; - } - - //TODO On doit interdire dans l'éditeur de temps la possibilite - //TODO de saisir une fil de set avant un debut de calee... - return true; - - } - - - protected void addError(Object object) { - // ce qui est requis et ce qui existe n'est pas en adequation - String fieldName = getFieldName(); - if (log.isInfoEnabled()) { - log.info("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } - -} diff --git a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/RouteActivitysFieldValidator.java b/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/RouteActivitysFieldValidator.java deleted file mode 100644 index f530449..0000000 --- a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/RouteActivitysFieldValidator.java +++ /dev/null @@ -1,135 +0,0 @@ -package fr.ird.observe.validation.validator.entities; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.entities.seine.ActivitySeine; -import fr.ird.observe.entities.seine.ActivitySeines; -import fr.ird.observe.entities.seine.Route; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.List; - -/** - * <!-- START SNIPPET: javadoc --> RouteActivitysFieldValidator vérifie que - * les activtés d'une route sont cohérentes au niveau des activités vessel. - * <p/> - * On vérifie que chaque activté de pêche positive a été fermée. - * <p/> - * <!-- END SNIPPET: javadoc --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 - */ -public class RouteActivitysFieldValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(RouteActivitysFieldValidator.class); - - private ValueStack stack; - - @Override - public String getValidatorType() { - return "routeActivitys"; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - - if (object == null) { - - // pas d'objet, donc rien a faire - return; - } - - // On utilise la route fournie par la pile pour pouvoir la parcourir - // en profondeur (alors que celle offerte par l 'objet est celle de l'ui - // et qu'elle est déconnectée de la base ). - - Route route = (Route) stack.findValue("routeEntity"); - if (route == null) { - - if (log.isWarnEnabled()) { - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - } - return; - } - - if (route.isActivitySeineEmpty()) { - - // aucune activité, donc rien à valider - return; - } - - // récupération des activités de pêche positive sur la route - List<ActivitySeine> positiveSet = ActivitySeines.getActivityDebutDePechePositive(route); - - List<ActivitySeine> closedSet = ActivitySeines.getActivityFinDePeche(route); - - if (positiveSet.size() < closedSet.size()) { - - // il manque une activity de fin de pêche - String fieldName = getFieldName(); - if (log.isInfoEnabled()) { - log.info("missing a activity fin de peche , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } - } -} diff --git a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/VesselActivityFieldValidator.java b/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/VesselActivityFieldValidator.java deleted file mode 100644 index a3b389c..0000000 --- a/observe-entities-validation/src/main/java/fr/ird/observe/validation/validator/entities/VesselActivityFieldValidator.java +++ /dev/null @@ -1,446 +0,0 @@ -package fr.ird.observe.validation.validator.entities; - -/* - * #%L - * ObServe :: Validation - * %% - * Copyright (C) 2008 - 2013 IRD, Codelutin, Tony Chemit - * %% - * 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.Lists; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; -import fr.ird.observe.entities.seine.ActivitySeine; -import fr.ird.observe.entities.seine.ActivitySeineImpl; -import fr.ird.observe.entities.seine.Route; -import fr.ird.observe.entities.seine.TripSeine; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.ArrayList; -import java.util.List; - -/** - * <!-- START SNIPPET: javadoc --> VesselActivityFieldValidator vérifie que - * l'activity vessel d'une activité est cohérente. <!-- END SNIPPET: javadoc - * --> - * <p/> - * <p/> - * <!-- START SNIPPET: parameters --> <ul> <li>fieldName - The field name this - * validator is validating. Required if using Plain-Validator Syntax otherwise - * not required</li> </ul> <!-- END SNIPPET: parameters --> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="invalidLochMatin"> - * <param name="fieldName">startLogValue</param> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="startLogValue"> - * <field-validator type="invalidLochMatin"> - * <message>loch matin must be greater or equals to last - * closed route loch soir</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.0 - */ -public class VesselActivityFieldValidator extends FieldValidatorSupport { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(VesselActivityFieldValidator.class); - - private ValueStack stack; - - private String code; - - public void setCode(String code) { - this.code = code; - } - - @Override - public void setValueStack(ValueStack stack) { - this.stack = stack; - super.setValueStack(stack); - } - - @Override - public void validate(Object object) throws ValidationException { - if (code == null) { - throw new ValidationException("le parametre code est obligatoire"); - } - - try { - ActivitySeine activitySeine = (ActivitySeine) object; - if (activitySeine == null) { - if (log.isDebugEnabled()) { - log.debug("pas d'activity!"); - } - // pas d'activity - return; - } -// boolean create = activity.getTopiaId() == null; -// if (!create) { -// // l'activity vessel est uniquement modifiable en mode creation -// return; -// } - - VesselActivitySeine property; - property = (VesselActivitySeine) getFieldValue(ActivitySeine.PROPERTY_VESSEL_ACTIVITY_SEINE, - object); - if (property == null) { - // si pas de valeur, on ne fait rien - if (log.isDebugEnabled()) { - log.debug("pas d'activity vessel!"); - } - return; - } - - boolean valid = true; - - TripSeine maree = (TripSeine) stack.findValue("tripEntity"); - - if (maree == null) { - - log.warn("COULD NOT FIND DATA CONTEXT! [tripEntity]"); - return; - } - if (log.isDebugEnabled()) { - log.debug("maree : " + maree); - } - Route route = (Route) stack.findValue("routeEntity"); - if (route == null) { - - log.warn("COULD NOT FIND DATA CONTEXT! [routeEntity]"); - return; - } - if (log.isDebugEnabled()) { - log.debug("route : " + route); - } - - String activityCode = activitySeine.getVesselActivitySeine().getCode(); - int nbActivitys = route.sizeActivitySeine(); - - if (code.equals("-16") && !activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE)) { - - valid = validate_16(activitySeine, maree, route, nbActivitys, false); - } - - switch (Integer.valueOf(code)) { - case 6: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE)) { - valid = validate_6(activitySeine, maree, route, nbActivitys); - } - break; - case 7: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE)) { - valid = validate_7(activitySeine, maree, route, nbActivitys); - } - break; - case 16: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE)) { - valid = validate_16(activitySeine, maree, route, - nbActivitys, true); - } - break; - } - - - if (!valid) { - String fieldName = getFieldName(); - if (log.isDebugEnabled()) { - log.debug("not valid , fieldName : " + fieldName); - } - addFieldError(fieldName, object); - } - } catch (ValidationException e) { - throw e; - } catch (Exception e) { - log.error(e.getMessage(), e); - - } - - } - - @Override - public String getValidatorType() { - return "activityvessel"; - } - - /** - * validation de l'activity vessel 6 (debut de peche). - * <p/> - * Pour accepter une activité de début de pêche, on doit vérifier toutes les - * conditions suivantes : - * <p/> - * - si une activité de début de pêches existe sur la route avant cette - * activité, elle doit être fermée. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_6(ActivitySeine activitySeine, - TripSeine maree, - Route route, - int nbActivitys) { - if (nbActivitys == 0) { - // aucune activity : ok - return true; - } - //FIXME: non l'algo ne fonctionne pas : il faut calculer les intervalles - //FIXME: de set (debut -fin) ou (debut) - //FIXME: si on un intervalle (debut) alors pas possible - //FIXME: sinon on verifier que l'activity qu'on veut créer n'est pas - //FIXME: dans un intervalle (debut-fin) - List<ActivitySeine> activitySeines = Lists.newArrayList(route.getActivitySeine()); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - int nbDebutReal = 0; - int lastDebutReal = 0; - for (Integer i : detectDebutSet) { - ActivitySeine bActivitySeine = activitySeines.get(i); - if (bActivitySeine.getReasonForNoFishing() == null && - bActivitySeine.getSetSeine() != null) { - // une senne - nbDebutReal++; - lastDebutReal = i; - } - } - // il n'y a pas d'activity de debut de peche disponible - if (nbDebutReal > detectFinSet.length) { - ActivitySeine bActivitySeine = activitySeines.get(lastDebutReal); - log.info("il existe deja une activity de peche non fini : " + - bActivitySeine.getTime()); - return false; - } - - // tout est ok - return true; - } - - /** - * validation de l'activity vessel 7 (fin de peche) - * <p/> - * Pour accepter une activité de fin de pêche, on doit vérifier que toutes - * les conditions suivantes sont remplies : - * <p/> - * - une activité de début de pêche (avec coup de senne ?) précède cette - * activité et n'est pas déjà associée à une activité de fin de pêche. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_7(ActivitySeine activitySeine, - TripSeine maree, - Route route, - int nbActivitys) { - if (nbActivitys == 0) { - // aucune activity : donc pas possible - return false; - } - List<ActivitySeine> activitySeines = Lists.newArrayList(route.getActivitySeine()); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - Integer lastFinSet = null; - if (detectFinSet.length > 0) { - lastFinSet = detectFinSet[detectFinSet.length - 1]; - } -// int nbDebutReal = 0; -// Integer lastDebutReal = 0; - Integer lastDebutReal = null; - for (Integer i : detectDebutSet) { - ActivitySeine bActivitySeine = activitySeines.get(i); - if (bActivitySeine.getReasonForNoFishing() == null && - bActivitySeine.getSetSeine() != null) { - // une senne -// nbDebutReal++; - lastDebutReal = i; - } - } - if (lastDebutReal == null) { - // pas de set ouverte - log.info("pas d'activity de debut de peche ouverte"); - return false; - } - - // il n'y a pas d'activity de debut de peche disponible - if (lastFinSet != null && lastDebutReal < lastFinSet) { - log.info("pas d'activity de debut de peche disponible"); - return false; - } - - // il existe une set ouverte - ActivitySeine bActivitySeine = activitySeines.get(lastDebutReal); - - if (bActivitySeine.getTime().after(activitySeine.getTime())) { - log.info("activity de fin " + activitySeine.getTime() + - " doit etre apres celle de debut de peche : " + - bActivitySeine.getTime()); - // pas ok - return false; - } - - // tout est ok - return true; - } - - /** - * validation de l'activity vessel 16 (fin de veille). - * <p/> - * Pour accepter une activité de fin de veille, on doit vérifier toutes les - * conditions suivantes sont remplies : - * <p/> - * <pre> - * - toute activité de début de pêche doit être associée à une activité de - * fin de pêche (sauf si non coup de senne ?). - * - une seule activité de fin par route - * </pre> - * <p/> - * Pour toutes les autres activités (<code>is16 == false</code>), on doit - * vérifier : - * <p/> - * - l'activité est toujours avant une éventuelle activité de fin de - * veille. - * - * @param activitySeine l'activite en cours de creation - * @param maree la maree courante - * @param route la route courante - * @param nbActivitys le counts d'activités actuellement (sans l'activity a - * tester) - * @param is16 drapeau pour savoir si on accepte la valeur ou toutes - * les autres valeurs. - * @return {@code true} if valid, {@code false} otherwise - */ - protected boolean validate_16(ActivitySeine activitySeine, - TripSeine maree, - Route route, - int nbActivitys, - boolean is16) { - if (nbActivitys == 0) { - // pas d'autre activity : ok - return true; - } - - if (is16) { - // on est sur une activity de fin de veille - List<ActivitySeine> activitySeines = Lists.newArrayList(route.getActivitySeine()); - // une seule activity de fin de veille par route - Integer[] detectActivity = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE); - if (activitySeine.getTopiaId() == null && detectActivity.length > 0) { - - log.info("il existe deja une activity de fin de veille!"); - return false; - } - - // chemit 2010-05-23 Cela n'est plus d'actualité : On peut avoir une activité après celle de fin de veille - - // l'activity de fin de veille doit toujours etre la plus recente -// Activity lastActivity = route.getLastActivity(); -// if (activity.getTime().before( -// lastActivity.getTime())) { -// // activity pas en derniere position -// log.info("l'activity de fin de veille doit etre la derniere " + -// "activity de la route"); -// -// return false; -// } - // il ne peut pas rester une activity de debut de peche sans fin - // de set (sauf si non coup de senne ?) - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - int nbDebutReal = 0; - for (Integer i : detectDebutSet) { - ActivitySeine bActivitySeine = activitySeines.get(i); - if (bActivitySeine.getReasonForNoFishing() == null && - bActivitySeine.getSetSeine() != null) { - // une senne - nbDebutReal++; - } - } - if (nbDebutReal > detectFinSet.length) { - log.info("il manque une activity de fin de peche"); - return false; - } - - // tout est ok - return true; - } - - // chemit 2010-05-23 Cela n'est plus d'actualité : On peut avoir une activité après celle de fin de veille - - // on est sur une autre activity que celle de fin de veille, - // elle doit obligatoirement etre avant une eventuelle activity - // de fin de veille - -// List<Activity> activitys = route.getActivity(); -// Integer[] detectActivity = detectActivity(route, 16); -// if (detectActivity.length > 0) { -// Activity activityFinVeille = activites.get(detectActivity[0]); -// if (activity.getTime().after( -// activityFinVeille.getTime())) { -// log.info("activity doit etre avant la fin de veille : " + -// activityFinVeille.getTime()); -// // pas ok -// return false; -// } -// } - - // tout est ok - return true; - } - - /** - * Recupere les positions des activitys d'un certain type - * - * @param route la route à inspecter - * @param code le code du type d'activité à rechercher - * @return les positions des activitys d'un certain type donné - */ - protected Integer[] detectActivity(Route route, String code) { - List<Integer> list = new ArrayList<Integer>(); - int index = 0; - for (ActivitySeine a : route.getActivitySeine()) { - String c = a.getVesselActivitySeine().getCode(); - if (code.equals(c)) { - list.add(index); - } - index++; - } - return list.toArray(new Integer[list.size()]); - } -} diff --git a/observe-entities-validation/src/test/resources/validators.xml b/observe-entities-validation/src/test/resources/validators.xml index 1f8667a..c75ce35 100644 --- a/observe-entities-validation/src/test/resources/validators.xml +++ b/observe-entities-validation/src/test/resources/validators.xml @@ -53,7 +53,6 @@ <validator name="fieldexpressionwithparams" class="org.nuiton.validator.xwork2.field.FieldExpressionWithParamsValidator"/> <!-- les validateurs spécifiques à ObServe --> - <validator name="collectionFieldExpression2" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionFieldExpression" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionUniqueKey" class="fr.ird.observe.validation.validator.CollectionUniqueKeyValidator2"/> <validator name="observeCollectionUniqueKey" class="fr.ird.observe.validation.validator.ObserveCollectionUniqueKeyValidator"/> @@ -62,7 +61,6 @@ <!--<validator name="openableEntity" class="fr.ird.observe.business.validation.field.OpenableFieldValidator"/>--> <validator name="species_length" class="fr.ird.observe.validation.validator.entities.SpeciesLengthFieldValidator"/> <validator name="species_weight" class="fr.ird.observe.validation.validator.entities.SpeciesWeightFieldValidator"/> - <validator name="activitybateau" class="fr.ird.observe.validation.validator.entities.VesselActivityFieldValidator"/> <validator name="activitySpeed" class="fr.ird.observe.validation.validator.entities.ActivitySpeedValidator"/> <validator name="activitySimpleSpeed" class="fr.ird.observe.validation.validator.entities.ActivitySimpleSpeedValidator"/> <validator name="activityFinDeVeilleExists" class="fr.ird.observe.validation.validator.entities.ActivityFinDeVeilleExistsValidator"/> diff --git a/observe-services-topia/src/test/resources/validators.xml b/observe-services-topia/src/test/resources/validators.xml index 1f8667a..c75ce35 100644 --- a/observe-services-topia/src/test/resources/validators.xml +++ b/observe-services-topia/src/test/resources/validators.xml @@ -53,7 +53,6 @@ <validator name="fieldexpressionwithparams" class="org.nuiton.validator.xwork2.field.FieldExpressionWithParamsValidator"/> <!-- les validateurs spécifiques à ObServe --> - <validator name="collectionFieldExpression2" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionFieldExpression" class="fr.ird.observe.validation.validator.CollectionFieldExpressionValidator2"/> <validator name="collectionUniqueKey" class="fr.ird.observe.validation.validator.CollectionUniqueKeyValidator2"/> <validator name="observeCollectionUniqueKey" class="fr.ird.observe.validation.validator.ObserveCollectionUniqueKeyValidator"/> @@ -62,7 +61,6 @@ <!--<validator name="openableEntity" class="fr.ird.observe.business.validation.field.OpenableFieldValidator"/>--> <validator name="species_length" class="fr.ird.observe.validation.validator.entities.SpeciesLengthFieldValidator"/> <validator name="species_weight" class="fr.ird.observe.validation.validator.entities.SpeciesWeightFieldValidator"/> - <validator name="activitybateau" class="fr.ird.observe.validation.validator.entities.VesselActivityFieldValidator"/> <validator name="activitySpeed" class="fr.ird.observe.validation.validator.entities.ActivitySpeedValidator"/> <validator name="activitySimpleSpeed" class="fr.ird.observe.validation.validator.entities.ActivitySimpleSpeedValidator"/> <validator name="activityFinDeVeilleExists" class="fr.ird.observe.validation.validator.entities.ActivityFinDeVeilleExistsValidator"/> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.