branch develop updated (d87b480 -> 70d655b)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository observe. See http://git.codelutin.com/observe.git from d87b480 Ajout d'une option pour configurer l'adminApiKey qui autorise d'accéder à la configuration new c3a48f1 mise en place du service de validation (refs #7493) new c97b146 ajout du test du service de validation (refs #7493) new 9ff038a Ajout de propertyChange listener sur les entités (See #7493) new 6c724df Implantation du service de validation (See #7493) new 73d72d0 Debut d'intégration des validateurs d'entités (See #7493) new fdaf365 Fix validation test (See #7493) new e3c79cb recupération des différents types de dto new ac1f0ff Renommage de certains objets Simplificiation du détecteur de messages (on n'utilise plus les références sur entités) See #7493 new 70d655b Tout sur develop (mais il reste encore à gerer les traductions des messages) See #7493 Merge branch 'feature/7493' into develop The 9 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 70d655bc69f6aa77de3536ace620ad9b929eb88a Merge: d87b480 ac1f0ff Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 16:16:35 2015 +0200 Tout sur develop (mais il reste encore à gerer les traductions des messages) See #7493 Merge branch 'feature/7493' into develop commit ac1f0ff87befbce5364014fd63069bd4cad29d43 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 14:12:55 2015 +0200 Renommage de certains objets Simplificiation du détecteur de messages (on n'utilise plus les références sur entités) See #7493 commit e3c79cb3860615d478f80a9b3b48272eb0c9e5a9 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 11:13:14 2015 +0200 recupération des différents types de dto commit fdaf365a0e922f92af1cfcfa247d7d6d7628dbf5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 00:42:07 2015 +0200 Fix validation test (See #7493) commit 73d72d003bc2ffa49b6c82d70b7b5e04b10d81b1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 00:14:07 2015 +0200 Debut d'intégration des validateurs d'entités (See #7493) commit 6c724df85fe94cfbcc228c799b0cdf8131e012db Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 23:32:01 2015 +0200 Implantation du service de validation (See #7493) commit 9ff038a87b4a7ff86e87a3edad76b72500fa2a4f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 23:29:21 2015 +0200 Ajout de propertyChange listener sur les entités (See #7493) commit c97b14678bc353ead5e641f7b2bf4091493d545a Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon Aug 31 17:00:53 2015 +0200 ajout du test du service de validation (refs #7493) commit c3a48f1eb9b9b1e122f75eea30377245e272ef46 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon Aug 31 15:54:35 2015 +0200 mise en place du service de validation (refs #7493) Summary of changes: .../ird/observe/entities/seine/ActivitySeines.java | 160 +++++++ .../src/main/xmi/observe-common.properties | 1 + .../src/main/xmi/observe-longline.properties | 1 + .../src/main/xmi/observe-seine.properties | 1 + observe-services-api/pom.xml | 5 + .../actions/validate/ValidateDataRequest.java | 54 +++ .../actions/validate/ValidateDataResult.java | 32 ++ .../validate/ValidateReferentialsRequest.java | 55 +++ .../validate/ValidateReferentialsResult.java | 32 ++ .../actions/validate/ValidateResultForDtoType.java | 28 ++ .../service/actions/validate/ValidateService.java | 25 ++ .../actions/validate/ValidationMessage.java | 45 ++ .../actions/validate/ValidationResultForDto.java | 34 ++ observe-services-topia/pom.xml | 9 + .../ird/observe/services/ObserveServiceTopia.java | 33 ++ .../service/actions/validate/ObserveValidator.java | 166 +++++++ .../actions/validate/ValidateServiceTopia.java | 226 ++++++++++ .../actions/validate/ValidationDataContext.java | 181 ++++++++ .../validate/ValidationMessageDetector.java | 489 +++++++++++++++++++++ .../service/actions/validate}/ValidatorsMap.java | 24 +- .../actions/validate/ValidateServiceTopiaTest.java | 207 +++++++++ observe-validation/pom.xml | 4 +- .../field/ActivityDebutDePecheSaneValidator.java | 9 +- .../field/ActivityFinDePecheSaneValidator.java | 11 +- .../field/ActivityFinDeVeilleExistsValidator.java | 3 +- .../field/ActivitySimpleSpeedValidator.java | 27 +- .../validation/field/ActivitySpeedValidator.java | 30 +- .../validation/field/OpenableFieldValidator.java | 138 ------ .../field/RouteActivitysFieldValidator.java | 7 +- .../field/SetLonglineUniqueHomeIdValidator.java | 14 +- .../field/SetLonglineUniqueNumberValidator.java | 14 +- .../field/VesselActivityFieldValidator.java | 49 ++- .../TripLongline-n1-update-warning-validation.xml | 10 +- .../seine/Route-n1-update-warning-validation.xml | 6 +- .../TripSeine-n1-update-warning-validation.xml | 6 +- .../src/main/resources/validators.xml | 2 +- .../validation/BeanValidatorDetectorTest.java | 4 +- .../field/ActivitySeineSpeedValidatorTest.java | 3 +- .../field/OpenableEntityFieldValidatorTest.java | 82 ---- .../seine/TripSeine-testOpen-error-validation.xml | 32 -- pom.xml | 2 +- 41 files changed, 1903 insertions(+), 358 deletions(-) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateResultForDtoType.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateService.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessage.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationResultForDto.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopia.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationDataContext.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java copy {observe-business/src/main/java/fr/ird/observe/validation => observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate}/ValidatorsMap.java (75%) create mode 100644 observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopiaTest.java delete mode 100644 observe-validation/src/main/java/fr/ird/observe/validation/field/OpenableFieldValidator.java delete mode 100644 observe-validation/src/test/java/fr/ird/observe/validation/field/OpenableEntityFieldValidatorTest.java delete mode 100644 observe-validation/src/test/resources/fr/ird/observe/entities/seine/TripSeine-testOpen-error-validation.xml -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 c3a48f1eb9b9b1e122f75eea30377245e272ef46 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon Aug 31 15:54:35 2015 +0200 mise en place du service de validation (refs #7493) --- .../actions/validation/ValidationMessage.java | 39 ++ .../actions/validation/ValidationRequest.java | 86 ++++ .../actions/validation/ValidationResultForDto.java | 32 ++ .../validation/ValidationResultForDtoType.java | 31 ++ .../actions/validation/ValidationService.java | 12 + .../dto/constants/operation/ValidationContext.java | 20 + .../dto/constants/operation/ValidationScope.java | 12 + observe-services-topia/pom.xml | 4 + .../validation/ValidationMessageDetector.java | 562 +++++++++++++++++++++ .../actions/validation/ValidationServiceTopia.java | 278 ++++++++++ .../service/actions/validation/ValidatorsMap.java | 121 +++++ 11 files changed, 1197 insertions(+) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java new file mode 100644 index 0000000..e131396 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java @@ -0,0 +1,39 @@ +package fr.ird.observe.services.service.actions.validation; + +import fr.ird.observe.services.dto.constants.operation.ValidationScope; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationMessage { + + protected ValidationScope scope; + + protected String fieldName; + + protected String message; + + public ValidationScope getScope() { + return scope; + } + + public void setScope(ValidationScope scope) { + this.scope = scope; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java new file mode 100644 index 0000000..d40e60a --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java @@ -0,0 +1,86 @@ +package fr.ird.observe.services.service.actions.validation; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.ReferenceDto; +import fr.ird.observe.services.dto.constants.operation.ValidationContext; +import fr.ird.observe.services.dto.constants.operation.ValidationScope; +import fr.ird.observe.services.dto.referential.ReferentialDto; + +import java.util.EnumSet; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationRequest { + + protected ObserveDataSourceConfiguration dataSourceConfiguration; + + protected boolean validateReferential; + + protected boolean validateData; + + protected ValidationContext validationContext; + + protected EnumSet<ValidationScope> scopes; + + protected ImmutableSet<ReferenceDto> tripIds; + + protected ImmutableSet<Class<? extends ReferentialDto>> referentialTypes; + + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; + } + + public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { + this.dataSourceConfiguration = dataSourceConfiguration; + } + + public boolean isValidateReferential() { + return validateReferential; + } + + public void setValidateReferential(boolean validateReferential) { + this.validateReferential = validateReferential; + } + + public boolean isValidateData() { + return validateData; + } + + public void setValidateData(boolean validateData) { + this.validateData = validateData; + } + + public ValidationContext getValidationContext() { + return validationContext; + } + + public void setValidationContext(ValidationContext validationContext) { + this.validationContext = validationContext; + } + + public EnumSet<ValidationScope> getScopes() { + return scopes; + } + + public void setScopes(EnumSet<ValidationScope> scopes) { + this.scopes = scopes; + } + + public ImmutableSet<ReferenceDto> getTripIds() { + return tripIds; + } + + public void setTripIds(ImmutableSet<ReferenceDto> tripIds) { + this.tripIds = tripIds; + } + + public ImmutableSet<Class<? extends ReferentialDto>> getReferentialTypes() { + return referentialTypes; + } + + public void setReferentialTypes(ImmutableSet<Class<? extends ReferentialDto>> referentialTypes) { + this.referentialTypes = referentialTypes; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java new file mode 100644 index 0000000..b7efa15 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java @@ -0,0 +1,32 @@ +package fr.ird.observe.services.service.actions.validation; + +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.ReferenceDto; + +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationResultForDto<D extends IdDto> { + + protected ReferenceDto<D> dto; + + protected List<ValidationMessage> messages; + + public ReferenceDto<D> getDto() { + return dto; + } + + public void setDto(ReferenceDto<D> dto) { + this.dto = dto; + } + + public List<ValidationMessage> getMessages() { + return messages; + } + + public void setMessages(List<ValidationMessage> messages) { + this.messages = messages; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java new file mode 100644 index 0000000..cb52411 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java @@ -0,0 +1,31 @@ +package fr.ird.observe.services.service.actions.validation; + +import fr.ird.observe.services.dto.IdDto; + +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationResultForDtoType<D extends IdDto> { + + protected Class<D> DtoType; + + protected List<ValidationResultForDto<D>> validationResultForDtos; + + public Class<D> getDtoType() { + return DtoType; + } + + public void setDtoType(Class<D> dtoType) { + DtoType = dtoType; + } + + public List<ValidationResultForDto<D>> getValidationResultForDtos() { + return validationResultForDtos; + } + + public void setValidationResultForDtos(List<ValidationResultForDto<D>> validationResultForDtos) { + this.validationResultForDtos = validationResultForDtos; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java new file mode 100644 index 0000000..4a9d5df --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java @@ -0,0 +1,12 @@ +package fr.ird.observe.services.service.actions.validation; + +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public interface ValidationService { + + List<ValidationResultForDtoType> validate(ValidationRequest request); + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java new file mode 100644 index 0000000..a463de9 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.dto.constants.operation; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum ValidationContext { + + N1_UPDATE("n1-update"), + N1_CREATE("n1-create"); + + protected String contextName; + + ValidationContext(String contextName) { + this.contextName = contextName; + } + + public String getContextName() { + return contextName; + } +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java new file mode 100644 index 0000000..0eb631e --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java @@ -0,0 +1,12 @@ +package fr.ird.observe.services.dto.constants.operation; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum ValidationScope { + + INFO, + WARNING, + ERROR, + +} diff --git a/observe-services-topia/pom.xml b/observe-services-topia/pom.xml index 53eb6e1..822c29a 100644 --- a/observe-services-topia/pom.xml +++ b/observe-services-topia/pom.xml @@ -78,6 +78,10 @@ <groupId>org.nuiton.i18n</groupId> <artifactId>nuiton-i18n</artifactId> </dependency> + <dependency> + <groupId>org.nuiton</groupId> + <artifactId>nuiton-validator</artifactId> + </dependency> <!-- persistence --> <!--dependency> diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java new file mode 100644 index 0000000..3b9b37b --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java @@ -0,0 +1,562 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 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% + */ +package fr.ird.observe.services.service.actions.validation; + +import fr.ird.observe.ObserveEntityEnum; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.seine.TripSeine; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityVisitor; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.util.TopiaEntityRef; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorMessage; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * Le detecteur de messages de validation. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.3 + */ +public class ValidationMessageDetector implements TopiaEntityVisitor, + SimpleBeanValidatorListener { + + /** Logger */ + private static final Log log = + LogFactory.getLog(ValidationMessageDetector.class); + + public static final String SEPARATOR = "/"; + + /** le path courant depuis le depart */ + protected Deque<TopiaEntity> path; + + /** le dictionnaire des paths d'entites detectees */ + protected SortedMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> refs; + + protected StringBuilder accessorExpression; + + protected TopiaEntity root; + + protected TopiaEntityRef currentRef; + + protected Set<TopiaEntity> explored; + + /** le dictionnaire des validateurs utilisables */ + protected final ValidatorsMap validators; + + protected ValidationContext context; + + public ValidationContext getContext() { + return context; + } + + public void setContext(ValidationContext context) { + this.context = context; + } + + public ValidationMessageDetector(ValidatorsMap validators) { + this.validators = validators; + path = new LinkedList<TopiaEntity>(); + explored = new HashSet<TopiaEntity>(); + refs = new TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>>(); + accessorExpression = new StringBuilder(); + for (SimpleBeanValidator<?> v : validators.values()) { + v.setBean(null); + } + } + + public void detectMessages(TopiaEntity... entities) { +// try { + // on reinitialise tous les validateurs +// for (BeanValidator<?> v : validators.values()) { +// v.setBean(null); +//// v.setContextName(contextName); +// } + for (TopiaEntity e : entities) { + if (log.isDebugEnabled()) { + log.debug("start for entity " + e.getTopiaId()); + } + // détection sur l'entité e + try { + e.accept(this); + } catch (TopiaException e1) { + throw new RuntimeException("could not vist entity " + e.getTopiaId(), e1); + } + } + } + + @Override + public void start(TopiaEntity e) { + if (root == null) { + // start come in start method since + // last clear method invocation + root = e; + addPath(e, "$root", -1); + } + explored.add(e); + SimpleBeanValidator<TopiaEntity> validator = getValidator(e); + if (log.isDebugEnabled()) { + log.debug("with entity " + e.getTopiaId() + " : " + accessorExpression); + } + if (validator != null) { + validator.addSimpleBeanValidatorListener(this); + addEntityInContext(e); + try { + currentRef = new TopiaEntityRef( + root, + e, + accessorExpression.toString(), + path.toArray(new TopiaEntity[path.size()])); + validator.setBean(e); + } finally { + validator.removeSimpleBeanValidatorListener(this); + validator.setBean(null); + } + } + } + + @Override + public void end(TopiaEntity e) { + if (root != null && root.equals(e)) { + // global visit is done + root = null; + removePath(); + } + removeEntityFromContext(e); + } + + private void addEntityInContext(TopiaEntity e) { + + DataContext context = getContext().getDataContext(); + + ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); + switch (anEnum) { + case Route: + context.setSelectedRouteId(e.getTopiaId()); + break; + case TripSeine: { + context.setSelectedTripId(e.getTopiaId()); + Program program = ((TripSeine) e).getProgram(); + if (program != null) { + context.setSelectedProgramId(program.getTopiaId()); + } else { + context.setSelectedProgramId(null); + } + } + break; + case ActivitySeine: + context.setSelectedActivityId(e.getTopiaId()); + break; + case SetSeine: + context.setSelectedSetId(e.getTopiaId()); + break; + case TripLongline: { + context.setSelectedTripId(e.getTopiaId()); + Program program = ((TripLongline) e).getProgram(); + if (program != null) { + context.setSelectedProgramId(program.getTopiaId()); + } else { + context.setSelectedProgramId(null); + } + } + break; + case ActivityLongline: + context.setSelectedActivityId(e.getTopiaId()); + break; + case SetLongline: + context.setSelectedSetId(e.getTopiaId()); + break; + case FloatingObject: + context.setSelectedFloatingObjectId(e.getTopiaId()); + break; + case NonTargetLength: + break; + case TargetLength: + break; + case TransmittingBuoy: + break; + case NonTargetCatch: + break; + case TargetCatch: + break; + case NonTargetSample: + break; + case TargetSample: + break; + case ObjectObservedSpecies: + break; + case SchoolEstimate: + break; + case ObjectSchoolEstimate: + break; + case VesselActivitySeine: + break; + case SurroundingActivity: + break; + case Vessel: + break; + case VesselSizeCategory: + break; + case WeightCategory: + break; + case ReasonForNullSet: + break; + case ReasonForNoFishing: + break; + case SpeciesFate: + break; + case ObjectFate: + break; + case Species: + break; + case SpeciesGroup: + break; + case DetectionMode: + break; + case Person: + break; + case Ocean: + break; + case TransmittingBuoyOperation: + break; + case ObjectOperation: + break; + case Organism: + break; + case LengthWeightParameter: + break; + case Country: + break; + case Program: + break; + case ReasonForDiscard: + break; + case SpeciesStatus: + break; + case ObservedSystem: + break; + case TransmittingBuoyType: + break; + case VesselType: + break; + case ObjectType: + break; + case Wind: + break; + } + } + + private void removeEntityFromContext(TopiaEntity e) { + + DataContext context = getContext().getDataContext(); + + ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); + switch (anEnum) { + case Route: + context.setSelectedRouteId(null); + break; + case TripSeine: + context.setSelectedTripId(null); + context.setSelectedProgramId(null); + break; + case ActivitySeine: + context.setSelectedActivityId(null); + break; + case SetSeine: + context.setSelectedSetId(null); + break; + case TripLongline: + context.setSelectedTripId(null); + context.setSelectedProgramId(null); + break; + case ActivityLongline: + context.setSelectedActivityId(null); + break; + case SetLongline: + context.setSelectedSetId(null); + break; + case FloatingObject: + context.setSelectedFloatingObjectId(null); + break; + case NonTargetLength: + break; + case TargetLength: + break; + case TransmittingBuoy: + break; + case NonTargetCatch: + break; + case TargetCatch: + break; + case NonTargetSample: + break; + case TargetSample: + break; + case ObjectObservedSpecies: + break; + case SchoolEstimate: + break; + case ObjectSchoolEstimate: + break; + case VesselActivitySeine: + break; + case SurroundingActivity: + break; + case Vessel: + break; + case VesselSizeCategory: + break; + case WeightCategory: + break; + case ReasonForNullSet: + break; + case ReasonForNoFishing: + break; + case SpeciesFate: + break; + case ObjectFate: + break; + case Species: + break; + case SpeciesGroup: + break; + case DetectionMode: + break; + case Person: + break; + case Ocean: + break; + case TransmittingBuoyOperation: + break; + case ObjectOperation: + break; + case Organism: + break; + case LengthWeightParameter: + break; + case Country: + break; + case Program: + break; + case ReasonForDiscard: + break; + case SpeciesStatus: + break; + case ObservedSystem: + break; + case TransmittingBuoyType: + break; + case VesselType: + break; + case ObjectType: + break; + case Wind: + break; + } + } + + @Override + public void visit(TopiaEntity e, + String name, + Class<?> type, + Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1, name, -1); + try { + try { + e1.accept(this); + } catch (TopiaException ex) { + if (log.isErrorEnabled()) { + log.error(ex.getMessage(), ex); + } + } + } finally { + removePath(); + } + } + } + + @Override + public void visit(TopiaEntity e, + String name, + Class<?> collectionType, + Class<?> type, + int index, + Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1, name, index); + try { + try { + e1.accept(this); + } catch (TopiaException ex) { + if (log.isErrorEnabled()) { + log.error(ex.getMessage(), ex); + } + } + } finally { + removePath(); + } + } + } + + @Override + public void visit(TopiaEntity e, + String name, + Class<?> collectionType, + Class<?> type, + Object value) { + Collection<?> cValue = (Collection<?>) value; + if (TopiaEntity.class.isAssignableFrom(type) && + cValue != null && !cValue.isEmpty()) { + int i = 0; + for (Object currentValue : cValue) { + visit(e, name, collectionType, type, i++, currentValue); + } + } + } + + public SortedMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> getRefs() { + // on renvoie toujours une copie + // pour pouvoir au plus tôt nettoyer le detecteur + TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> result; + result = new TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>>(refs); + return result; + } + + + + @Override + public void clear() { + path.clear(); + refs.clear(); + root = null; + explored.clear(); + accessorExpression.setLength(0); + } + + protected TopiaEntity getTopiaValue(Object value) { + TopiaEntity topiaEntity = (TopiaEntity) (value != null && + value instanceof TopiaEntity ? value : null); + if (topiaEntity != null && explored.contains(topiaEntity)) { + // entite deja visitee + topiaEntity = null; + } + return topiaEntity; + } + + protected <T extends TopiaEntity> SimpleBeanValidator<T> getValidator(T e) { + Class<T> contractClass; + contractClass = (Class<T>) ObserveEntityEnum.getContractClass(e.getClass()); + return validators.getValidator(contractClass); + } + + protected void addPath(TopiaEntity e, String name, int index) { + path.add(e); + if (accessorExpression.length() > 0) { + accessorExpression.append(SEPARATOR); + } + accessorExpression.append(name); + if (index > -1) { + accessorExpression.append("[@topiaId=\""); + accessorExpression.append(e.getTopiaId()); + accessorExpression.append("\"]"); + } + if (log.isTraceEnabled()) { + log.trace("add to stack : " + e.getTopiaId() + ", new size : " + + path.size() + ", path : " + accessorExpression); + } + } + + protected void removePath() { + TopiaEntity e = path.removeLast(); + if (path.isEmpty()) { + accessorExpression.setLength(0); + } else { + int index = accessorExpression.lastIndexOf(SEPARATOR); + if (index > -1) { + accessorExpression.delete(index, + accessorExpression.length()); + } + } + if (log.isTraceEnabled()) { + log.trace("remove from stack : " + e.getTopiaId() + + ", new size : " + path.size() + ", path : " + + accessorExpression); + } + } + + @Override + public void onFieldChanged(SimpleBeanValidatorEvent event) { + SimpleBeanValidator<?> validator = event.getSource(); + + // on ne traite que les messages a ajouter + String[] messagesToAdd = event.getMessagesToAdd(); + + if (messagesToAdd == null || messagesToAdd.length == 0) { + return; + } + + if (log.isDebugEnabled()) { + log.debug("will add " + Arrays.toString(messagesToAdd) + + " for " + currentRef.getAccessorExpression()); + } + List<SimpleBeanValidatorMessage<?>> list = refs.get(currentRef); + if (list == null) { + // first time for this entity + list = new ArrayList<SimpleBeanValidatorMessage<?>>(); + refs.put(currentRef, list); + } + for (String m : messagesToAdd) { + SimpleBeanValidatorMessage<?> message; + message = new SimpleBeanValidatorMessage( + validator, + event.getField(), + m, + event.getScope()); + if (log.isDebugEnabled()) { + log.debug("add message " + message); + } + list.add(message); + } + } + + + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java new file mode 100644 index 0000000..e6dc863 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java @@ -0,0 +1,278 @@ +package fr.ird.observe.services.service.actions.validation; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ird.observe.ObserveEntityEnum; +import fr.ird.observe.entities.Entities; +import fr.ird.observe.entities.Trip; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.ReferenceDto; +import fr.ird.observe.services.dto.constants.operation.ValidationContext; +import fr.ird.observe.services.dto.constants.operation.ValidationScope; +import fr.ird.observe.services.dto.longline.TripLonglineDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.util.TopiaEntityRef; +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorMessage; + +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationServiceTopia extends ObserveServiceTopia implements ValidationService { + + private static final Log log = LogFactory.getLog(ValidationServiceTopia.class); + + @Override + public List<ValidationResultForDtoType> validate(ValidationRequest request) { + + ValidatorsMap validators = getValidators(request); + + ValidationMessageDetector detector = + new ValidationMessageDetector(validators); + + if (request.isValidateReferential()) { + + validateReferential(request, detector); + + } + + if (request.isValidateData()) { + + validateData(request, detector); + + } + + + List<ValidationResultForDtoType> validationResults = getValidationResults(detector); + + return validationResults; + } + + protected ValidatorsMap getValidators(ValidationRequest request) { + + Set<ObserveEntityEnum> beanTypes = Sets.newLinkedHashSet(); + + if (request.isValidateReferential()) { + beanTypes.addAll(Entities.REFERENCE_ENTITIES_LIST); + } + + if (request.isValidateData()) { + beanTypes.addAll(Entities.DATA_ENTITIES_LIST); + } + + ValidatorsMap validators = getValidators( + request.getValidationContext(), + request.getScopes(), + beanTypes); + + return validators; + + + } + + + protected void validateReferential(ValidationRequest request, ValidationMessageDetector detector) { + + for (Class<? extends ReferentialDto> referentialDtoType : request.getReferentialTypes()) { + + Class<TopiaEntity> referentialType = getEntityType(referentialDtoType); + + // on recupere la liste des ids a valider +// String entityLabel = t(DecoratorService.getEntityLabel(klass)); +// sendMessage(t("observe.message.validation.start.referentiel", entityLabel, ids.size())); + for (TopiaEntity entity : loadEntities(referentialType)) { + + detector.detectMessages(entity); + } + } + + + } + + protected void validateData(ValidationRequest request, ValidationMessageDetector detector) { + + for (ReferenceDto referenceDto : request.getTripIds()) { + + Trip trip = null; + + if (referenceDto.getType().isAssignableFrom(TripSeineDto.class)) { + + trip = loadEntity(TripSeineDto.class, TripSeine.class, referenceDto.getId()); + + } else if (referenceDto.getType().isAssignableFrom(TripLonglineDto.class)) { + + trip = loadEntity(TripLonglineDto.class, TripLongline.class, referenceDto.getId()); + + } + + if (trip != null) { + + Program program = trip.getProgram(); + + //messager.sendMessage(t("observe.message.validation.start.maree", decorateEntity(trip), decorateEntity(program))); + + detector.detectMessages(trip); + } + + + } + + + } + + /** + * Obtenir le validateur d'un type objet + * + * @param context le lastName du context de validation + * @param scopes les scopes autorisés + * @param klass type de l'objet à valider + * @param <B> type de l'objet à valider + * @return le validateur trouvé ou {@code null} + */ + public <B extends TopiaEntity> SimpleBeanValidator<B> getValidator( + ValidationContext context, + EnumSet<ValidationScope> scopes, + Class<B> klass) { + + Iterable<NuitonValidatorScope> nuitonScopes = Iterables.transform(scopes, new Function<ValidationScope, NuitonValidatorScope>() { + @Override + public NuitonValidatorScope apply(ValidationScope validationScope) { + return NuitonValidatorScope.valueOf(validationScope.name()); + } + }); + + + SimpleBeanValidator<B> valitator = SimpleBeanValidator.newValidator( + klass, + context.getContextName(), + Iterables.toArray(nuitonScopes, NuitonValidatorScope.class)); + + Set<NuitonValidatorScope> resultScopes = valitator.getEffectiveScopes(); + if (resultScopes.isEmpty()) { + valitator = null; + if (log.isDebugEnabled()) { + log.debug(klass + " : validator skip (no scopes detected)"); + } + } else { + if (log.isDebugEnabled()) { + log.debug(klass + " : keep validator " + valitator); + } + } + return valitator; + } + + /** + * Obtenir le dictionnaire des validateurs pour les types d'entités donnés. + * + * @param context le context de validation + * @param scopes les scopes autorisés + * @param beanTypes types des entités + * @return le dictionnaire des validateurs par type d'entité. + */ + public ValidatorsMap getValidators( + ValidationContext context, + EnumSet<ValidationScope> scopes, + Set<ObserveEntityEnum> beanTypes) { + + ValidatorsMap result = new ValidatorsMap(); + + for (ObserveEntityEnum type : beanTypes) { + // on cherche le validateur + SimpleBeanValidator validator = getValidator(context, scopes, type.getContract()); + if (validator != null) { + // on enregistre le validateur + result.put(type.getContract(), validator); + } + } + return result; + + + } + + public List<ValidationResultForDtoType> getValidationResults(ValidationMessageDetector detector) { + + Map<Class<? extends IdDto>, List<ValidationResultForDto>> validationResultsByDtoType = Maps.newHashMap(); + + for (Map.Entry<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> entry : detector.getRefs().entrySet()) { + + TopiaEntity entity = entry.getKey().getRef(); + + Class<? extends TopiaEntity> entityClass = ObserveEntityEnum.getContractClass(entity.getClass()); + + Class<IdDto> dtoType = getDtoType(entityClass); + + List<ValidationResultForDto> messageForDtos = validationResultsByDtoType.get(dtoType); + + if (messageForDtos == null) { + + messageForDtos = Lists.newLinkedList(); + + validationResultsByDtoType.put(dtoType, messageForDtos); + + } + + ReferenceDto reference = entityToReferenceDto(dtoType, entity); + + ValidationResultForDto messageForDto = new ValidationResultForDto(); + + messageForDto.setDto(reference); + + List<ValidationMessage> messages = Lists.newLinkedList(); + + for (SimpleBeanValidatorMessage beanValidatorMessage : entry.getValue()) { + + ValidationMessage message = new ValidationMessage(); + + message.setScope(ValidationScope.valueOf(beanValidatorMessage.getScope().name())); + + message.setFieldName(beanValidatorMessage.getField()); + + message.setMessage(beanValidatorMessage.getMessage()); + + messages.add(message); + + } + + messageForDto.setMessages(messages); + + messageForDtos.add(messageForDto); + + } + + List<ValidationResultForDtoType> validationResults = Lists.newLinkedList(); + + for (Map.Entry<Class<? extends IdDto>, List<ValidationResultForDto>> entry : validationResultsByDtoType.entrySet()) { + + ValidationResultForDtoType messageForDtoType = new ValidationResultForDtoType(); + + messageForDtoType.setDtoType(entry.getKey()); + + messageForDtoType.setValidationResultForDtos(entry.getValue()); + + validationResults.add(messageForDtoType); + + } + + return validationResults; + + } + + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java new file mode 100644 index 0000000..e6fb418 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java @@ -0,0 +1,121 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 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% + */ +package fr.ird.observe.services.service.actions.validation; + +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; + +import java.util.Collection; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Un dictionnaire de validateurs ordonnees par le type de leur bean. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.1 + */ +public class ValidatorsMap implements Map<Class<?>, SimpleBeanValidator<?>> { + + protected final Map<Class<?>, SimpleBeanValidator<?>> delegate; + + public ValidatorsMap() { + delegate = new HashMap<Class<?>, SimpleBeanValidator<?>>(); + } + + public NuitonValidatorScope[] getScopes() { + EnumSet<NuitonValidatorScope> result = + EnumSet.noneOf(NuitonValidatorScope.class); + for (SimpleBeanValidator<?> b : values()) { + result.addAll(b.getScopes()); + } + return result.toArray(new NuitonValidatorScope[result.size()]); + } + + public <X> SimpleBeanValidator<X> getValidator(Class<X> klass) { + SimpleBeanValidator<X> beanValidator = (SimpleBeanValidator<X>) get(klass); + return beanValidator; + } + + @Override + public int size() { + return delegate.size(); + } + + @Override + public boolean isEmpty() { + return delegate.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return delegate.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return delegate.containsValue(value); + } + + @Override + public SimpleBeanValidator<?> get(Object key) { + return delegate.get(key); + } + + @Override + public SimpleBeanValidator<?> put(Class<?> key, SimpleBeanValidator<?> value) { + return delegate.put(key, value); + } + + @Override + public SimpleBeanValidator<?> remove(Object key) { + return delegate.remove(key); + } + + @Override + public void putAll(Map<? extends Class<?>, ? extends SimpleBeanValidator<?>> m) { + delegate.putAll(m); + } + + @Override + public void clear() { + delegate.clear(); + } + + @Override + public Set<Class<?>> keySet() { + return delegate.keySet(); + } + + @Override + public Collection<SimpleBeanValidator<?>> values() { + return delegate.values(); + } + + @Override + public Set<Entry<Class<?>, SimpleBeanValidator<?>>> entrySet() { + return delegate.entrySet(); + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 c97b14678bc353ead5e641f7b2bf4091493d545a Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon Aug 31 17:00:53 2015 +0200 ajout du test du service de validation (refs #7493) --- .../actions/validation/ValidationRequest.java | 7 +- .../actions/validation/ValidationService.java | 4 +- .../validation/ValidationServiceTopiaTest.java | 107 +++++++++++++++++++++ 3 files changed, 113 insertions(+), 5 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java index d40e60a..7699bcf 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java @@ -2,7 +2,6 @@ package fr.ird.observe.services.service.actions.validation; import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.constants.operation.ValidationContext; import fr.ird.observe.services.dto.constants.operation.ValidationScope; import fr.ird.observe.services.dto.referential.ReferentialDto; @@ -24,7 +23,7 @@ public class ValidationRequest { protected EnumSet<ValidationScope> scopes; - protected ImmutableSet<ReferenceDto> tripIds; + protected ImmutableSet<String> tripIds; protected ImmutableSet<Class<? extends ReferentialDto>> referentialTypes; @@ -68,11 +67,11 @@ public class ValidationRequest { this.scopes = scopes; } - public ImmutableSet<ReferenceDto> getTripIds() { + public ImmutableSet<String> getTripIds() { return tripIds; } - public void setTripIds(ImmutableSet<ReferenceDto> tripIds) { + public void setTripIds(ImmutableSet<String> tripIds) { this.tripIds = tripIds; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java index 4a9d5df..bd196a3 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java @@ -1,11 +1,13 @@ package fr.ird.observe.services.service.actions.validation; +import fr.ird.observe.services.ObserveService; + import java.util.List; /** * @author Sylvain Bavencoff - bavencoff@codelutin.com */ -public interface ValidationService { +public interface ValidationService extends ObserveService { List<ValidationResultForDtoType> validate(ValidationRequest request); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java new file mode 100644 index 0000000..6d21d51 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java @@ -0,0 +1,107 @@ +package fr.ird.observe.services.service.actions.validation; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.constants.operation.ValidationContext; +import fr.ird.observe.services.dto.constants.operation.ValidationScope; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.seine.ActivitySeineDto; +import fr.ird.observe.services.dto.seine.FloatingObjectDto; +import fr.ird.observe.services.dto.seine.RouteDto; +import fr.ird.observe.services.dto.seine.SetSeineDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; +import fr.ird.observe.services.service.AbstractServiceTopiaTest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationServiceTopiaTest extends AbstractServiceTopiaTest { + + protected ValidationService service; + + @Override + public Set<String> getTestNamesChangeDataBase() { + return ImmutableSet.of("testConsolidateTripSeines"); + } + + @Override + public String getScriptName() { + return "dataForTestSeine"; + } + + @Override + public void setUp() throws Exception { + super.setUp(); + service = newService(ValidationService.class); + } + + @Test + public void testConsolidateTripSeines() throws Exception { + + ValidationRequest request = new ValidationRequest(); + + ObserveDataSourceConfiguration dataSourceConfiguration = applicationContextResource.createDataSourceConfigurationH2(ValidationServiceTopiaTest.class, "localdb"); + + request.setDataSourceConfiguration(dataSourceConfiguration); + + request.setValidateData(true); + request.setValidateReferential(false); + request.setValidationContext(ValidationContext.N1_CREATE); + request.setScopes(EnumSet.allOf(ValidationScope.class)); + request.setTripIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); + request.setReferentialTypes(ImmutableSet.<Class<? extends ReferentialDto>>of()); + + List<ValidationResultForDtoType> validationResults = service.validate(request); + + Assert.assertNotNull(validationResults); + Assert.assertEquals(5, validationResults.size()); + + Assert.assertEquals(ActivitySeineDto.class, validationResults.get(0).getDtoType()); + Assert.assertEquals(SetSeineDto.class, validationResults.get(1).getDtoType()); + Assert.assertEquals(TripSeineDto.class, validationResults.get(2).getDtoType()); + Assert.assertEquals(FloatingObjectDto.class, validationResults.get(3).getDtoType()); + Assert.assertEquals(RouteDto.class, validationResults.get(4).getDtoType()); + + ValidationResultForDtoType tripValidationResult = validationResults.get(2); + + List<ValidationResultForDto> validationResultForDtos = tripValidationResult.getValidationResultForDtos(); + Assert.assertNotNull(validationResultForDtos); + Assert.assertEquals(2, validationResultForDtos.size()); + Assert.assertEquals(TRIP_SEINE_ID_1, validationResultForDtos.get(0).getDto().getId()); + Assert.assertEquals(TRIP_SEINE_ID_2, validationResultForDtos.get(1).getDto().getId()); + + List<ValidationMessage> messages = validationResultForDtos.get(0).getMessages(); + + Assert.assertNotNull(messages); + Assert.assertEquals(5, messages.size()); + + Assert.assertEquals(ValidationScope.ERROR, messages.get(0).getScope()); + Assert.assertEquals("Port de départ", messages.get(0).getFieldName()); + Assert.assertEquals("La sélection d'un port de départ est obligatoire.", messages.get(0).getMessage()); + + Assert.assertEquals(ValidationScope.ERROR, messages.get(1).getScope()); + Assert.assertEquals("Bateau", messages.get(1).getFieldName()); + Assert.assertEquals("Le bateau sélectionné est désactivé.", messages.get(1).getMessage()); + + Assert.assertEquals(ValidationScope.WARNING, messages.get(2).getScope()); + Assert.assertEquals("Capitaine", messages.get(2).getFieldName()); + Assert.assertEquals("Pas de capitaine sélectionné.", messages.get(2).getMessage()); + + Assert.assertEquals(ValidationScope.WARNING, messages.get(3).getScope()); + Assert.assertEquals("Saisisseur", messages.get(3).getFieldName()); + Assert.assertEquals("Pas de saisisseur sélectionné.", messages.get(3).getMessage()); + + Assert.assertEquals(ValidationScope.WARNING, messages.get(4).getScope()); + Assert.assertEquals("Port d'arrivée", messages.get(4).getFieldName()); + Assert.assertEquals("Pas de port d'arrivé sélectionné.", messages.get(4).getMessage()); + + + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 9ff038a87b4a7ff86e87a3edad76b72500fa2a4f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 23:29:21 2015 +0200 Ajout de propertyChange listener sur les entités (See #7493) --- observe-entities/src/main/xmi/observe-common.properties | 1 + observe-entities/src/main/xmi/observe-longline.properties | 1 + observe-entities/src/main/xmi/observe-seine.properties | 1 + 3 files changed, 3 insertions(+) diff --git a/observe-entities/src/main/xmi/observe-common.properties b/observe-entities/src/main/xmi/observe-common.properties index 8d226e9..a59d1d4 100644 --- a/observe-entities/src/main/xmi/observe-common.properties +++ b/observe-entities/src/main/xmi/observe-common.properties @@ -22,6 +22,7 @@ model.tagvalue.version=5.0 model.tagvalue.notGenerateToString=true model.tagvalue.generateForeignKeyNames=true +model.tagvalue.generatePropertyChangeSupport =true model.tagvalue.indexForeignKeys=true model.tagvalue.attributeType.String=java.lang.String model.tagvalue.attributeType.Float=java.lang.Float diff --git a/observe-entities/src/main/xmi/observe-longline.properties b/observe-entities/src/main/xmi/observe-longline.properties index 0c551f7..64a0d53 100644 --- a/observe-entities/src/main/xmi/observe-longline.properties +++ b/observe-entities/src/main/xmi/observe-longline.properties @@ -23,6 +23,7 @@ model.tagvalue.version=5.0 model.tagvalue.notGenerateToString=true model.tagvalue.generateOperatorForDAOHelper=true model.tagvalue.generateForeignKeyNames=true +model.tagvalue.generatePropertyChangeSupport =true ############################################################################### ### Schema #################################################################### diff --git a/observe-entities/src/main/xmi/observe-seine.properties b/observe-entities/src/main/xmi/observe-seine.properties index 58bc710..3d6b241 100644 --- a/observe-entities/src/main/xmi/observe-seine.properties +++ b/observe-entities/src/main/xmi/observe-seine.properties @@ -23,6 +23,7 @@ model.tagvalue.version=5.0 model.tagvalue.notGenerateToString=true model.tagvalue.generateOperatorForDAOHelper=true model.tagvalue.generateForeignKeyNames=true +model.tagvalue.generatePropertyChangeSupport =true ############################################################################### ### Schema #################################################################### -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 6c724df85fe94cfbcc228c799b0cdf8131e012db Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 23:32:01 2015 +0200 Implantation du service de validation (See #7493) --- observe-services-api/pom.xml | 5 + .../actions/validate/ValidateDataRequest.java | 66 ++++ .../actions/validate/ValidateDataResult.java | 40 +++ .../validate/ValidateReferentialsRequest.java | 68 ++++ .../validate/ValidateReferentialsResult.java | 40 +++ .../actions/validate/ValidateResultForDtoType.java | 28 ++ .../actions/validate/ValidationMessage.java | 45 +++ .../actions/validate/ValidationResultForDto.java | 34 ++ .../actions/validate/ValidationService.java | 14 + .../actions/validation/ValidationMessage.java | 39 --- .../actions/validation/ValidationRequest.java | 85 ----- .../actions/validation/ValidationResultForDto.java | 32 -- .../validation/ValidationResultForDtoType.java | 31 -- .../actions/validation/ValidationService.java | 14 - .../dto/constants/operation/ValidationContext.java | 20 -- .../dto/constants/operation/ValidationScope.java | 12 - .../service/actions/validate/ObserveValidator.java | 166 +++++++++ .../actions/validate/ValidationContext.java | 181 ++++++++++ .../ValidationMessageDetector.java | 371 +++++++++------------ .../actions/validate/ValidationServiceTopia.java | 221 ++++++++++++ .../{validation => validate}/ValidatorsMap.java | 24 +- .../actions/validation/ValidationServiceTopia.java | 278 --------------- .../validate/ValidationServiceTopiaTest.java | 111 ++++++ .../validation/ValidationServiceTopiaTest.java | 107 ------ 24 files changed, 1186 insertions(+), 846 deletions(-) diff --git a/observe-services-api/pom.xml b/observe-services-api/pom.xml index 1fdd594..af0a253 100644 --- a/observe-services-api/pom.xml +++ b/observe-services-api/pom.xml @@ -41,6 +41,11 @@ <artifactId>guava</artifactId> </dependency> + <dependency> + <groupId>org.nuiton</groupId> + <artifactId>nuiton-validator</artifactId> + </dependency> + <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java new file mode 100644 index 0000000..ebcbfb3 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java @@ -0,0 +1,66 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import org.nuiton.validator.NuitonValidatorScope; + +/** + * La requète de validation des données. + * + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ValidateDataRequest { + + /** + * Les niveaux de validation à vérifier. + */ + protected ImmutableSet<NuitonValidatorScope> scopes; + + /** + * Le contexte de validation à utiliser. + */ + protected String validationContext; + + /** + * Les identifiants des données à valider. + */ + protected ImmutableSet<String> dataIds; + + /** + * Pour générer un rapport de la validation. + */ + protected boolean generateReport; + + public ImmutableSet<NuitonValidatorScope> getScopes() { + return scopes; + } + + public void setScopes(ImmutableSet<NuitonValidatorScope> scopes) { + this.scopes = scopes; + } + + public String getValidationContext() { + return validationContext; + } + + public void setValidationContext(String validationContext) { + this.validationContext = validationContext; + } + + public ImmutableSet<String> getDataIds() { + return dataIds; + } + + public void setDataIds(ImmutableSet<String> dataIds) { + this.dataIds = dataIds; + } + + public boolean isGenerateReport() { + return generateReport; + } + + public void setGenerateReport(boolean generateReport) { + this.generateReport = generateReport; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java new file mode 100644 index 0000000..1d584a8 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java @@ -0,0 +1,40 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.services.dto.IdDto; + +/** + * Le résultat d'une validation de données. + * + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ValidateDataResult { + + protected final ValidateDataRequest validateDataRequest; + + protected final ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType; + + protected final Optional<String> optionalReport; + + public ValidateDataResult(ValidateDataRequest validateDataRequest, ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType, Optional<String> optionalReport) { + this.validateDataRequest = validateDataRequest; + this.resultByType = resultByType; + this.optionalReport = optionalReport; + } + + public ValidateDataRequest getValidateDataRequest() { + return validateDataRequest; + } + + public ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> getResultByType() { + return resultByType; + } + + public Optional<String> getOptionalReport() { + return optionalReport; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java new file mode 100644 index 0000000..b0055e5 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java @@ -0,0 +1,68 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import org.nuiton.validator.NuitonValidatorScope; + +/** + * La requète de validation des référentiels. + * + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ValidateReferentialsRequest { + + /** + * Les niveaux de validation à vérifier. + */ + protected ImmutableSet<NuitonValidatorScope> scopes; + + /** + * Le contexte de validation à utiliser. + */ + protected String validationContext; + + /** + * Les types de référentiels à valider. + */ + protected ImmutableSet<Class<? extends ReferentialDto>> referentialTypes; + + /** + * Pour générer un rapport de la validation. + */ + protected boolean generateReport; + + public String getValidationContext() { + return validationContext; + } + + public void setValidationContext(String validationContext) { + this.validationContext = validationContext; + } + + public ImmutableSet<NuitonValidatorScope> getScopes() { + return scopes; + } + + public void setScopes(ImmutableSet<NuitonValidatorScope> scopes) { + this.scopes = scopes; + } + + public ImmutableSet<Class<? extends ReferentialDto>> getReferentialTypes() { + return referentialTypes; + } + + public void setReferentialTypes(ImmutableSet<Class<? extends ReferentialDto>> referentialTypes) { + this.referentialTypes = referentialTypes; + } + + public boolean isGenerateReport() { + return generateReport; + } + + public void setGenerateReport(boolean generateReport) { + this.generateReport = generateReport; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java new file mode 100644 index 0000000..6c2a1e2 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java @@ -0,0 +1,40 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.services.dto.referential.ReferentialDto; + +/** + * Le résultat d'une validation de référentiels. + * + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ValidateReferentialsResult { + + protected final ValidateReferentialsRequest validateReferentialsRequest; + + protected final ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType; + + protected final Optional<String> optionalReport; + + public ValidateReferentialsResult(ValidateReferentialsRequest validateReferentialsRequest, ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType, Optional<String> optionalReport) { + this.validateReferentialsRequest = validateReferentialsRequest; + this.resultByType = resultByType; + this.optionalReport = optionalReport; + } + + public ValidateReferentialsRequest getValidateReferentialsRequest() { + return validateReferentialsRequest; + } + + public ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> getResultByType() { + return resultByType; + } + + public Optional<String> getOptionalReport() { + return optionalReport; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateResultForDtoType.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateResultForDtoType.java new file mode 100644 index 0000000..9b2b08a --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateResultForDtoType.java @@ -0,0 +1,28 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.IdDto; + +/** + * Le résultat d'une validation d'un type de dto donné. + * + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ValidateResultForDtoType<D extends IdDto> { + + /** + * Les messages regroupés pour chaque dto. + */ + protected final ImmutableSet<ValidationResultForDto<D>> validationResultForDto; + + public ValidateResultForDtoType(ImmutableSet<ValidationResultForDto<D>> validationResultForDto) { + this.validationResultForDto = validationResultForDto; + } + + public ImmutableSet<ValidationResultForDto<D>> getValidationResultForDto() { + return validationResultForDto; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessage.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessage.java new file mode 100644 index 0000000..5c8b4c2 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessage.java @@ -0,0 +1,45 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.base.MoreObjects; +import org.nuiton.validator.NuitonValidatorScope; + +/** + * Représente un message de validation. + * + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationMessage { + + protected final NuitonValidatorScope scope; + + protected final String fieldName; + + protected final String message; + + public ValidationMessage(NuitonValidatorScope scope, String fieldName, String message) { + this.scope = scope; + this.fieldName = fieldName; + this.message = message; + } + + public NuitonValidatorScope getScope() { + return scope; + } + + public String getFieldName() { + return fieldName; + } + + public String getMessage() { + return message; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("scope", scope) + .add("fieldName", fieldName) + .add("message", message) + .toString(); + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationResultForDto.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationResultForDto.java new file mode 100644 index 0000000..d7c105c --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationResultForDto.java @@ -0,0 +1,34 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.ReferenceDto; + +/** + * Les résultats de la validation d'un dto. + * + * On a une référence sur l'objet validé ainsi que les messages de validation + * qui lui sont associés. + * + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationResultForDto<D extends IdDto> { + + protected final ReferenceDto<D> dto; + + protected final ImmutableSet<ValidationMessage> messages; + + public ValidationResultForDto(ReferenceDto<D> dto, ImmutableSet<ValidationMessage> messages) { + this.dto = dto; + this.messages = messages; + } + + public ReferenceDto<D> getDto() { + return dto; + } + + public ImmutableSet<ValidationMessage> getMessages() { + return messages; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java new file mode 100644 index 0000000..a444967 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java @@ -0,0 +1,14 @@ +package fr.ird.observe.services.service.actions.validate; + +import fr.ird.observe.services.ObserveService; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public interface ValidationService extends ObserveService { + + ValidateReferentialsResult validate(ValidateReferentialsRequest request); + + ValidateDataResult validate(ValidateDataRequest request); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java deleted file mode 100644 index e131396..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java +++ /dev/null @@ -1,39 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import fr.ird.observe.services.dto.constants.operation.ValidationScope; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationMessage { - - protected ValidationScope scope; - - protected String fieldName; - - protected String message; - - public ValidationScope getScope() { - return scope; - } - - public void setScope(ValidationScope scope) { - this.scope = scope; - } - - public String getFieldName() { - return fieldName; - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java deleted file mode 100644 index 7699bcf..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java +++ /dev/null @@ -1,85 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.dto.constants.operation.ValidationContext; -import fr.ird.observe.services.dto.constants.operation.ValidationScope; -import fr.ird.observe.services.dto.referential.ReferentialDto; - -import java.util.EnumSet; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationRequest { - - protected ObserveDataSourceConfiguration dataSourceConfiguration; - - protected boolean validateReferential; - - protected boolean validateData; - - protected ValidationContext validationContext; - - protected EnumSet<ValidationScope> scopes; - - protected ImmutableSet<String> tripIds; - - protected ImmutableSet<Class<? extends ReferentialDto>> referentialTypes; - - public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; - } - - public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { - this.dataSourceConfiguration = dataSourceConfiguration; - } - - public boolean isValidateReferential() { - return validateReferential; - } - - public void setValidateReferential(boolean validateReferential) { - this.validateReferential = validateReferential; - } - - public boolean isValidateData() { - return validateData; - } - - public void setValidateData(boolean validateData) { - this.validateData = validateData; - } - - public ValidationContext getValidationContext() { - return validationContext; - } - - public void setValidationContext(ValidationContext validationContext) { - this.validationContext = validationContext; - } - - public EnumSet<ValidationScope> getScopes() { - return scopes; - } - - public void setScopes(EnumSet<ValidationScope> scopes) { - this.scopes = scopes; - } - - public ImmutableSet<String> getTripIds() { - return tripIds; - } - - public void setTripIds(ImmutableSet<String> tripIds) { - this.tripIds = tripIds; - } - - public ImmutableSet<Class<? extends ReferentialDto>> getReferentialTypes() { - return referentialTypes; - } - - public void setReferentialTypes(ImmutableSet<Class<? extends ReferentialDto>> referentialTypes) { - this.referentialTypes = referentialTypes; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java deleted file mode 100644 index b7efa15..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.ReferenceDto; - -import java.util.List; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationResultForDto<D extends IdDto> { - - protected ReferenceDto<D> dto; - - protected List<ValidationMessage> messages; - - public ReferenceDto<D> getDto() { - return dto; - } - - public void setDto(ReferenceDto<D> dto) { - this.dto = dto; - } - - public List<ValidationMessage> getMessages() { - return messages; - } - - public void setMessages(List<ValidationMessage> messages) { - this.messages = messages; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java deleted file mode 100644 index cb52411..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import fr.ird.observe.services.dto.IdDto; - -import java.util.List; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationResultForDtoType<D extends IdDto> { - - protected Class<D> DtoType; - - protected List<ValidationResultForDto<D>> validationResultForDtos; - - public Class<D> getDtoType() { - return DtoType; - } - - public void setDtoType(Class<D> dtoType) { - DtoType = dtoType; - } - - public List<ValidationResultForDto<D>> getValidationResultForDtos() { - return validationResultForDtos; - } - - public void setValidationResultForDtos(List<ValidationResultForDto<D>> validationResultForDtos) { - this.validationResultForDtos = validationResultForDtos; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java deleted file mode 100644 index bd196a3..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import fr.ird.observe.services.ObserveService; - -import java.util.List; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public interface ValidationService extends ObserveService { - - List<ValidationResultForDtoType> validate(ValidationRequest request); - -} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java deleted file mode 100644 index a463de9..0000000 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.ird.observe.services.dto.constants.operation; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public enum ValidationContext { - - N1_UPDATE("n1-update"), - N1_CREATE("n1-create"); - - protected String contextName; - - ValidationContext(String contextName) { - this.contextName = contextName; - } - - public String getContextName() { - return contextName; - } -} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java deleted file mode 100644 index 0eb631e..0000000 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.ird.observe.services.dto.constants.operation; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public enum ValidationScope { - - INFO, - WARNING, - ERROR, - -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java new file mode 100644 index 0000000..8b6bc61 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java @@ -0,0 +1,166 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 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% + */ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.base.Preconditions; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.util.ValueStack; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.validator.NuitonValidatorFactory; +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; +import org.nuiton.validator.xwork2.XWork2ValidatorUtil; + +/** + * Une surcharge du validateur swing offert par jaxx pour pouvoir ajouter dans + * la stack le DataContext (pour faire de la validation sur le context de + * données d'un niveau supérieur (valider une marée à partir d'une route par + * exemple). + * + * @param <B> le type d'objet a valider + * @author Tony Chemit - chemit@codelutin.com + * @since 1.0 + */ +public class ObserveValidator<B> extends SimpleBeanValidator<B> { + + /** Logger */ + private static final Log log = LogFactory.getLog(ObserveValidator.class); + + /** un etat pour initialiser la stack une unique fois la stack */ + private static boolean init; + + private static ValidationContext validationContext; + + public static <B> ObserveValidator<B> newObserveValidator(Class<B> type, + String context, + NuitonValidatorScope... scopes) { + return new ObserveValidator<>( + type, + context, + scopes + ); + } + +// public static <B> ObserveValidator<B> newValidator(NuitonValidatorProvider provider, +// Class<B> type, +// String context, +// NuitonValidatorScope... scopes) { +// return new ObserveValidator<>( +// provider, +// type, +// context, +// scopes +// ); +// } + + public ObserveValidator( + Class<B> type, + String context, + NuitonValidatorScope... scopes) { + super(NuitonValidatorFactory.getDefaultProvider(), type, context, scopes); + } + +// public ObserveValidator(NuitonValidatorProvider provider, +// Class<B> type, +// String context, +// NuitonValidatorScope... scopes) { +// super(provider, type, context, scopes); +// } + + @Override + protected void rebuildDelegateValidator(Class<B> beanType, + String context, + NuitonValidatorScope... scopes) { + super.rebuildDelegateValidator(beanType, context, scopes); + + if (!isInit()) { + + // on positionne dans la stack de dataContext pour pouvoir faire de la + // validation sur des objets dans le scope. + + ValidationContext dataContext = getValidationContext(); + + reloadDataContext(dataContext, true); + + // on marque pour ne jamais revenir ici + setInit(true); + + } + + } + + public static void reloadDataContext(ValidationContext validationContext, boolean strict) { + + if (validationContext != ObserveValidator.validationContext) { + + // keep this validation context + setValidationContext(validationContext); + + } + + ValueStack valueStack; + ActionContext context = ActionContext.getContext(); + if (context == null) { + Preconditions.checkState( + strict, + "Pas de context xworks enregistré... utiliser la methode " + ActionContext.class.getName() + "#setContext(context)"); + + valueStack = XWork2ValidatorUtil.getSharedValueStack(); + + } else { + + valueStack = context.getValueStack(); + + } + + if (valueStack != null) { + if (log.isDebugEnabled()) { + log.debug("Enregistrement du context de validation [" + validationContext + "] dans la valueStack de " + + "validation (" + valueStack + ')'); + } + + valueStack.push(validationContext); + } + + } + + public static ValidationContext getValidationContext() { + return validationContext; + } + + public static void setValidationContext(ValidationContext validationContext) { + ObserveValidator.validationContext = validationContext; + // a chaque fois qu'on change le contexte de validation il faudra reinitiliser la stack + setInit(false); + } + + private static boolean isInit() { + return init; + } + + private static void setInit(boolean init) { + ObserveValidator.init = init; + } + + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java new file mode 100644 index 0000000..6675eae --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java @@ -0,0 +1,181 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 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% + */ +package fr.ird.observe.services.service.actions.validate; + +import fr.ird.observe.entities.Activity; +import fr.ird.observe.entities.ObserveSet; +import fr.ird.observe.entities.Trip; +import fr.ird.observe.entities.longline.ActivityLongline; +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.entities.seine.Route; +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.entities.seine.TripSeine; + +import java.util.List; + +/** + * Contient les objets en cours de validation. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.4 + */ +public class ValidationContext { + + protected List<?> editingReferentielList; + + protected Program currentProgram; + + protected TripSeine currentTripSeine; + + protected TripLongline currentTripLongline; + + protected Route currentRoute; + + protected ActivitySeine currentActivitySeine; + + protected ActivityLongline currentActivityLongline; + + protected SetSeine currentSetSeine; + + protected SetLongline currentSetLongline; + + protected FloatingObject currentFloatingObject; + + public void clear() { + editingReferentielList = null; + currentProgram = null; + currentTripSeine = null; + currentRoute = null; + currentActivitySeine = null; + currentActivityLongline = null; + currentSetSeine = null; + currentSetLongline = null; + currentFloatingObject = null; + } + + public Program getCurrentProgram() { + return currentProgram; + } + + public Trip getCurrentTrip() { + Trip result = getCurrentTripSeine(); + if (result == null) { + result = getCurrentTripLongline(); + } + return result; + } + + public TripSeine getCurrentTripSeine() { + return currentTripSeine; + } + + public TripLongline getCurrentTripLongline() { + return currentTripLongline; + } + + public Route getCurrentRoute() { + return currentRoute; + } + + public Activity getCurrentActivity() { + Activity result = getCurrentActivitySeine(); + if (result == null) { + result = getCurrentActivityLongline(); + } + return result; + } + + public ActivitySeine getCurrentActivitySeine() { + return currentActivitySeine; + } + + public ActivityLongline getCurrentActivityLongline() { + return currentActivityLongline; + } + + public ObserveSet getCurrentSet() { + ObserveSet result = getCurrentSetSeine(); + if (result == null) { + result = getCurrentSetLongline(); + } + return result; + } + + public SetSeine getCurrentSetSeine() { + return currentSetSeine; + } + + public SetLongline getCurrentSetLongline() { + return currentSetLongline; + } + + public FloatingObject getCurrentFloatingObject() { + return currentFloatingObject; + } + + public List<?> getEditingReferentielList() { + return editingReferentielList; + } + + void setCurrentTripSeine(TripSeine currentTripSeine) { + this.currentTripSeine = currentTripSeine; + this.currentProgram = currentTripSeine == null ? null : currentTripSeine.getProgram(); + } + + void setCurrentTripLongline(TripLongline currentTripLongline) { + this.currentTripLongline = currentTripLongline; + this.currentProgram = currentTripLongline == null ? null : currentTripLongline.getProgram(); + } + + void setCurrentRoute(Route currentRoute) { + this.currentRoute = currentRoute; + } + + void setCurrentActivitySeine(ActivitySeine currentActivitySeine) { + this.currentActivitySeine = currentActivitySeine; + } + + void setCurrentActivityLongline(ActivityLongline currentActivityLongline) { + this.currentActivityLongline = currentActivityLongline; + } + + void setCurrentSetSeine(SetSeine currentSetSeine) { + this.currentSetSeine = currentSetSeine; + } + + void setCurrentSetLongline(SetLongline currentSetLongline) { + this.currentSetLongline = currentSetLongline; + } + + void setCurrentFloatingObject(FloatingObject currentFloatingObject) { + this.currentFloatingObject = currentFloatingObject; + } + + void setEditingReferentielList(List<?> editingReferentielList) { + this.editingReferentielList = editingReferentielList; + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java similarity index 58% rename from observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java rename to observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java index 3b9b37b..ede05cd 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessageDetector.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java @@ -19,33 +19,35 @@ * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ -package fr.ird.observe.services.service.actions.validation; +package fr.ird.observe.services.service.actions.validate; +import com.google.common.base.Predicate; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import fr.ird.observe.ObserveEntityEnum; -import fr.ird.observe.entities.longline.TripLongline; -import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.longline.ActivityLongline; +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.entities.seine.Route; +import fr.ird.observe.entities.seine.SetSeine; import fr.ird.observe.entities.seine.TripSeine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityVisitor; -import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.util.TopiaEntityRef; -import org.nuiton.validator.bean.simple.SimpleBeanValidator; import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; -import org.nuiton.validator.bean.simple.SimpleBeanValidatorMessage; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Deque; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.LinkedList; -import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; /** * Le detecteur de messages de validation. @@ -65,8 +67,7 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, /** le path courant depuis le depart */ protected Deque<TopiaEntity> path; - /** le dictionnaire des paths d'entites detectees */ - protected SortedMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> refs; + protected final Multimap<TopiaEntity, ValidationMessage> detectedMessages; protected StringBuilder accessorExpression; @@ -79,69 +80,73 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, /** le dictionnaire des validateurs utilisables */ protected final ValidatorsMap validators; - protected ValidationContext context; + protected final ValidationContext validationContext; - public ValidationContext getContext() { - return context; + public ValidationMessageDetector(ValidatorsMap validators, ValidationContext validationContext) { + this.validators = validators; + this.validationContext = validationContext; + this.path = new LinkedList<>(); + this.explored = new HashSet<>(); + this.detectedMessages = HashMultimap.create(); + this.accessorExpression = new StringBuilder(); } - public void setContext(ValidationContext context) { - this.context = context; - } + public Set<Class<? extends TopiaEntity>> getDetectedEntityTypes() { - public ValidationMessageDetector(ValidatorsMap validators) { - this.validators = validators; - path = new LinkedList<TopiaEntity>(); - explored = new HashSet<TopiaEntity>(); - refs = new TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>>(); - accessorExpression = new StringBuilder(); - for (SimpleBeanValidator<?> v : validators.values()) { - v.setBean(null); + // Première passe où l'on récupère les types de toutes les entités détectées + Set<Class<? extends TopiaEntity>> contractAndImplementationTypes = new LinkedHashSet<>(); + for (TopiaEntity topiaEntity : detectedMessages.keySet()) { + contractAndImplementationTypes.add(topiaEntity.getClass()); } + + // Seconde pass pour ne conserver que les contrats + Set<Class<? extends TopiaEntity>> result = new LinkedHashSet<>(); + for (Class<? extends TopiaEntity> type : contractAndImplementationTypes) { + Class<? extends TopiaEntity> contract = ObserveEntityEnum.valueOf(type).getContract(); + result.add(contract); + } + + return result; + } - public void detectMessages(TopiaEntity... entities) { -// try { + public void detectMessages(TopiaEntity e) { + + // on vide le contexte de validation + validationContext.clear(); + // on reinitialise tous les validateurs -// for (BeanValidator<?> v : validators.values()) { -// v.setBean(null); -//// v.setContextName(contextName); -// } - for (TopiaEntity e : entities) { - if (log.isDebugEnabled()) { - log.debug("start for entity " + e.getTopiaId()); - } - // détection sur l'entité e - try { - e.accept(this); - } catch (TopiaException e1) { - throw new RuntimeException("could not vist entity " + e.getTopiaId(), e1); - } + for (ObserveValidator<?> v : validators.values()) { + v.setBean(null); } + + if (log.isDebugEnabled()) { + log.debug("start for entity " + e); + } + + // détection sur l'entité e + e.accept(this); + } @Override public void start(TopiaEntity e) { if (root == null) { - // start come in start method since - // last clear method invocation + // start come in start method since last clear method invocation root = e; addPath(e, "$root", -1); } explored.add(e); - SimpleBeanValidator<TopiaEntity> validator = getValidator(e); + ObserveValidator validator = getValidator(e.getClass()); if (log.isDebugEnabled()) { log.debug("with entity " + e.getTopiaId() + " : " + accessorExpression); } if (validator != null) { + validator.addSimpleBeanValidatorListener(this); addEntityInContext(e); try { - currentRef = new TopiaEntityRef( - root, - e, - accessorExpression.toString(), - path.toArray(new TopiaEntity[path.size()])); + currentRef = new TopiaEntityRef(root, e, accessorExpression.toString(), path.toArray(new TopiaEntity[path.size()])); validator.setBean(e); } finally { validator.removeSimpleBeanValidatorListener(this); @@ -160,49 +165,80 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, removeEntityFromContext(e); } - private void addEntityInContext(TopiaEntity e) { + @Override + public void visit(TopiaEntity e, String name, Class<?> type, Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1, name, -1); + try { + e1.accept(this); + } finally { + removePath(); + } + } + } + + @Override + public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, int index, Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1, name, index); + try { + e1.accept(this); + } finally { + removePath(); + } + } + } + + @Override + public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, Object value) { + Collection<?> cValue = (Collection<?>) value; + if (TopiaEntity.class.isAssignableFrom(type) && + cValue != null && !cValue.isEmpty()) { + int i = 0; + for (Object currentValue : cValue) { + visit(e, name, collectionType, type, i++, currentValue); + } + } + } + + @Override + public void clear() { + path.clear(); + detectedMessages.clear(); + root = null; + explored.clear(); + accessorExpression.setLength(0); + } - DataContext context = getContext().getDataContext(); + protected void addEntityInContext(TopiaEntity e) { ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); switch (anEnum) { case Route: - context.setSelectedRouteId(e.getTopiaId()); - break; - case TripSeine: { - context.setSelectedTripId(e.getTopiaId()); - Program program = ((TripSeine) e).getProgram(); - if (program != null) { - context.setSelectedProgramId(program.getTopiaId()); - } else { - context.setSelectedProgramId(null); - } - } - break; + validationContext.setCurrentRoute((Route) e); + break; + case TripSeine: + validationContext.setCurrentTripSeine((TripSeine) e); + break; case ActivitySeine: - context.setSelectedActivityId(e.getTopiaId()); + validationContext.setCurrentActivitySeine((ActivitySeine) e); break; case SetSeine: - context.setSelectedSetId(e.getTopiaId()); - break; - case TripLongline: { - context.setSelectedTripId(e.getTopiaId()); - Program program = ((TripLongline) e).getProgram(); - if (program != null) { - context.setSelectedProgramId(program.getTopiaId()); - } else { - context.setSelectedProgramId(null); - } - } - break; + validationContext.setCurrentSetSeine((SetSeine) e); + break; + case TripLongline: + validationContext.setCurrentTripSeine((TripSeine) e); + break; case ActivityLongline: - context.setSelectedActivityId(e.getTopiaId()); + validationContext.setCurrentActivityLongline((ActivityLongline) e); break; case SetLongline: - context.setSelectedSetId(e.getTopiaId()); + validationContext.setCurrentSetLongline((SetLongline) e); break; case FloatingObject: - context.setSelectedFloatingObjectId(e.getTopiaId()); + validationContext.setCurrentFloatingObject((FloatingObject) e); break; case NonTargetLength: break; @@ -281,37 +317,33 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, } } - private void removeEntityFromContext(TopiaEntity e) { - - DataContext context = getContext().getDataContext(); + protected void removeEntityFromContext(TopiaEntity e) { ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); switch (anEnum) { case Route: - context.setSelectedRouteId(null); + validationContext.setCurrentRoute(null); break; case TripSeine: - context.setSelectedTripId(null); - context.setSelectedProgramId(null); + validationContext.setCurrentTripSeine(null); break; case ActivitySeine: - context.setSelectedActivityId(null); + validationContext.setCurrentActivitySeine(null); break; case SetSeine: - context.setSelectedSetId(null); + validationContext.setCurrentSetSeine(null); break; case TripLongline: - context.setSelectedTripId(null); - context.setSelectedProgramId(null); + validationContext.setCurrentTripLongline(null); break; case ActivityLongline: - context.setSelectedActivityId(null); + validationContext.setCurrentActivityLongline(null); break; case SetLongline: - context.setSelectedSetId(null); + validationContext.setCurrentSetLongline(null); break; case FloatingObject: - context.setSelectedFloatingObjectId(null); + validationContext.setCurrentFloatingObject(null); break; case NonTargetLength: break; @@ -390,90 +422,8 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, } } - @Override - public void visit(TopiaEntity e, - String name, - Class<?> type, - Object value) { - TopiaEntity e1 = getTopiaValue(value); - if (e1 != null) { - addPath(e1, name, -1); - try { - try { - e1.accept(this); - } catch (TopiaException ex) { - if (log.isErrorEnabled()) { - log.error(ex.getMessage(), ex); - } - } - } finally { - removePath(); - } - } - } - - @Override - public void visit(TopiaEntity e, - String name, - Class<?> collectionType, - Class<?> type, - int index, - Object value) { - TopiaEntity e1 = getTopiaValue(value); - if (e1 != null) { - addPath(e1, name, index); - try { - try { - e1.accept(this); - } catch (TopiaException ex) { - if (log.isErrorEnabled()) { - log.error(ex.getMessage(), ex); - } - } - } finally { - removePath(); - } - } - } - - @Override - public void visit(TopiaEntity e, - String name, - Class<?> collectionType, - Class<?> type, - Object value) { - Collection<?> cValue = (Collection<?>) value; - if (TopiaEntity.class.isAssignableFrom(type) && - cValue != null && !cValue.isEmpty()) { - int i = 0; - for (Object currentValue : cValue) { - visit(e, name, collectionType, type, i++, currentValue); - } - } - } - - public SortedMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> getRefs() { - // on renvoie toujours une copie - // pour pouvoir au plus tôt nettoyer le detecteur - TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> result; - result = new TreeMap<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>>(refs); - return result; - } - - - - @Override - public void clear() { - path.clear(); - refs.clear(); - root = null; - explored.clear(); - accessorExpression.setLength(0); - } - protected TopiaEntity getTopiaValue(Object value) { - TopiaEntity topiaEntity = (TopiaEntity) (value != null && - value instanceof TopiaEntity ? value : null); + TopiaEntity topiaEntity = (TopiaEntity) (value != null && value instanceof TopiaEntity ? value : null); if (topiaEntity != null && explored.contains(topiaEntity)) { // entite deja visitee topiaEntity = null; @@ -481,26 +431,23 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, return topiaEntity; } - protected <T extends TopiaEntity> SimpleBeanValidator<T> getValidator(T e) { - Class<T> contractClass; - contractClass = (Class<T>) ObserveEntityEnum.getContractClass(e.getClass()); - return validators.getValidator(contractClass); + protected <T extends TopiaEntity> ObserveValidator<T> getValidator(Class<T> entityType) { + return validators.getValidator(entityType); } - protected void addPath(TopiaEntity e, String name, int index) { - path.add(e); + protected void addPath(TopiaEntity entity, String name, int index) { + path.add(entity); if (accessorExpression.length() > 0) { accessorExpression.append(SEPARATOR); } accessorExpression.append(name); if (index > -1) { accessorExpression.append("[@topiaId=\""); - accessorExpression.append(e.getTopiaId()); + accessorExpression.append(entity.getTopiaId()); accessorExpression.append("\"]"); } if (log.isTraceEnabled()) { - log.trace("add to stack : " + e.getTopiaId() + ", new size : " + - path.size() + ", path : " + accessorExpression); + log.trace("add to stack : " + entity.getTopiaId() + ", new size : " + path.size() + ", path : " + accessorExpression); } } @@ -511,52 +458,44 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, } else { int index = accessorExpression.lastIndexOf(SEPARATOR); if (index > -1) { - accessorExpression.delete(index, - accessorExpression.length()); + accessorExpression.delete(index, accessorExpression.length()); } } if (log.isTraceEnabled()) { - log.trace("remove from stack : " + e.getTopiaId() + - ", new size : " + path.size() + ", path : " + - accessorExpression); + log.trace("remove from stack : " + e.getTopiaId() + ", new size : " + path.size() + ", path : " + accessorExpression); } } @Override public void onFieldChanged(SimpleBeanValidatorEvent event) { - SimpleBeanValidator<?> validator = event.getSource(); // on ne traite que les messages a ajouter String[] messagesToAdd = event.getMessagesToAdd(); - if (messagesToAdd == null || messagesToAdd.length == 0) { - return; - } + if (messagesToAdd != null) { - if (log.isDebugEnabled()) { - log.debug("will add " + Arrays.toString(messagesToAdd) + - " for " + currentRef.getAccessorExpression()); - } - List<SimpleBeanValidatorMessage<?>> list = refs.get(currentRef); - if (list == null) { - // first time for this entity - list = new ArrayList<SimpleBeanValidatorMessage<?>>(); - refs.put(currentRef, list); - } - for (String m : messagesToAdd) { - SimpleBeanValidatorMessage<?> message; - message = new SimpleBeanValidatorMessage( - validator, - event.getField(), - m, - event.getScope()); - if (log.isDebugEnabled()) { - log.debug("add message " + message); + TopiaEntity currentEntity = currentRef.getRef(); + + for (String messageToAdd : messagesToAdd) { + + ValidationMessage validationMessage = new ValidationMessage(event.getScope(), event.getField(), messageToAdd); + detectedMessages.put(currentEntity, validationMessage); + if (log.isDebugEnabled()) { + log.debug(String.format("On entity %s add message %s", currentEntity.getTopiaId(), validationMessage)); + } } - list.add(message); + } - } + } + public <E extends TopiaEntity> Map<TopiaEntity, Collection<ValidationMessage>> getDetectedMessages(final Class<E> entityType) { + return Multimaps.filterEntries(detectedMessages, new Predicate<Map.Entry<TopiaEntity, ValidationMessage>>() { + @Override + public boolean apply(Map.Entry<TopiaEntity, ValidationMessage> input) { + return entityType.isAssignableFrom(input.getKey().getClass()); + } + }).asMap(); + } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java new file mode 100644 index 0000000..aa4fff4 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java @@ -0,0 +1,221 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import fr.ird.observe.ObserveEntityEnum; +import fr.ird.observe.entities.Entities; +import fr.ird.observe.entities.Trip; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.ReferenceDto; +import fr.ird.observe.services.dto.longline.TripLonglineDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.validator.NuitonValidatorScope; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationServiceTopia extends ObserveServiceTopia implements ValidationService { + + private static final Log log = LogFactory.getLog(ValidationServiceTopia.class); + + @Override + public ValidateReferentialsResult validate(ValidateReferentialsRequest request) { + + ValidationContext validationContext = new ValidationContext(); + + ValidatorsMap validators = getValidators(request.getValidationContext(), + request.getScopes(), + Entities.REFERENCE_ENTITIES); + + //FIXME On ne peut pas charger cela avant d'avoir détecter un premier validateur + //FIXME Il faudrait mieux initialier de manière explicite le ActionContext + + ObserveValidator.reloadDataContext(validationContext, false); + + ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationContext); + + for (Class<? extends ReferentialDto> referentialType : request.getReferentialTypes()) { + + validateReferential(referentialType, detector); + + } + + ImmutableMap validateResultForDtoTypeMap = buildResultForDtoTypes(detector); + ValidateReferentialsResult result = new ValidateReferentialsResult(request, validateResultForDtoTypeMap, null); + return result; + + } + + @Override + public ValidateDataResult validate(ValidateDataRequest request) { + + ValidationContext validationContext = new ValidationContext(); + + ValidatorsMap validators = getValidators(request.getValidationContext(), + request.getScopes(), + Entities.DATA_ENTITIES); + + //FIXME On ne peut pas charger cela avant d'avoir détecter un premier validateur + //FIXME Il faudrait mieux initialier de manière explicite le ActionContext + + ObserveValidator.reloadDataContext(validationContext, false); + + ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationContext); + + for (String dataId : request.getDataIds()) { + + validateData(dataId, detector); + + } + + ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> validateResultForDtoTypeMap = buildResultForDtoTypes(detector); + ValidateDataResult result = new ValidateDataResult(request, validateResultForDtoTypeMap, null); + return result; + + } + + protected ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> buildResultForDtoTypes(ValidationMessageDetector detector) { + + ImmutableMap.Builder<Class<? extends IdDto>, ValidateResultForDtoType> forDtoTypeBuilder = new ImmutableMap.Builder<>(); + + for (Class<? extends TopiaEntity> entityType : detector.getDetectedEntityTypes()) { + + // construction d'un ValidateResultForDtoType + Class<IdDto> dtoType = getDtoType(entityType); + ValidateResultForDtoType validateResultForDtoType = buildResultForDtoType(entityType, dtoType, detector); + forDtoTypeBuilder.put(dtoType, validateResultForDtoType); + + } + + ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultForDtoTypes = forDtoTypeBuilder.build(); + return resultForDtoTypes; + + } + + private <E extends TopiaEntity, D extends IdDto> ValidateResultForDtoType buildResultForDtoType(Class<E> entityType, + Class<D> dtoType, + ValidationMessageDetector detector) { + + ImmutableSet.Builder<ValidationResultForDto<D>> validateResultForDtoMapBuilder = new ImmutableSet.Builder<>(); + + Map<TopiaEntity, Collection<ValidationMessage>> detectedMessages = detector.getDetectedMessages(entityType); + for (Map.Entry<TopiaEntity, Collection<ValidationMessage>> entry : detectedMessages.entrySet()) { + + TopiaEntity entity = entry.getKey(); + ReferenceDto<D> referenceDto = entityToReferenceDto(dtoType, entity); + Collection<ValidationMessage> validationMessages = entry.getValue(); + ValidationResultForDto<D> validationResultForDto = new ValidationResultForDto<>(referenceDto, ImmutableSet.copyOf(validationMessages)); + validateResultForDtoMapBuilder.add(validationResultForDto); + + } + + ValidateResultForDtoType<D> result = new ValidateResultForDtoType<D>(validateResultForDtoMapBuilder.build()); + return result; + + } + + protected <D extends ReferentialDto> void validateReferential(Class<D> referentialDtoType, ValidationMessageDetector detector) { + + Class<TopiaEntity> referentialType = getEntityType(referentialDtoType); + + if (log.isInfoEnabled()) { + log.info("Validate referential type: " + referentialType.getName()); + } + + for (TopiaEntity entity : loadEntities(referentialType)) { + + detector.detectMessages(entity); + + } + + } + + protected void validateData(String dataId, ValidationMessageDetector detector) { + + Trip trip; + + if (Entities.isSeineId(dataId)) { + + trip = loadEntity(TripSeineDto.class, TripSeine.class, dataId); + + } else { + + trip = loadEntity(TripLonglineDto.class, TripLongline.class, dataId); + + } + + detector.detectMessages(trip); + + } + + /** + * Obtenir le dictionnaire des validateurs pour les types d'entités donnés. + * + * @param context le context de validation + * @param scopes les scopes autorisés + * @param beanTypes types des entités + * @return le dictionnaire des validateurs par type d'entité. + */ + protected ValidatorsMap getValidators(String context, Set<NuitonValidatorScope> scopes, ObserveEntityEnum... beanTypes) { + + ValidatorsMap result = new ValidatorsMap(); + + for (ObserveEntityEnum type : beanTypes) { + // on cherche le validateur + ObserveValidator validator = getValidator(context, scopes, type.getContract()); + if (validator != null) { + // on enregistre le validateur pour le contrat + result.put(type.getContract(), validator); + // mais aussi pour l'implantation afin de ne pas à avoir à toujours revenir sur le contrat + result.put(type.getImplementation(), validator); + } + } + return result; + + } + + /** + * Obtenir le validateur d'un type objet + * + * @param context le nom du context de validation + * @param scopes les scopes autorisés + * @param klass type de l'objet à valider + * @param <B> type de l'objet à valider + * @return le validateur trouvé ou {@code null} + */ + protected <B extends TopiaEntity> ObserveValidator<B> getValidator(String context, + Set<NuitonValidatorScope> scopes, + Class<B> klass) { + + ObserveValidator<B> valitator = ObserveValidator.newObserveValidator(klass, + context, + Iterables.toArray(scopes, NuitonValidatorScope.class)); + + Set<NuitonValidatorScope> effectiveScopes = valitator.getEffectiveScopes(); + if (effectiveScopes.isEmpty()) { + valitator = null; + if (log.isDebugEnabled()) { + log.debug(klass + " : validator skip (no scopes detected)"); + } + } else { + if (log.isDebugEnabled()) { + log.debug(klass + " : keep validator " + valitator); + } + } + return valitator; + + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidatorsMap.java similarity index 74% rename from observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java rename to observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidatorsMap.java index e6fb418..5d3f56a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidatorsMap.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidatorsMap.java @@ -19,7 +19,7 @@ * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ -package fr.ird.observe.services.service.actions.validation; +package fr.ird.observe.services.service.actions.validate; import org.nuiton.validator.NuitonValidatorScope; import org.nuiton.validator.bean.simple.SimpleBeanValidator; @@ -36,12 +36,12 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 2.1 */ -public class ValidatorsMap implements Map<Class<?>, SimpleBeanValidator<?>> { +public class ValidatorsMap implements Map<Class<?>, ObserveValidator<?>> { - protected final Map<Class<?>, SimpleBeanValidator<?>> delegate; + protected final Map<Class<?>, ObserveValidator<?>> delegate; public ValidatorsMap() { - delegate = new HashMap<Class<?>, SimpleBeanValidator<?>>(); + delegate = new HashMap<>(); } public NuitonValidatorScope[] getScopes() { @@ -53,8 +53,8 @@ public class ValidatorsMap implements Map<Class<?>, SimpleBeanValidator<?>> { return result.toArray(new NuitonValidatorScope[result.size()]); } - public <X> SimpleBeanValidator<X> getValidator(Class<X> klass) { - SimpleBeanValidator<X> beanValidator = (SimpleBeanValidator<X>) get(klass); + public <X> ObserveValidator<X> getValidator(Class<X> klass) { + ObserveValidator<X> beanValidator = (ObserveValidator<X>) get(klass); return beanValidator; } @@ -79,22 +79,22 @@ public class ValidatorsMap implements Map<Class<?>, SimpleBeanValidator<?>> { } @Override - public SimpleBeanValidator<?> get(Object key) { + public ObserveValidator<?> get(Object key) { return delegate.get(key); } @Override - public SimpleBeanValidator<?> put(Class<?> key, SimpleBeanValidator<?> value) { + public ObserveValidator<?> put(Class<?> key, ObserveValidator<?> value) { return delegate.put(key, value); } @Override - public SimpleBeanValidator<?> remove(Object key) { + public ObserveValidator<?> remove(Object key) { return delegate.remove(key); } @Override - public void putAll(Map<? extends Class<?>, ? extends SimpleBeanValidator<?>> m) { + public void putAll(Map<? extends Class<?>, ? extends ObserveValidator<?>> m) { delegate.putAll(m); } @@ -109,12 +109,12 @@ public class ValidatorsMap implements Map<Class<?>, SimpleBeanValidator<?>> { } @Override - public Collection<SimpleBeanValidator<?>> values() { + public Collection<ObserveValidator<?>> values() { return delegate.values(); } @Override - public Set<Entry<Class<?>, SimpleBeanValidator<?>>> entrySet() { + public Set<Entry<Class<?>, ObserveValidator<?>>> entrySet() { return delegate.entrySet(); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java deleted file mode 100644 index e6dc863..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java +++ /dev/null @@ -1,278 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import fr.ird.observe.ObserveEntityEnum; -import fr.ird.observe.entities.Entities; -import fr.ird.observe.entities.Trip; -import fr.ird.observe.entities.longline.TripLongline; -import fr.ird.observe.entities.referentiel.Program; -import fr.ird.observe.entities.seine.TripSeine; -import fr.ird.observe.services.ObserveServiceTopia; -import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.ReferenceDto; -import fr.ird.observe.services.dto.constants.operation.ValidationContext; -import fr.ird.observe.services.dto.constants.operation.ValidationScope; -import fr.ird.observe.services.dto.longline.TripLonglineDto; -import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.util.TopiaEntityRef; -import org.nuiton.validator.NuitonValidatorScope; -import org.nuiton.validator.bean.simple.SimpleBeanValidator; -import org.nuiton.validator.bean.simple.SimpleBeanValidatorMessage; - -import java.util.EnumSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationServiceTopia extends ObserveServiceTopia implements ValidationService { - - private static final Log log = LogFactory.getLog(ValidationServiceTopia.class); - - @Override - public List<ValidationResultForDtoType> validate(ValidationRequest request) { - - ValidatorsMap validators = getValidators(request); - - ValidationMessageDetector detector = - new ValidationMessageDetector(validators); - - if (request.isValidateReferential()) { - - validateReferential(request, detector); - - } - - if (request.isValidateData()) { - - validateData(request, detector); - - } - - - List<ValidationResultForDtoType> validationResults = getValidationResults(detector); - - return validationResults; - } - - protected ValidatorsMap getValidators(ValidationRequest request) { - - Set<ObserveEntityEnum> beanTypes = Sets.newLinkedHashSet(); - - if (request.isValidateReferential()) { - beanTypes.addAll(Entities.REFERENCE_ENTITIES_LIST); - } - - if (request.isValidateData()) { - beanTypes.addAll(Entities.DATA_ENTITIES_LIST); - } - - ValidatorsMap validators = getValidators( - request.getValidationContext(), - request.getScopes(), - beanTypes); - - return validators; - - - } - - - protected void validateReferential(ValidationRequest request, ValidationMessageDetector detector) { - - for (Class<? extends ReferentialDto> referentialDtoType : request.getReferentialTypes()) { - - Class<TopiaEntity> referentialType = getEntityType(referentialDtoType); - - // on recupere la liste des ids a valider -// String entityLabel = t(DecoratorService.getEntityLabel(klass)); -// sendMessage(t("observe.message.validation.start.referentiel", entityLabel, ids.size())); - for (TopiaEntity entity : loadEntities(referentialType)) { - - detector.detectMessages(entity); - } - } - - - } - - protected void validateData(ValidationRequest request, ValidationMessageDetector detector) { - - for (ReferenceDto referenceDto : request.getTripIds()) { - - Trip trip = null; - - if (referenceDto.getType().isAssignableFrom(TripSeineDto.class)) { - - trip = loadEntity(TripSeineDto.class, TripSeine.class, referenceDto.getId()); - - } else if (referenceDto.getType().isAssignableFrom(TripLonglineDto.class)) { - - trip = loadEntity(TripLonglineDto.class, TripLongline.class, referenceDto.getId()); - - } - - if (trip != null) { - - Program program = trip.getProgram(); - - //messager.sendMessage(t("observe.message.validation.start.maree", decorateEntity(trip), decorateEntity(program))); - - detector.detectMessages(trip); - } - - - } - - - } - - /** - * Obtenir le validateur d'un type objet - * - * @param context le lastName du context de validation - * @param scopes les scopes autorisés - * @param klass type de l'objet à valider - * @param <B> type de l'objet à valider - * @return le validateur trouvé ou {@code null} - */ - public <B extends TopiaEntity> SimpleBeanValidator<B> getValidator( - ValidationContext context, - EnumSet<ValidationScope> scopes, - Class<B> klass) { - - Iterable<NuitonValidatorScope> nuitonScopes = Iterables.transform(scopes, new Function<ValidationScope, NuitonValidatorScope>() { - @Override - public NuitonValidatorScope apply(ValidationScope validationScope) { - return NuitonValidatorScope.valueOf(validationScope.name()); - } - }); - - - SimpleBeanValidator<B> valitator = SimpleBeanValidator.newValidator( - klass, - context.getContextName(), - Iterables.toArray(nuitonScopes, NuitonValidatorScope.class)); - - Set<NuitonValidatorScope> resultScopes = valitator.getEffectiveScopes(); - if (resultScopes.isEmpty()) { - valitator = null; - if (log.isDebugEnabled()) { - log.debug(klass + " : validator skip (no scopes detected)"); - } - } else { - if (log.isDebugEnabled()) { - log.debug(klass + " : keep validator " + valitator); - } - } - return valitator; - } - - /** - * Obtenir le dictionnaire des validateurs pour les types d'entités donnés. - * - * @param context le context de validation - * @param scopes les scopes autorisés - * @param beanTypes types des entités - * @return le dictionnaire des validateurs par type d'entité. - */ - public ValidatorsMap getValidators( - ValidationContext context, - EnumSet<ValidationScope> scopes, - Set<ObserveEntityEnum> beanTypes) { - - ValidatorsMap result = new ValidatorsMap(); - - for (ObserveEntityEnum type : beanTypes) { - // on cherche le validateur - SimpleBeanValidator validator = getValidator(context, scopes, type.getContract()); - if (validator != null) { - // on enregistre le validateur - result.put(type.getContract(), validator); - } - } - return result; - - - } - - public List<ValidationResultForDtoType> getValidationResults(ValidationMessageDetector detector) { - - Map<Class<? extends IdDto>, List<ValidationResultForDto>> validationResultsByDtoType = Maps.newHashMap(); - - for (Map.Entry<TopiaEntityRef, List<SimpleBeanValidatorMessage<?>>> entry : detector.getRefs().entrySet()) { - - TopiaEntity entity = entry.getKey().getRef(); - - Class<? extends TopiaEntity> entityClass = ObserveEntityEnum.getContractClass(entity.getClass()); - - Class<IdDto> dtoType = getDtoType(entityClass); - - List<ValidationResultForDto> messageForDtos = validationResultsByDtoType.get(dtoType); - - if (messageForDtos == null) { - - messageForDtos = Lists.newLinkedList(); - - validationResultsByDtoType.put(dtoType, messageForDtos); - - } - - ReferenceDto reference = entityToReferenceDto(dtoType, entity); - - ValidationResultForDto messageForDto = new ValidationResultForDto(); - - messageForDto.setDto(reference); - - List<ValidationMessage> messages = Lists.newLinkedList(); - - for (SimpleBeanValidatorMessage beanValidatorMessage : entry.getValue()) { - - ValidationMessage message = new ValidationMessage(); - - message.setScope(ValidationScope.valueOf(beanValidatorMessage.getScope().name())); - - message.setFieldName(beanValidatorMessage.getField()); - - message.setMessage(beanValidatorMessage.getMessage()); - - messages.add(message); - - } - - messageForDto.setMessages(messages); - - messageForDtos.add(messageForDto); - - } - - List<ValidationResultForDtoType> validationResults = Lists.newLinkedList(); - - for (Map.Entry<Class<? extends IdDto>, List<ValidationResultForDto>> entry : validationResultsByDtoType.entrySet()) { - - ValidationResultForDtoType messageForDtoType = new ValidationResultForDtoType(); - - messageForDtoType.setDtoType(entry.getKey()); - - messageForDtoType.setValidationResultForDtos(entry.getValue()); - - validationResults.add(messageForDtoType); - - } - - return validationResults; - - } - - -} diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java new file mode 100644 index 0000000..7d2f2e1 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java @@ -0,0 +1,111 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.referential.PersonDto; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.service.AbstractServiceTopiaTest; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.validator.NuitonValidatorScope; + +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidationServiceTopiaTest extends AbstractServiceTopiaTest { + + protected ValidationService service; + + @Override + public Set<String> getTestNamesChangeDataBase() { + return ImmutableSet.of(); + } + + @Override + public String getScriptName() { + return "dataForTestSeine"; + } + + @Override + public void setUp() throws Exception { + super.setUp(); + service = newService(ValidationService.class); + } + + @Test + public void testValidateReferantials() throws Exception { + + ValidateReferentialsRequest request = new ValidateReferentialsRequest(); + + request.setValidationContext("n1-update"); + request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); + ImmutableSet<Class<? extends ReferentialDto>> of = ImmutableSet.of( + ProgramDto.class, PersonDto.class); + request.setReferentialTypes(of); + + ValidateReferentialsResult result = service.validate(request); + Assert.assertNotNull(result); + } + + @Test + public void testValidateTripSeines() throws Exception { + + ValidateDataRequest request = new ValidateDataRequest(); + + request.setValidationContext("n1-create"); + request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); + request.setDataIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); + + ValidateDataResult result = service.validate(request); + Assert.assertNotNull(result); + +// List<ValidationResultForDtoType> validationResults = service.validate(request); +// +// Assert.assertNotNull(validationResults); +// Assert.assertEquals(5, validationResults.size()); +// +// Assert.assertEquals(ActivitySeineDto.class, validationResults.get(0).getDtoType()); +// Assert.assertEquals(SetSeineDto.class, validationResults.get(1).getDtoType()); +// Assert.assertEquals(TripSeineDto.class, validationResults.get(2).getDtoType()); +// Assert.assertEquals(FloatingObjectDto.class, validationResults.get(3).getDtoType()); +// Assert.assertEquals(RouteDto.class, validationResults.get(4).getDtoType()); +// +// ValidationResultForDtoType tripValidationResult = validationResults.get(2); +// +// List<ValidationResultForDto> validationResultForDtos = tripValidationResult.getValidationResultForDtos(); +// Assert.assertNotNull(validationResultForDtos); +// Assert.assertEquals(2, validationResultForDtos.size()); +// Assert.assertEquals(TRIP_SEINE_ID_1, validationResultForDtos.get(0).getDto().getId()); +// Assert.assertEquals(TRIP_SEINE_ID_2, validationResultForDtos.get(1).getDto().getId()); +// +// List<ValidationMessage> messages = validationResultForDtos.get(0).getMessages(); +// +// Assert.assertNotNull(messages); +// Assert.assertEquals(5, messages.size()); +// +// Assert.assertEquals(ValidationScope.ERROR, messages.get(0).getScope()); +// Assert.assertEquals("Port de départ", messages.get(0).getFieldName()); +// Assert.assertEquals("La sélection d'un port de départ est obligatoire.", messages.get(0).getMessage()); +// +// Assert.assertEquals(ValidationScope.ERROR, messages.get(1).getScope()); +// Assert.assertEquals("Bateau", messages.get(1).getFieldName()); +// Assert.assertEquals("Le bateau sélectionné est désactivé.", messages.get(1).getMessage()); +// +// Assert.assertEquals(ValidationScope.WARNING, messages.get(2).getScope()); +// Assert.assertEquals("Capitaine", messages.get(2).getFieldName()); +// Assert.assertEquals("Pas de capitaine sélectionné.", messages.get(2).getMessage()); +// +// Assert.assertEquals(ValidationScope.WARNING, messages.get(3).getScope()); +// Assert.assertEquals("Saisisseur", messages.get(3).getFieldName()); +// Assert.assertEquals("Pas de saisisseur sélectionné.", messages.get(3).getMessage()); +// +// Assert.assertEquals(ValidationScope.WARNING, messages.get(4).getScope()); +// Assert.assertEquals("Port d'arrivée", messages.get(4).getFieldName()); +// Assert.assertEquals("Pas de port d'arrivé sélectionné.", messages.get(4).getMessage()); + + + } + +} diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java deleted file mode 100644 index 6d21d51..0000000 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package fr.ird.observe.services.service.actions.validation; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.dto.constants.operation.ValidationContext; -import fr.ird.observe.services.dto.constants.operation.ValidationScope; -import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.FloatingObjectDto; -import fr.ird.observe.services.dto.seine.RouteDto; -import fr.ird.observe.services.dto.seine.SetSeineDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; -import fr.ird.observe.services.service.AbstractServiceTopiaTest; -import org.junit.Assert; -import org.junit.Test; - -import java.util.EnumSet; -import java.util.List; -import java.util.Set; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationServiceTopiaTest extends AbstractServiceTopiaTest { - - protected ValidationService service; - - @Override - public Set<String> getTestNamesChangeDataBase() { - return ImmutableSet.of("testConsolidateTripSeines"); - } - - @Override - public String getScriptName() { - return "dataForTestSeine"; - } - - @Override - public void setUp() throws Exception { - super.setUp(); - service = newService(ValidationService.class); - } - - @Test - public void testConsolidateTripSeines() throws Exception { - - ValidationRequest request = new ValidationRequest(); - - ObserveDataSourceConfiguration dataSourceConfiguration = applicationContextResource.createDataSourceConfigurationH2(ValidationServiceTopiaTest.class, "localdb"); - - request.setDataSourceConfiguration(dataSourceConfiguration); - - request.setValidateData(true); - request.setValidateReferential(false); - request.setValidationContext(ValidationContext.N1_CREATE); - request.setScopes(EnumSet.allOf(ValidationScope.class)); - request.setTripIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); - request.setReferentialTypes(ImmutableSet.<Class<? extends ReferentialDto>>of()); - - List<ValidationResultForDtoType> validationResults = service.validate(request); - - Assert.assertNotNull(validationResults); - Assert.assertEquals(5, validationResults.size()); - - Assert.assertEquals(ActivitySeineDto.class, validationResults.get(0).getDtoType()); - Assert.assertEquals(SetSeineDto.class, validationResults.get(1).getDtoType()); - Assert.assertEquals(TripSeineDto.class, validationResults.get(2).getDtoType()); - Assert.assertEquals(FloatingObjectDto.class, validationResults.get(3).getDtoType()); - Assert.assertEquals(RouteDto.class, validationResults.get(4).getDtoType()); - - ValidationResultForDtoType tripValidationResult = validationResults.get(2); - - List<ValidationResultForDto> validationResultForDtos = tripValidationResult.getValidationResultForDtos(); - Assert.assertNotNull(validationResultForDtos); - Assert.assertEquals(2, validationResultForDtos.size()); - Assert.assertEquals(TRIP_SEINE_ID_1, validationResultForDtos.get(0).getDto().getId()); - Assert.assertEquals(TRIP_SEINE_ID_2, validationResultForDtos.get(1).getDto().getId()); - - List<ValidationMessage> messages = validationResultForDtos.get(0).getMessages(); - - Assert.assertNotNull(messages); - Assert.assertEquals(5, messages.size()); - - Assert.assertEquals(ValidationScope.ERROR, messages.get(0).getScope()); - Assert.assertEquals("Port de départ", messages.get(0).getFieldName()); - Assert.assertEquals("La sélection d'un port de départ est obligatoire.", messages.get(0).getMessage()); - - Assert.assertEquals(ValidationScope.ERROR, messages.get(1).getScope()); - Assert.assertEquals("Bateau", messages.get(1).getFieldName()); - Assert.assertEquals("Le bateau sélectionné est désactivé.", messages.get(1).getMessage()); - - Assert.assertEquals(ValidationScope.WARNING, messages.get(2).getScope()); - Assert.assertEquals("Capitaine", messages.get(2).getFieldName()); - Assert.assertEquals("Pas de capitaine sélectionné.", messages.get(2).getMessage()); - - Assert.assertEquals(ValidationScope.WARNING, messages.get(3).getScope()); - Assert.assertEquals("Saisisseur", messages.get(3).getFieldName()); - Assert.assertEquals("Pas de saisisseur sélectionné.", messages.get(3).getMessage()); - - Assert.assertEquals(ValidationScope.WARNING, messages.get(4).getScope()); - Assert.assertEquals("Port d'arrivée", messages.get(4).getFieldName()); - Assert.assertEquals("Pas de port d'arrivé sélectionné.", messages.get(4).getMessage()); - - - } - -} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 73d72d003bc2ffa49b6c82d70b7b5e04b10d81b1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 00:14:07 2015 +0200 Debut d'intégration des validateurs d'entités (See #7493) --- .../ird/observe/entities/seine/ActivitySeines.java | 160 +++++++++++++++++++++ observe-services-topia/pom.xml | 5 + observe-validation/pom.xml | 4 +- .../field/ActivityDebutDePecheSaneValidator.java | 9 +- .../field/ActivityFinDePecheSaneValidator.java | 11 +- .../field/ActivityFinDeVeilleExistsValidator.java | 3 +- .../field/ActivitySimpleSpeedValidator.java | 25 ++-- .../validation/field/ActivitySpeedValidator.java | 28 ++-- .../validation/field/OpenableFieldValidator.java | 138 ------------------ .../field/RouteActivitysFieldValidator.java | 7 +- .../field/SetLonglineUniqueHomeIdValidator.java | 14 +- .../field/SetLonglineUniqueNumberValidator.java | 14 +- .../field/VesselActivityFieldValidator.java | 49 +++---- .../TripLongline-n1-update-warning-validation.xml | 6 +- .../seine/Route-n1-update-warning-validation.xml | 6 +- .../TripSeine-n1-update-warning-validation.xml | 6 +- .../src/main/resources/validators.xml | 2 +- .../validation/BeanValidatorDetectorTest.java | 4 +- .../field/ActivitySeineSpeedValidatorTest.java | 3 +- .../field/OpenableEntityFieldValidatorTest.java | 82 ----------- .../seine/TripSeine-testOpen-error-validation.xml | 32 ----- pom.xml | 2 +- 22 files changed, 266 insertions(+), 344 deletions(-) diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java index a48ced4..21435f8 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java @@ -22,14 +22,18 @@ package fr.ird.observe.entities.seine; * #L% */ +import com.google.common.collect.Lists; import fr.ird.observe.entities.constants.ReferenceLocale; import fr.ird.observe.entities.constants.seine.SchoolType; import fr.ird.observe.entities.referentiel.seine.ObservedSystem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Date; +import java.util.Iterator; import java.util.List; /** @@ -65,6 +69,12 @@ public class ActivitySeines { } + public static ActivitySeine getPreviousActivity(Route route, ActivitySeine activitySeine) { + + List<ActivitySeine> activitySeines = Lists.newArrayList(route.getActivitySeine()); + return getPreviousActivity(activitySeines, activitySeine); + } + public static ActivitySeine getPreviousActivity(List<ActivitySeine> activitySeines, ActivitySeine activitySeine) { if (activitySeine == null) { @@ -141,4 +151,154 @@ public class ActivitySeines { } return type; } + + public static ActivitySeine getLastActivityDebutDePechePositiveBefore(Route route, Date actitiveDebut) { + + if (route.isActivitySeineEmpty()) { + + // pas d'actitive dans la route + return null; + } + + int position = getLastActivityBefore(route, actitiveDebut); + + if (position == -1) { + + // activity avant toute les autres ou non trouvee + return null; + } + + List<ActivitySeine> activitySeine = Lists.newArrayList(route.getActivitySeine()); + // on parcours en ordre inverse depuis la position jusqu'à trouver + // de debut de peche positive + ActivitySeine result = null; + for (int i = position; i > -1; i--) { + ActivitySeine a = activitySeine.get(i); + if (a.isActivityDebutDePechePositive()) { + + // on a trouve une activity de debut de peche positive + result = a; + break; + } + } + return result; + } + + public static ActivitySeine getNextActivityFinDePeche(Route route, ActivitySeine actitiveDebut) { + if (route.isActivitySeineEmpty()) { + + // pas d'actitive dans la route + return null; + } + List<ActivitySeine> activitySeine = Lists.newArrayList(route.getActivitySeine()); + + int position = activitySeine.indexOf(actitiveDebut); + if (position == -1) { + + // activity de debut non trouvee + return null; + } + + for (int i = position + 1, max = route.sizeActivitySeine(); i < max; i++) { + ActivitySeine a = activitySeine.get(i); + if (a.isActivityFinDePeche()) { + + // activity de fin de peche trouvee + return a; + } + } + return null; + } + + public static ActivitySeine getNextActivityDebutDePechePositive(Route route, ActivitySeine actitiveDebut) { + if (route.isActivitySeineEmpty()) { + + // pas d'actitive dans la route + return null; + } + List<ActivitySeine> activitySeine = Lists.newArrayList(route.getActivitySeine()); + int position = activitySeine.indexOf(actitiveDebut); + if (position == -1) { + + // activity de debut non trouvee + return null; + } + + for (int i = position + 1, max = route.sizeActivitySeine(); i < max; i++) { + ActivitySeine a = activitySeine.get(i); + if (a.isActivityDebutDePechePositive()) { + + // activity de fin de peche trouvee + return a; + } + } + return null; + } + + public static List<ActivitySeine> getActivityDebutDePechePositive(Route route) { + List<ActivitySeine> result = new ArrayList<ActivitySeine>(); + if (!route.isActivitySeineEmpty()) { + for (ActivitySeine a : route.getActivitySeine()) { + if (a.isActivityDebutDePechePositive()) { + + // activity de debut de peche positive + result.add(a); + } + } + } + return result; + } + + public static List<ActivitySeine> getActivityFinDePeche(Route route) { + List<ActivitySeine> result = new ArrayList<ActivitySeine>(); + if (!route.isActivitySeineEmpty()) { + for (ActivitySeine a : route.getActivitySeine()) { + if (a.isActivityFinDePeche()) { + + // activity de debut de peche positive + result.add(a); + } + } + } + return result; + } + + public static boolean isActivityFindDeVeilleFound(Route route) { + return getActivityFinDeVeille(route) != null; + } + + public static ActivitySeine getActivityFinDeVeille(Route route) { + if (route.isActivitySeineEmpty()) { + return null; + } + ActivitySeine result = null; + for (ActivitySeine a : route.getActivitySeine()) { + if (a.isActivityFinDeVeille()) { + + // il existe bien une activity de fin de veille + result = a; + break; + } + } + return result; + } + + protected static int getLastActivityBefore(Route route, Date currentTime) { + if (route.isActivitySeineEmpty()) { + + // pas d'actitive dans la route + return -1; + } + Iterator<ActivitySeine> itr = route.getActivitySeine().iterator(); + int i = -1; + while (itr.hasNext()) { + ActivitySeine a = itr.next(); + if (currentTime.before(a.getTime()) || + currentTime.equals(a.getTime())) { + break; + } + i++; + } + return i; + } } diff --git a/observe-services-topia/pom.xml b/observe-services-topia/pom.xml index 822c29a..bd6aed4 100644 --- a/observe-services-topia/pom.xml +++ b/observe-services-topia/pom.xml @@ -45,6 +45,11 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>observe-validation</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>observe-test-data</artifactId> <version>${project.version}</version> <scope>test</scope> diff --git a/observe-validation/pom.xml b/observe-validation/pom.xml index 51e2c98..4a5b290 100644 --- a/observe-validation/pom.xml +++ b/observe-validation/pom.xml @@ -44,11 +44,11 @@ <artifactId>observe-entities</artifactId> <version>${project.version}</version> </dependency> - <dependency> + <!--dependency> <groupId>${project.groupId}</groupId> <artifactId>observe-business</artifactId> <version>${project.version}</version> - </dependency> + </dependency--> <dependency> <groupId>org.nuiton.topia</groupId> diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityDebutDePecheSaneValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityDebutDePecheSaneValidator.java index baabafb..db12299 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityDebutDePecheSaneValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityDebutDePecheSaneValidator.java @@ -26,6 +26,7 @@ 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; @@ -75,7 +76,7 @@ public class ActivityDebutDePecheSaneValidator extends FieldValidatorSupport { /** Logger. */ private static final Log log = LogFactory.getLog(ActivityDebutDePecheSaneValidator.class); - + private ValueStack stack; @Override @@ -152,7 +153,7 @@ public class ActivityDebutDePecheSaneValidator extends FieldValidatorSupport { // recuperation de l'activity de debut de peche juste avant la nouvelle // activity ActivitySeine openSet = - route.getLastActivityDebutDePechePositiveBefore(currentTime); + ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); if (openSet == null) { @@ -163,7 +164,7 @@ public class ActivityDebutDePecheSaneValidator extends FieldValidatorSupport { // on cherche la fin de pêche associée à l'actitivé retenue ActivitySeine closeSet = - route.getNextActivityFinDePeche(openSet); + ActivitySeines.getNextActivityFinDePeche(route, openSet); return closeSet != null && currentTime.after(closeSet.getTime()); @@ -173,7 +174,7 @@ public class ActivityDebutDePecheSaneValidator extends FieldValidatorSupport { // on recupere l'activity de fermeture de l'activite de peche ActivitySeine closeSet = - route.getNextActivityFinDePeche(activitySeine); + ActivitySeines.getNextActivityFinDePeche(route, activitySeine); if (closeSet == null) { // pas d'activity de fin, cela est possible ? diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDePecheSaneValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDePecheSaneValidator.java index db0639e..93d77c6 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDePecheSaneValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDePecheSaneValidator.java @@ -26,6 +26,7 @@ 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; @@ -74,7 +75,7 @@ public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { /** Logger. */ private static final Log log = LogFactory.getLog(ActivityFinDePecheSaneValidator.class); - + private ValueStack stack; @Override @@ -155,7 +156,7 @@ public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { // recuperation de l'activity de debut de peche juste avant la nouvelle // activity ActivitySeine openSet = - route.getLastActivityDebutDePechePositiveBefore(currentTime); + ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); if (openSet == null) { @@ -165,7 +166,7 @@ public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { } // on cherche la fin de pêche associée à l'actitivé retenue - ActivitySeine closeSet = route.getNextActivityFinDePeche(openSet); + ActivitySeine closeSet = ActivitySeines.getNextActivityFinDePeche(route, openSet); if (closeSet == null) { @@ -185,7 +186,7 @@ public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { // on recupere le debut de peche de cette activity de fin de peche ActivitySeine openSet = - route.getLastActivityDebutDePechePositiveBefore(currentTime); + ActivitySeines.getLastActivityDebutDePechePositiveBefore(route, currentTime); if (openSet == null) { @@ -201,7 +202,7 @@ public class ActivityFinDePecheSaneValidator extends FieldValidatorSupport { // on recupere la prochaine activity de peche openSet = - route.getNextActivityDebutDePechePositive(activitySeine); + ActivitySeines.getNextActivityDebutDePechePositive(route, activitySeine); if (openSet == null) { // pas de set apres cell-ci, donc pas de probleme diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDeVeilleExistsValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDeVeilleExistsValidator.java index 2506b58..43b1ad2 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDeVeilleExistsValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivityFinDeVeilleExistsValidator.java @@ -26,6 +26,7 @@ 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; @@ -164,7 +165,7 @@ public class ActivityFinDeVeilleExistsValidator extends FieldValidatorSupport { + "sur " + route.sizeActivitySeine() + " activity(s)."); } - boolean detected = route.isActivityFindDeVeilleFound(); + boolean detected = ActivitySeines.isActivityFindDeVeilleFound(route); boolean valid = required ? detected : !detected; if (log.isDebugEnabled()) { log.debug("detected activity fin de veille " + detected); diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java index 64293ca..25136f5 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java @@ -25,9 +25,8 @@ package fr.ird.observe.validation.field; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.ActivitySeines; import fr.ird.observe.entities.seine.Route; import fr.ird.observe.gps.GPSPoint; import fr.ird.observe.gps.GpsPoints; @@ -102,15 +101,13 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { return; } - DecoratorService decoratorService = ObserveServiceHelper.getDecoratorService(); - ActivitySeine activity = (ActivitySeine) object; if (activity.getTime() == null) { // heure d'observation non encore positionne, on ne peut pas valider if (log.isDebugEnabled()) { - log.debug("Missing time on current activity : " + decoratorService.decorate(activity) + ", skip speed computation"); + log.debug("Missing time on current activity : " + decorate(activity) + ", skip speed computation"); } return; } @@ -121,20 +118,20 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { // pas de position, on ne peut pas valider if (log.isDebugEnabled()) { - log.debug("Missing latitude or longitude on current activity : " + decoratorService.decorate(activity) + ", skip speed computation"); + log.debug("Missing latitude or longitude on current activity : " + decorate(activity) + ", skip speed computation"); } return; } Route route = (Route) stack.findValue("currentRoute"); - ActivitySeine previousActivity = route.getPreviousActivity(activity); + ActivitySeine previousActivity = ActivitySeines.getPreviousActivity(route, activity); if (previousActivity == null) { // pas d'activity avant, rien à valider if (log.isDebugEnabled()) { - log.debug("No previous activity for current activity : " + decoratorService.decorate(activity) + ", skip speed computation"); + log.debug("No previous activity for current activity : " + decorate(activity) + ", skip speed computation"); } return; } @@ -144,7 +141,7 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { // pas de position, on ne peut pas valider if (log.isDebugEnabled()) { - log.debug("Missing latitude or longitude on previous activity : " + decoratorService.decorate(previousActivity) + ", skip speed computation"); + log.debug("Missing latitude or longitude on previous activity : " + decorate(previousActivity) + ", skip speed computation"); } return; } @@ -155,7 +152,7 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { float computedSpeed = GpsPoints.getSpeed(previousPoint, currentPoint); if (log.isDebugEnabled()) { - log.debug("Speed computed between previous activity point " + decoratorService.decorate(previousPoint) + " to current activity point " + decoratorService.decorate(currentPoint) + ", speed is : " + computedSpeed); + log.debug("Speed computed between previous activity point " + decorate(previousPoint) + " to current activity point " + decorate(currentPoint) + ", speed is : " + computedSpeed); } boolean b = computedSpeed <= speed; @@ -173,4 +170,12 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { return "activitySimpleSpeed"; } + protected String decorate(ActivitySeine activitySeine) { + return activitySeine.toString(); + } + + protected String decorate(GPSPoint currentPoint) { + return currentPoint.toString(); + } + } diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java index b58ffee..3df46cb 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java @@ -25,8 +25,6 @@ package fr.ird.observe.validation.field; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.seine.ActivitySeine; import fr.ird.observe.entities.seine.Route; import fr.ird.observe.gps.GPSPoint; @@ -98,7 +96,15 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { return invalidActivity; } - public CollectionFieldExpressionValidator getDelegate(final DecoratorService decoratorService, final Route route) { + protected String decorate(ActivitySeine activitySeine) { + return activitySeine.toString(); + } + + protected String decorate(GPSPoint currentPoint) { + return currentPoint.toString(); + } + + public CollectionFieldExpressionValidator getDelegate(final Route route) { if (delegate == null) { delegate = new CollectionFieldExpressionValidator() { @@ -112,7 +118,7 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { if (previousActivity == null) { if (LOG.isDebugEnabled()) { - LOG.debug("No previous activity for current activity : " + decoratorService.decorate(currentActivity) + ", skip speed computation"); + LOG.debug("No previous activity for current activity : " + decorate(currentActivity) + ", skip speed computation"); } return true; } @@ -121,7 +127,7 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { // cas limite (pas de précédent ou position non renseigne) if (LOG.isDebugEnabled()) { - LOG.debug("Missing latitude or longitude on previous activity : " + decoratorService.decorate(previousActivity) + ", skip speed computation"); + LOG.debug("Missing latitude or longitude on previous activity : " + decorate(previousActivity) + ", skip speed computation"); } return true; @@ -130,7 +136,7 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { if (currentActivity.getLongitude() == null || currentActivity.getLatitude() == null) { // cas limite (pas de précédent ou position non renseigne) if (LOG.isDebugEnabled()) { - LOG.debug("Missing latitude or longitude on current activity : " + decoratorService.decorate(currentActivity) + ", skip speed computation"); + LOG.debug("Missing latitude or longitude on current activity : " + decorate(currentActivity) + ", skip speed computation"); } return true; } @@ -141,7 +147,7 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { float computedSpeed = GpsPoints.getSpeed(previousPoint, currentPoint); if (LOG.isDebugEnabled()) { - LOG.debug("Speed computed between previous activity point " + decoratorService.decorate(previousPoint) + " to current activity point " + decoratorService.decorate(currentPoint) + ", speed is : " + computedSpeed); + LOG.debug("Speed computed between previous activity point " + decorate(previousPoint) + " to current activity point " + decorate(currentPoint) + ", speed is : " + computedSpeed); } boolean valid = computedSpeed <= speed; @@ -149,11 +155,11 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { if (!valid) { stack.set("foundSpeed", computedSpeed); - invalidActivity = decoratorService.decorate(currentActivity); + invalidActivity = decorate(currentActivity); if (LOG.isInfoEnabled()) { LOG.info("Speed from " + - decoratorService.decorate(previousActivity) + + decorate(previousActivity) + " to " + invalidActivity + " is " + computedSpeed + " which is more thant authorized one " + @@ -204,9 +210,7 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { invalidActivity = null; - DecoratorService decoratorService = ObserveServiceHelper.getDecoratorService(); - - getDelegate(decoratorService, (Route) object).validate(object); + getDelegate((Route) object).validate(object); } @Override diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/OpenableFieldValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/OpenableFieldValidator.java deleted file mode 100644 index c0b8651..0000000 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/OpenableFieldValidator.java +++ /dev/null @@ -1,138 +0,0 @@ -package fr.ird.observe.validation.field; - -/* - * #%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.validator.ValidationException; -import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveServiceHelper; -import fr.ird.observe.entities.OpenableEntity; -import org.nuiton.decorator.Decorator; - -import java.util.Collection; - -/** - * <!-- START SNIPPET: javadoc --> OpenableFieldValidator verifie qu'une - * propriété de type {@link OpenableEntity} ou qu'une collection de ce type est bien - * 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/> - * <p/> - * <pre> - * <!-- START SNIPPET: examples --> - * <validators> - * <!-- Plain-Validator Syntax --> - * <validator type="openable"> - * <param name="fieldName">route</param> - * <message>existing unclosed routes</message> - * </validator> - * <p/> - * <!-- Field-Validator Syntax --> - * <field name="route"> - * <field-validator type="openable"> - * <message>existing unclosed routes</message> - * </field-validator> - * </field> - * </validators> - * <!-- END SNIPPET: examples --> - * </pre> - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.0 - */ -public class OpenableFieldValidator extends FieldValidatorSupport { - - String openValueAsString; - - public String getOpenValueAsString() { - return openValueAsString; - } - - @Override - public void validate(Object object) throws ValidationException { - String fieldName = getFieldName(); - - Object value = getFieldValue(fieldName, object); - - boolean result = true; - - OpenableEntity openValue = null; - - if (value != null) { - if (value instanceof Collection<?>) { - // on est sur une collection, - // on regarde si l'un des objets est ouvert - for (Object o : (Collection<?>) value) { - openValue = (OpenableEntity) o; - result = !openValue.isOpen(); - - if (!result) { - // on objet ouvert a été trouvé - // on peut arréter le parcours - break; - } - } - } else if (value instanceof OpenableEntity) { - openValue = (OpenableEntity) value; - result = !openValue.isOpen(); - } else { - // pas un type connu pour ce validateur - throw new ValidationException( - "le type " + value.getClass().getName() + - " n'est pas pris en charge pas ce validateur"); - } - } - - - if (!result) { - DecoratorService provider = ObserveServiceHelper.getDecoratorService(); - - Decorator<?> decorator = provider.getDecorator(openValue); - - if (log.isDebugEnabled()) { - log.debug("decorator to use : " + decorator); - } - if (decorator != null) { - openValueAsString = decorator.toString(openValue); - log.debug("decorator message " + openValueAsString); - } - try { - // on a decouvert au moins un objet non fermé - addFieldError(fieldName, openValue); - } finally { - openValueAsString = null; - } - } - } - - @Override - public String getValidatorType() { - return "openable"; - } -} diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/RouteActivitysFieldValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/RouteActivitysFieldValidator.java index a6aa64b..7a78f02 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/RouteActivitysFieldValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/RouteActivitysFieldValidator.java @@ -26,6 +26,7 @@ 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; @@ -74,7 +75,7 @@ public class RouteActivitysFieldValidator extends FieldValidatorSupport { /** Logger. */ private static final Log log = LogFactory.getLog(RouteActivitysFieldValidator.class); - + private ValueStack stack; @Override @@ -117,9 +118,9 @@ public class RouteActivitysFieldValidator extends FieldValidatorSupport { } // récupération des activités de pêche positive sur la route - List<ActivitySeine> positiveSet = route.getActivityDebutDePechePositive(); + List<ActivitySeine> positiveSet = ActivitySeines.getActivityDebutDePechePositive(route); - List<ActivitySeine> closedSet = route.getActivityFinDePeche(); + List<ActivitySeine> closedSet = ActivitySeines.getActivityFinDePeche(route); if (positiveSet.size() < closedSet.size()) { diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueHomeIdValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueHomeIdValidator.java index a6dd774..18b4244 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueHomeIdValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueHomeIdValidator.java @@ -26,14 +26,11 @@ import com.google.common.base.Objects; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.longline.ActivityLongline; import fr.ird.observe.entities.longline.SetLongline; import fr.ird.observe.entities.longline.TripLongline; -import org.nuiton.decorator.Decorator; -import java.util.List; +import java.util.Set; /** * Created on 12/7/14. @@ -61,7 +58,7 @@ public class SetLonglineUniqueHomeIdValidator extends FieldValidatorSupport { TripLongline tripLongline = (TripLongline) stack.findValue("currentTrip"); - List<ActivityLongline> activityLonglines = tripLongline.getActivityLongline(); + Set<ActivityLongline> activityLonglines = tripLongline.getActivityLongline(); boolean notValid = false; @@ -76,10 +73,11 @@ public class SetLonglineUniqueHomeIdValidator extends FieldValidatorSupport { notValid = true; - DecoratorService provider = ObserveServiceHelper.getDecoratorService(); - Decorator<?> decorator = provider.getDecorator(activityLongline); + //FIXME +// DecoratorService provider = ObserveServiceHelper.getDecoratorService(); +// Decorator<?> decorator = provider.getDecorator(activityLongline); - stack.set("duplicatedActivity", decorator.toString(activityLongline)); + stack.set("duplicatedActivity", activityLongline); break; diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueNumberValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueNumberValidator.java index 0e87383..90005bd 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueNumberValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/SetLonglineUniqueNumberValidator.java @@ -26,14 +26,11 @@ import com.google.common.base.Objects; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; -import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.longline.ActivityLongline; import fr.ird.observe.entities.longline.SetLongline; import fr.ird.observe.entities.longline.TripLongline; -import org.nuiton.decorator.Decorator; -import java.util.List; +import java.util.Set; /** * Created on 12/7/14. @@ -61,7 +58,7 @@ public class SetLonglineUniqueNumberValidator extends FieldValidatorSupport { TripLongline tripLongline = (TripLongline) stack.findValue("currentTrip"); - List<ActivityLongline> activityLonglines = tripLongline.getActivityLongline(); + Set<ActivityLongline> activityLonglines = tripLongline.getActivityLongline(); boolean notValid = false; @@ -76,10 +73,11 @@ public class SetLonglineUniqueNumberValidator extends FieldValidatorSupport { notValid = true; - DecoratorService provider = ObserveServiceHelper.getDecoratorService(); - Decorator<?> decorator = provider.getDecorator(activityLongline); + //FIXME +// DecoratorService provider = ObserveServiceHelper.getDecoratorService(); +// Decorator<?> decorator = provider.getDecorator(activityLongline); - stack.set("duplicatedActivity", decorator.toString(activityLongline)); + stack.set("duplicatedActivity", activityLongline); break; diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java index 83872ba..1aa0c90 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java @@ -22,14 +22,15 @@ package fr.ird.observe.validation.field; * #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.TripSeine; import fr.ird.observe.entities.seine.Route; -import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; +import fr.ird.observe.entities.seine.TripSeine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -75,7 +76,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { /** Logger. */ private static final Log log = LogFactory.getLog(VesselActivityFieldValidator.class); - + private ValueStack stack; private String code; @@ -113,7 +114,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { VesselActivitySeine property; property = (VesselActivitySeine) getFieldValue(ActivitySeine.PROPERTY_VESSEL_ACTIVITY_SEINE, - object); + object); if (property == null) { // si pas de valeur, on ne fait rien if (log.isDebugEnabled()) { @@ -202,11 +203,11 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { * - 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) + * @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, @@ -222,7 +223,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { //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 = route.getActivitySeine(); + 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; @@ -257,11 +258,11 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { * - 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) + * @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, @@ -272,7 +273,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { // aucune activity : donc pas possible return false; } - List<ActivitySeine> activitySeines = route.getActivitySeine(); + 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; @@ -336,13 +337,13 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { * - 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. + * @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, @@ -357,7 +358,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { if (is16) { // on est sur une activity de fin de veille - List<ActivitySeine> activitySeines = route.getActivitySeine(); + 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) { diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml index 3a3dd33..da5561f 100644 --- a/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml @@ -47,9 +47,9 @@ <field name="activityLongline"> <!-- une route est ouverte (interdit la cloture de la maree) --> - <field-validator type="openableEntity"> - <message>validator.tripLongline.unclosed.activity##${openValueAsString}</message> - </field-validator> + <!--<field-validator type="openableEntity">--> + <!--<message>validator.tripLongline.unclosed.activity##${openValueAsString}</message>--> + <!--</field-validator>--> </field> diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/Route-n1-update-warning-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/Route-n1-update-warning-validation.xml index 0e9ca15..e982526 100644 --- a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/Route-n1-update-warning-validation.xml +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/Route-n1-update-warning-validation.xml @@ -90,9 +90,9 @@ <field name="activitySeine"> <!-- activity non fermee --> - <field-validator type="openableEntity"> - <message>validator.route.unclosed.activity##${openValueAsString}</message> - </field-validator> + <!--<field-validator type="openableEntity">--> + <!--<message>validator.route.unclosed.activity##${openValueAsString}</message>--> + <!--</field-validator>--> <!-- activity de fin de pêche requise --> <!--field-validator type="routeActivitys"> diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-warning-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-warning-validation.xml index 5162dae..816bcad 100644 --- a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-warning-validation.xml +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-warning-validation.xml @@ -56,9 +56,9 @@ <field name="route"> <!-- une route est ouverte (interdit la cloture de la maree) --> - <field-validator type="openableEntity"> - <message>validator.tripSeine.unclosed.route##${openValueAsString}</message> - </field-validator> + <!--<field-validator type="openableEntity">--> + <!--<message>validator.tripSeine.unclosed.route##${openValueAsString}</message>--> + <!--</field-validator>--> <!-- coherence loch des routes --> <field-validator type="collectionFieldExpression"> diff --git a/observe-validation/src/main/resources/validators.xml b/observe-validation/src/main/resources/validators.xml index 1d9252b..5d5d68d 100644 --- a/observe-validation/src/main/resources/validators.xml +++ b/observe-validation/src/main/resources/validators.xml @@ -53,7 +53,7 @@ <validator name="fieldexpressionwithparams" class="org.nuiton.validator.xwork2.field.FieldExpressionWithParamsValidator"/> <!-- les validateurs spécifiques à ObServe --> - <validator name="openableEntity" class="fr.ird.observe.validation.field.OpenableFieldValidator"/> + <!--<validator name="openableEntity" class="fr.ird.observe.validation.field.OpenableFieldValidator"/>--> <validator name="species_length" class="fr.ird.observe.validation.field.SpeciesLengthFieldValidator"/> <validator name="species_weight" class="fr.ird.observe.validation.field.SpeciesWeightFieldValidator"/> <validator name="activitybateau" class="fr.ird.observe.validation.field.VesselActivityFieldValidator"/> diff --git a/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java b/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java index cc0cee7..d925ae2 100644 --- a/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java +++ b/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java @@ -21,7 +21,7 @@ */ package fr.ird.observe.validation; -import fr.ird.observe.ObserveDAOHelper; +import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.entities.longline.ActivityLongline; import fr.ird.observe.entities.longline.BaitsComposition; import fr.ird.observe.entities.longline.Basket; @@ -142,7 +142,7 @@ public class BeanValidatorDetectorTest extends AbstractValidatorDetectorTest { @BeforeClass public static void setUpClass() throws Exception { - ALL_TYPES = ObserveDAOHelper.getContractClasses(); + ALL_TYPES = ObserveEntityEnum.getContractClasses(); } @Override diff --git a/observe-validation/src/test/java/fr/ird/observe/validation/field/ActivitySeineSpeedValidatorTest.java b/observe-validation/src/test/java/fr/ird/observe/validation/field/ActivitySeineSpeedValidatorTest.java index 65c2e14..a82304a 100644 --- a/observe-validation/src/test/java/fr/ird/observe/validation/field/ActivitySeineSpeedValidatorTest.java +++ b/observe-validation/src/test/java/fr/ird/observe/validation/field/ActivitySeineSpeedValidatorTest.java @@ -28,7 +28,6 @@ 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.RouteImpl; -import fr.ird.observe.test.TestHelper; import org.apache.commons.lang3.time.DateUtils; import org.junit.After; import org.junit.AfterClass; @@ -62,7 +61,7 @@ public class ActivitySeineSpeedValidatorTest { Locale.setDefault(Locale.FRENCH); - TestHelper.createApplicationContext(); +// TestHelper.createApplicationContext(); vesselActivitySeine = new VesselActivitySeineImpl(); diff --git a/observe-validation/src/test/java/fr/ird/observe/validation/field/OpenableEntityFieldValidatorTest.java b/observe-validation/src/test/java/fr/ird/observe/validation/field/OpenableEntityFieldValidatorTest.java deleted file mode 100644 index 8b5d691..0000000 --- a/observe-validation/src/test/java/fr/ird/observe/validation/field/OpenableEntityFieldValidatorTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.ird.observe.validation.field; - -/* - * #%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 fr.ird.observe.entities.seine.TripSeine; -import fr.ird.observe.entities.seine.TripSeineImpl; -import fr.ird.observe.entities.seine.Route; -import fr.ird.observe.entities.seine.RouteImpl; -import fr.ird.observe.test.TestHelper; -import org.junit.After; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.nuiton.validator.NuitonValidator; -import org.nuiton.validator.NuitonValidatorFactory; -import org.nuiton.validator.NuitonValidatorResult; - -import java.util.Date; - -/** @author Tony Chemit - chemit@codelutin.com */ -public class OpenableEntityFieldValidatorTest { - - NuitonValidatorResult messages; - - @BeforeClass - public static void beforeTest() { - TestHelper.createApplicationContext(); - } - - @After - public void tearDonw() { - if (messages != null) { - messages = null; - } - } - - @Test - public void testValidate() { - - NuitonValidator<TripSeine> validator = - NuitonValidatorFactory.newValidator(TripSeine.class, "testOpen"); - - TripSeine m = new TripSeineImpl(); - - m.setStartDate(new Date()); - - messages = validator.validate(m); - Assert.assertTrue(messages.isValid()); - - Route r = new RouteImpl(); - r.setDate(new Date()); - r.setOpen(false); - m.addRoute(r); - - messages = validator.validate(m); - Assert.assertTrue(messages.isValid()); - - r.setOpen(true); - messages = validator.validate(m); - Assert.assertFalse(messages.isValid()); - } -} diff --git a/observe-validation/src/test/resources/fr/ird/observe/entities/seine/TripSeine-testOpen-error-validation.xml b/observe-validation/src/test/resources/fr/ird/observe/entities/seine/TripSeine-testOpen-error-validation.xml deleted file mode 100644 index f5b386c..0000000 --- a/observe-validation/src/test/resources/fr/ird/observe/entities/seine/TripSeine-testOpen-error-validation.xml +++ /dev/null @@ -1,32 +0,0 @@ -<!-- - #%L - ObServe :: Validation - %% - Copyright (C) 2008 - 2010 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% - --> -<!DOCTYPE validators PUBLIC - "-//Apache Struts//XWork Validator 1.0.3//EN" - "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> -<validators> - - <field name="route"> - <field-validator type="openableEntity"> - <message>validator.trip.contains.open.route##${openValueAsString}</message> - </field-validator> - </field> -</validators> diff --git a/pom.xml b/pom.xml index f154559..a85426f 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,7 @@ <module>observe-test-data</module> <module>observe-entities</module> <!--<module>observe-business</module>--> - <!--<module>observe-validation</module>--> + <module>observe-validation</module> <module>observe-services-configuration-topia</module> <module>observe-services-topia</module> <module>observe-services-configuration-rest</module> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 fdaf365a0e922f92af1cfcfa247d7d6d7628dbf5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 00:42:07 2015 +0200 Fix validation test (See #7493) --- .../entities/longline/TripLongline-n1-update-warning-validation.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml index da5561f..c5bbc74 100644 --- a/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/longline/TripLongline-n1-update-warning-validation.xml @@ -44,14 +44,14 @@ </field> - <field name="activityLongline"> + <!--<field name="activityLongline">--> <!-- une route est ouverte (interdit la cloture de la maree) --> <!--<field-validator type="openableEntity">--> <!--<message>validator.tripLongline.unclosed.activity##${openValueAsString}</message>--> <!--</field-validator>--> - </field> + <!--</field>--> <field name="captain"> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 e3c79cb3860615d478f80a9b3b48272eb0c9e5a9 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 11:13:14 2015 +0200 recupération des différents types de dto --- .../ird/observe/services/ObserveServiceTopia.java | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java index de21753..7d2e310 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java @@ -91,6 +91,17 @@ public class ObserveServiceTopia implements ObserveService { public static <E extends TopiaEntity, M extends IdDto> Class<M> getDtoType(Class<E> entityType) { Class<?> modelType = ENTITY_TO_DTO_TYPES.get(entityType); + if (modelType == null && TopiaEntity.class.isAssignableFrom(entityType)) { + // Pour gérer le cas des proxy hibernate qui ne sont pas égale à la classe proxifiée + //FIXME Trouver une meilleure solution + String name = entityType.getName(); + for (Map.Entry<Class<?>, Class<?>> entry : ENTITY_TO_DTO_TYPES.entrySet()) { + if (name.startsWith(entry.getKey().getName())) { + modelType = entry.getKey(); + break; + } + } + } return (Class<M>) modelType; } @@ -98,6 +109,28 @@ public class ObserveServiceTopia implements ObserveService { return DTO_TO_ENTITY_TYPES.entrySet(); } + public static ImmutableSet<Class<? extends ReferentialDto>> getReferentialDtoTypes() { + ImmutableSet.Builder<Class<? extends ReferentialDto>> builder = new ImmutableSet.Builder<>(); + for (Map.Entry<Class<?>, Class<?>> entry : getDtoTypes()) { + Class<?> dtoType = entry.getKey(); + if (ReferentialDto.class.isAssignableFrom(dtoType)) { + builder.add((Class<? extends ReferentialDto>) dtoType); + } + } + return builder.build(); + } + + public static ImmutableSet<Class<? extends IdDto>> getDataDtoTypes() { + ImmutableSet.Builder<Class<? extends IdDto>> builder = new ImmutableSet.Builder<>(); + for (Map.Entry<Class<?>, Class<?>> entry : getDtoTypes()) { + Class<?> dtoType = entry.getKey(); + if (!ReferentialDto.class.isAssignableFrom(dtoType)) { + builder.add((Class<? extends IdDto>) dtoType); + } + } + return builder.build(); + } + public ReferenceLocale getReferenceLocale() { ReferentialLocale referentialLocale = serviceContext.getReferentialLocale(); Locale locale = referentialLocale.getLocale(); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 ac1f0ff87befbce5364014fd63069bd4cad29d43 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 14:12:55 2015 +0200 Renommage de certains objets Simplificiation du détecteur de messages (on n'utilise plus les références sur entités) See #7493 --- .../actions/validate/ValidateDataRequest.java | 12 - .../actions/validate/ValidateDataResult.java | 10 +- .../validate/ValidateReferentialsRequest.java | 13 - .../validate/ValidateReferentialsResult.java | 10 +- .../service/actions/validate/ValidateService.java | 25 + .../actions/validate/ValidationService.java | 14 - .../service/actions/validate/ObserveValidator.java | 22 +- ...ServiceTopia.java => ValidateServiceTopia.java} | 29 +- ...tionContext.java => ValidationDataContext.java} | 2 +- .../validate/ValidationMessageDetector.java | 730 ++++++++++----------- .../actions/validate/ValidateServiceTopiaTest.java | 207 ++++++ .../validate/ValidationServiceTopiaTest.java | 111 ---- .../field/ActivitySimpleSpeedValidator.java | 2 + .../validation/field/ActivitySpeedValidator.java | 2 + 14 files changed, 626 insertions(+), 563 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java index ebcbfb3..03c31f7 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataRequest.java @@ -27,11 +27,6 @@ public class ValidateDataRequest { */ protected ImmutableSet<String> dataIds; - /** - * Pour générer un rapport de la validation. - */ - protected boolean generateReport; - public ImmutableSet<NuitonValidatorScope> getScopes() { return scopes; } @@ -56,11 +51,4 @@ public class ValidateDataRequest { this.dataIds = dataIds; } - public boolean isGenerateReport() { - return generateReport; - } - - public void setGenerateReport(boolean generateReport) { - this.generateReport = generateReport; - } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java index 1d584a8..0489c75 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateDataResult.java @@ -1,6 +1,5 @@ package fr.ird.observe.services.service.actions.validate; -import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import fr.ird.observe.services.dto.IdDto; @@ -17,12 +16,9 @@ public class ValidateDataResult { protected final ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType; - protected final Optional<String> optionalReport; - - public ValidateDataResult(ValidateDataRequest validateDataRequest, ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType, Optional<String> optionalReport) { + public ValidateDataResult(ValidateDataRequest validateDataRequest, ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType) { this.validateDataRequest = validateDataRequest; this.resultByType = resultByType; - this.optionalReport = optionalReport; } public ValidateDataRequest getValidateDataRequest() { @@ -33,8 +29,4 @@ public class ValidateDataResult { return resultByType; } - public Optional<String> getOptionalReport() { - return optionalReport; - } - } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java index b0055e5..8507926 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsRequest.java @@ -28,11 +28,6 @@ public class ValidateReferentialsRequest { */ protected ImmutableSet<Class<? extends ReferentialDto>> referentialTypes; - /** - * Pour générer un rapport de la validation. - */ - protected boolean generateReport; - public String getValidationContext() { return validationContext; } @@ -57,12 +52,4 @@ public class ValidateReferentialsRequest { this.referentialTypes = referentialTypes; } - public boolean isGenerateReport() { - return generateReport; - } - - public void setGenerateReport(boolean generateReport) { - this.generateReport = generateReport; - } - } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java index 6c2a1e2..cf6f397 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateReferentialsResult.java @@ -1,6 +1,5 @@ package fr.ird.observe.services.service.actions.validate; -import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import fr.ird.observe.services.dto.referential.ReferentialDto; @@ -17,12 +16,9 @@ public class ValidateReferentialsResult { protected final ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType; - protected final Optional<String> optionalReport; - - public ValidateReferentialsResult(ValidateReferentialsRequest validateReferentialsRequest, ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType, Optional<String> optionalReport) { + public ValidateReferentialsResult(ValidateReferentialsRequest validateReferentialsRequest, ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType) { this.validateReferentialsRequest = validateReferentialsRequest; this.resultByType = resultByType; - this.optionalReport = optionalReport; } public ValidateReferentialsRequest getValidateReferentialsRequest() { @@ -33,8 +29,4 @@ public class ValidateReferentialsResult { return resultByType; } - public Optional<String> getOptionalReport() { - return optionalReport; - } - } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateService.java new file mode 100644 index 0000000..8901341 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateService.java @@ -0,0 +1,25 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.spi.NoDataAccess; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public interface ValidateService extends ObserveService { + + String N1_CREATE_CONTEXT = "n1-create"; + + String N1_UPDATE_CONTEXT = "n1-update"; + + ImmutableSet<String> AVAILABLE_CONTEXT_NAMES = ImmutableSet.of(N1_CREATE_CONTEXT, N1_UPDATE_CONTEXT); + + @NoDataAccess + ImmutableSet<String> getAvailableContextNames(); + + ValidateReferentialsResult validate(ValidateReferentialsRequest request); + + ValidateDataResult validate(ValidateDataRequest request); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java deleted file mode 100644 index a444967..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.ird.observe.services.service.actions.validate; - -import fr.ird.observe.services.ObserveService; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public interface ValidationService extends ObserveService { - - ValidateReferentialsResult validate(ValidateReferentialsRequest request); - - ValidateDataResult validate(ValidateDataRequest request); - -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java index 8b6bc61..e2bf106 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ObserveValidator.java @@ -49,7 +49,7 @@ public class ObserveValidator<B> extends SimpleBeanValidator<B> { /** un etat pour initialiser la stack une unique fois la stack */ private static boolean init; - private static ValidationContext validationContext; + private static ValidationDataContext validationDataContext; public static <B> ObserveValidator<B> newObserveValidator(Class<B> type, String context, @@ -98,7 +98,7 @@ public class ObserveValidator<B> extends SimpleBeanValidator<B> { // on positionne dans la stack de dataContext pour pouvoir faire de la // validation sur des objets dans le scope. - ValidationContext dataContext = getValidationContext(); + ValidationDataContext dataContext = getValidationDataContext(); reloadDataContext(dataContext, true); @@ -109,12 +109,12 @@ public class ObserveValidator<B> extends SimpleBeanValidator<B> { } - public static void reloadDataContext(ValidationContext validationContext, boolean strict) { + public static void reloadDataContext(ValidationDataContext validationDataContext, boolean strict) { - if (validationContext != ObserveValidator.validationContext) { + if (validationDataContext != ObserveValidator.validationDataContext) { // keep this validation context - setValidationContext(validationContext); + setValidationDataContext(validationDataContext); } @@ -135,21 +135,21 @@ public class ObserveValidator<B> extends SimpleBeanValidator<B> { if (valueStack != null) { if (log.isDebugEnabled()) { - log.debug("Enregistrement du context de validation [" + validationContext + "] dans la valueStack de " + + log.debug("Enregistrement du context de validation [" + validationDataContext + "] dans la valueStack de " + "validation (" + valueStack + ')'); } - valueStack.push(validationContext); + valueStack.push(validationDataContext); } } - public static ValidationContext getValidationContext() { - return validationContext; + public static ValidationDataContext getValidationDataContext() { + return validationDataContext; } - public static void setValidationContext(ValidationContext validationContext) { - ObserveValidator.validationContext = validationContext; + public static void setValidationDataContext(ValidationDataContext validationDataContext) { + ObserveValidator.validationDataContext = validationDataContext; // a chaque fois qu'on change le contexte de validation il faudra reinitiliser la stack setInit(false); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopia.java similarity index 90% rename from observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java rename to observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopia.java index aa4fff4..cc8354b 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopia.java @@ -26,14 +26,19 @@ import java.util.Set; /** * @author Sylvain Bavencoff - bavencoff@codelutin.com */ -public class ValidationServiceTopia extends ObserveServiceTopia implements ValidationService { +public class ValidateServiceTopia extends ObserveServiceTopia implements ValidateService { - private static final Log log = LogFactory.getLog(ValidationServiceTopia.class); + private static final Log log = LogFactory.getLog(ValidateServiceTopia.class); + + @Override + public ImmutableSet<String> getAvailableContextNames() { + return AVAILABLE_CONTEXT_NAMES; + } @Override public ValidateReferentialsResult validate(ValidateReferentialsRequest request) { - ValidationContext validationContext = new ValidationContext(); + ValidationDataContext validationDataContext = new ValidationDataContext(); ValidatorsMap validators = getValidators(request.getValidationContext(), request.getScopes(), @@ -42,9 +47,9 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid //FIXME On ne peut pas charger cela avant d'avoir détecter un premier validateur //FIXME Il faudrait mieux initialier de manière explicite le ActionContext - ObserveValidator.reloadDataContext(validationContext, false); + ObserveValidator.reloadDataContext(validationDataContext, false); - ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationContext); + ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationDataContext); for (Class<? extends ReferentialDto> referentialType : request.getReferentialTypes()) { @@ -53,7 +58,7 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid } ImmutableMap validateResultForDtoTypeMap = buildResultForDtoTypes(detector); - ValidateReferentialsResult result = new ValidateReferentialsResult(request, validateResultForDtoTypeMap, null); + ValidateReferentialsResult result = new ValidateReferentialsResult(request, validateResultForDtoTypeMap); return result; } @@ -61,7 +66,7 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid @Override public ValidateDataResult validate(ValidateDataRequest request) { - ValidationContext validationContext = new ValidationContext(); + ValidationDataContext validationDataContext = new ValidationDataContext(); ValidatorsMap validators = getValidators(request.getValidationContext(), request.getScopes(), @@ -70,9 +75,9 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid //FIXME On ne peut pas charger cela avant d'avoir détecter un premier validateur //FIXME Il faudrait mieux initialier de manière explicite le ActionContext - ObserveValidator.reloadDataContext(validationContext, false); + ObserveValidator.reloadDataContext(validationDataContext, false); - ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationContext); + ValidationMessageDetector detector = new ValidationMessageDetector(validators, validationDataContext); for (String dataId : request.getDataIds()) { @@ -81,7 +86,7 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid } ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> validateResultForDtoTypeMap = buildResultForDtoTypes(detector); - ValidateDataResult result = new ValidateDataResult(request, validateResultForDtoTypeMap, null); + ValidateDataResult result = new ValidateDataResult(request, validateResultForDtoTypeMap); return result; } @@ -136,7 +141,7 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid for (TopiaEntity entity : loadEntities(referentialType)) { - detector.detectMessages(entity); + detector.detectValidationMessages(entity); } @@ -156,7 +161,7 @@ public class ValidationServiceTopia extends ObserveServiceTopia implements Valid } - detector.detectMessages(trip); + detector.detectValidationMessages(trip); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationDataContext.java similarity index 99% rename from observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java rename to observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationDataContext.java index 6675eae..341bec2 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationContext.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationDataContext.java @@ -42,7 +42,7 @@ import java.util.List; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class ValidationContext { +public class ValidationDataContext { protected List<?> editingReferentielList; diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java index ede05cd..aeef8ef 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationMessageDetector.java @@ -37,7 +37,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityVisitor; -import org.nuiton.topia.persistence.util.TopiaEntityRef; import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; @@ -55,40 +54,38 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 1.3 */ -public class ValidationMessageDetector implements TopiaEntityVisitor, - SimpleBeanValidatorListener { +public class ValidationMessageDetector { /** Logger */ - private static final Log log = - LogFactory.getLog(ValidationMessageDetector.class); - - public static final String SEPARATOR = "/"; - - /** le path courant depuis le depart */ - protected Deque<TopiaEntity> path; + private static final Log log = LogFactory.getLog(ValidationMessageDetector.class); + /** + * Le dictionnaire des messages détectés pour chaque entité visitée. + */ protected final Multimap<TopiaEntity, ValidationMessage> detectedMessages; - protected StringBuilder accessorExpression; + /** + * Le visiteur d'entités pour lancer la validation sur l'enveloppe d'une entité. + */ + protected final MyTopiaEntityVisitor entityVisitor; - protected TopiaEntity root; + public ValidationMessageDetector(ValidatorsMap validators, ValidationDataContext validationDataContext) { + this.detectedMessages = HashMultimap.create(); + this.entityVisitor = new MyTopiaEntityVisitor(validators, validationDataContext); + } - protected TopiaEntityRef currentRef; + public void detectValidationMessages(TopiaEntity entity) { - protected Set<TopiaEntity> explored; + if (log.isDebugEnabled()) { + log.debug("start for entity " + entity); + } - /** le dictionnaire des validateurs utilisables */ - protected final ValidatorsMap validators; + // détection sur l'entité e + entity.accept(entityVisitor); - protected final ValidationContext validationContext; + // on vide le visiteur + entityVisitor.clear(); - public ValidationMessageDetector(ValidatorsMap validators, ValidationContext validationContext) { - this.validators = validators; - this.validationContext = validationContext; - this.path = new LinkedList<>(); - this.explored = new HashSet<>(); - this.detectedMessages = HashMultimap.create(); - this.accessorExpression = new StringBuilder(); } public Set<Class<? extends TopiaEntity>> getDetectedEntityTypes() { @@ -99,7 +96,7 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, contractAndImplementationTypes.add(topiaEntity.getClass()); } - // Seconde pass pour ne conserver que les contrats + // Seconde passe pour ne conserver que les contrats Set<Class<? extends TopiaEntity>> result = new LinkedHashSet<>(); for (Class<? extends TopiaEntity> type : contractAndImplementationTypes) { Class<? extends TopiaEntity> contract = ObserveEntityEnum.valueOf(type).getContract(); @@ -110,392 +107,383 @@ public class ValidationMessageDetector implements TopiaEntityVisitor, } - public void detectMessages(TopiaEntity e) { + public <E extends TopiaEntity> Map<TopiaEntity, Collection<ValidationMessage>> getDetectedMessages(final Class<E> entityType) { + return Multimaps.filterEntries(detectedMessages, new Predicate<Map.Entry<TopiaEntity, ValidationMessage>>() { - // on vide le contexte de validation - validationContext.clear(); + @Override + public boolean apply(Map.Entry<TopiaEntity, ValidationMessage> input) { + return entityType.isAssignableFrom(input.getKey().getClass()); + } + }).asMap(); + } - // on reinitialise tous les validateurs - for (ObserveValidator<?> v : validators.values()) { - v.setBean(null); - } + protected class MyTopiaEntityVisitor implements TopiaEntityVisitor, SimpleBeanValidatorListener { - if (log.isDebugEnabled()) { - log.debug("start for entity " + e); - } + /** + * Le dictionnaire des validateurs utilisables. + */ + protected final ValidatorsMap validators; - // détection sur l'entité e - e.accept(this); + /** + * Le contexte de données injecté dans le contexte de validation. + */ + protected final ValidationDataContext validationDataContext; - } + /** + * La pile d'entités en cours de validation (le haut est l'entitié courante). + */ + protected final Deque<TopiaEntity> path; - @Override - public void start(TopiaEntity e) { - if (root == null) { - // start come in start method since last clear method invocation - root = e; - addPath(e, "$root", -1); - } - explored.add(e); - ObserveValidator validator = getValidator(e.getClass()); - if (log.isDebugEnabled()) { - log.debug("with entity " + e.getTopiaId() + " : " + accessorExpression); + /** + * La liste des entités déjà visitées (pour éviter de les parcourir plusieurs fois). + */ + protected final Set<TopiaEntity> explored; + + protected TopiaEntity currentEntity; + + protected MyTopiaEntityVisitor(ValidatorsMap validators, ValidationDataContext validationDataContext) { + this.validators = validators; + this.validationDataContext = validationDataContext; + this.path = new LinkedList<>(); + this.explored = new HashSet<>(); } - if (validator != null) { - - validator.addSimpleBeanValidatorListener(this); - addEntityInContext(e); - try { - currentRef = new TopiaEntityRef(root, e, accessorExpression.toString(), path.toArray(new TopiaEntity[path.size()])); - validator.setBean(e); - } finally { - validator.removeSimpleBeanValidatorListener(this); - validator.setBean(null); + + @Override + public void start(TopiaEntity e) { + if (path.isEmpty()) { + // start come in start method since last clear method invocation + addPath(e); + } + explored.add(e); + ObserveValidator validator = getValidator(e.getClass()); + if (validator != null) { + + validator.addSimpleBeanValidatorListener(this); + addEntityInContext(e); + try { + validator.setBean(e); + } finally { + validator.removeSimpleBeanValidatorListener(this); + validator.setBean(null); + } } } - } - @Override - public void end(TopiaEntity e) { - if (root != null && root.equals(e)) { - // global visit is done - root = null; - removePath(); + @Override + public void end(TopiaEntity e) { + if (path.size() == 1) { + // global visit is done + removePath(); + } + removeEntityFromContext(e); } - removeEntityFromContext(e); - } - @Override - public void visit(TopiaEntity e, String name, Class<?> type, Object value) { - TopiaEntity e1 = getTopiaValue(value); - if (e1 != null) { - addPath(e1, name, -1); - try { - e1.accept(this); - } finally { - removePath(); + @Override + public void visit(TopiaEntity e, String name, Class<?> type, Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1); + try { + e1.accept(this); + } finally { + removePath(); + } } } - } - @Override - public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, int index, Object value) { - TopiaEntity e1 = getTopiaValue(value); - if (e1 != null) { - addPath(e1, name, index); - try { - e1.accept(this); - } finally { - removePath(); + @Override + public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, int index, Object value) { + TopiaEntity e1 = getTopiaValue(value); + if (e1 != null) { + addPath(e1); + try { + e1.accept(this); + } finally { + removePath(); + } } } - } - @Override - public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, Object value) { - Collection<?> cValue = (Collection<?>) value; - if (TopiaEntity.class.isAssignableFrom(type) && - cValue != null && !cValue.isEmpty()) { - int i = 0; - for (Object currentValue : cValue) { - visit(e, name, collectionType, type, i++, currentValue); + @Override + public void visit(TopiaEntity e, String name, Class<?> collectionType, Class<?> type, Object value) { + Collection<?> cValue = (Collection<?>) value; + if (TopiaEntity.class.isAssignableFrom(type) && + cValue != null && !cValue.isEmpty()) { + int i = 0; + for (Object currentValue : cValue) { + visit(e, name, collectionType, type, i++, currentValue); + } } } - } - @Override - public void clear() { - path.clear(); - detectedMessages.clear(); - root = null; - explored.clear(); - accessorExpression.setLength(0); - } + @Override + public void clear() { + explored.clear(); + validationDataContext.clear(); - protected void addEntityInContext(TopiaEntity e) { - - ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); - switch (anEnum) { - case Route: - validationContext.setCurrentRoute((Route) e); - break; - case TripSeine: - validationContext.setCurrentTripSeine((TripSeine) e); - break; - case ActivitySeine: - validationContext.setCurrentActivitySeine((ActivitySeine) e); - break; - case SetSeine: - validationContext.setCurrentSetSeine((SetSeine) e); - break; - case TripLongline: - validationContext.setCurrentTripSeine((TripSeine) e); - break; - case ActivityLongline: - validationContext.setCurrentActivityLongline((ActivityLongline) e); - break; - case SetLongline: - validationContext.setCurrentSetLongline((SetLongline) e); - break; - case FloatingObject: - validationContext.setCurrentFloatingObject((FloatingObject) e); - break; - case NonTargetLength: - break; - case TargetLength: - break; - case TransmittingBuoy: - break; - case NonTargetCatch: - break; - case TargetCatch: - break; - case NonTargetSample: - break; - case TargetSample: - break; - case ObjectObservedSpecies: - break; - case SchoolEstimate: - break; - case ObjectSchoolEstimate: - break; - case VesselActivitySeine: - break; - case SurroundingActivity: - break; - case Vessel: - break; - case VesselSizeCategory: - break; - case WeightCategory: - break; - case ReasonForNullSet: - break; - case ReasonForNoFishing: - break; - case SpeciesFate: - break; - case ObjectFate: - break; - case Species: - break; - case SpeciesGroup: - break; - case DetectionMode: - break; - case Person: - break; - case Ocean: - break; - case TransmittingBuoyOperation: - break; - case ObjectOperation: - break; - case Organism: - break; - case LengthWeightParameter: - break; - case Country: - break; - case Program: - break; - case ReasonForDiscard: - break; - case SpeciesStatus: - break; - case ObservedSystem: - break; - case TransmittingBuoyType: - break; - case VesselType: - break; - case ObjectType: - break; - case Wind: - break; + // on reinitialise tous les validateurs + for (ObserveValidator<?> v : validators.values()) { + v.setBean(null); + } } - } - protected void removeEntityFromContext(TopiaEntity e) { - - ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(e); - switch (anEnum) { - case Route: - validationContext.setCurrentRoute(null); - break; - case TripSeine: - validationContext.setCurrentTripSeine(null); - break; - case ActivitySeine: - validationContext.setCurrentActivitySeine(null); - break; - case SetSeine: - validationContext.setCurrentSetSeine(null); - break; - case TripLongline: - validationContext.setCurrentTripLongline(null); - break; - case ActivityLongline: - validationContext.setCurrentActivityLongline(null); - break; - case SetLongline: - validationContext.setCurrentSetLongline(null); - break; - case FloatingObject: - validationContext.setCurrentFloatingObject(null); - break; - case NonTargetLength: - break; - case TargetLength: - break; - case TransmittingBuoy: - break; - case NonTargetCatch: - break; - case TargetCatch: - break; - case NonTargetSample: - break; - case TargetSample: - break; - case ObjectObservedSpecies: - break; - case SchoolEstimate: - break; - case ObjectSchoolEstimate: - break; - case VesselActivitySeine: - break; - case SurroundingActivity: - break; - case Vessel: - break; - case VesselSizeCategory: - break; - case WeightCategory: - break; - case ReasonForNullSet: - break; - case ReasonForNoFishing: - break; - case SpeciesFate: - break; - case ObjectFate: - break; - case Species: - break; - case SpeciesGroup: - break; - case DetectionMode: - break; - case Person: - break; - case Ocean: - break; - case TransmittingBuoyOperation: - break; - case ObjectOperation: - break; - case Organism: - break; - case LengthWeightParameter: - break; - case Country: - break; - case Program: - break; - case ReasonForDiscard: - break; - case SpeciesStatus: - break; - case ObservedSystem: - break; - case TransmittingBuoyType: - break; - case VesselType: - break; - case ObjectType: - break; - case Wind: - break; - } - } + @Override + public void onFieldChanged(SimpleBeanValidatorEvent event) { - protected TopiaEntity getTopiaValue(Object value) { - TopiaEntity topiaEntity = (TopiaEntity) (value != null && value instanceof TopiaEntity ? value : null); - if (topiaEntity != null && explored.contains(topiaEntity)) { - // entite deja visitee - topiaEntity = null; - } - return topiaEntity; - } + // on ne traite que les messages a ajouter + String[] messagesToAdd = event.getMessagesToAdd(); - protected <T extends TopiaEntity> ObserveValidator<T> getValidator(Class<T> entityType) { - return validators.getValidator(entityType); - } + if (messagesToAdd != null) { - protected void addPath(TopiaEntity entity, String name, int index) { - path.add(entity); - if (accessorExpression.length() > 0) { - accessorExpression.append(SEPARATOR); - } - accessorExpression.append(name); - if (index > -1) { - accessorExpression.append("[@topiaId=\""); - accessorExpression.append(entity.getTopiaId()); - accessorExpression.append("\"]"); - } - if (log.isTraceEnabled()) { - log.trace("add to stack : " + entity.getTopiaId() + ", new size : " + path.size() + ", path : " + accessorExpression); - } - } + for (String messageToAdd : messagesToAdd) { + + ValidationMessage validationMessage = new ValidationMessage(event.getScope(), event.getField(), messageToAdd); + detectedMessages.put(currentEntity, validationMessage); + if (log.isDebugEnabled()) { + log.debug(String.format("On entity %s add message %s", currentEntity.getTopiaId(), validationMessage)); + } + } - protected void removePath() { - TopiaEntity e = path.removeLast(); - if (path.isEmpty()) { - accessorExpression.setLength(0); - } else { - int index = accessorExpression.lastIndexOf(SEPARATOR); - if (index > -1) { - accessorExpression.delete(index, accessorExpression.length()); } + } - if (log.isTraceEnabled()) { - log.trace("remove from stack : " + e.getTopiaId() + ", new size : " + path.size() + ", path : " + accessorExpression); + + protected TopiaEntity getTopiaValue(Object value) { + TopiaEntity entity = (TopiaEntity) (value != null && value instanceof TopiaEntity ? value : null); + if (entity != null && explored.contains(entity)) { + // entite deja visitee + entity = null; + } + return entity; } - } - @Override - public void onFieldChanged(SimpleBeanValidatorEvent event) { + protected void addPath(TopiaEntity entity) { + path.add(entity); + currentEntity = entity; + } - // on ne traite que les messages a ajouter - String[] messagesToAdd = event.getMessagesToAdd(); + protected void removePath() { + path.removeLast(); + if (!path.isEmpty()) { + currentEntity = path.peek(); + } + } - if (messagesToAdd != null) { + protected <T extends TopiaEntity> ObserveValidator<T> getValidator(Class<T> entityType) { + return validators.getValidator(entityType); + } - TopiaEntity currentEntity = currentRef.getRef(); + protected void addEntityInContext(TopiaEntity entity) { + + ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(entity); + switch (anEnum) { + case Route: + validationDataContext.setCurrentRoute((Route) entity); + break; + case TripSeine: + validationDataContext.setCurrentTripSeine((TripSeine) entity); + break; + case ActivitySeine: + validationDataContext.setCurrentActivitySeine((ActivitySeine) entity); + break; + case SetSeine: + validationDataContext.setCurrentSetSeine((SetSeine) entity); + break; + case TripLongline: + validationDataContext.setCurrentTripSeine((TripSeine) entity); + break; + case ActivityLongline: + validationDataContext.setCurrentActivityLongline((ActivityLongline) entity); + break; + case SetLongline: + validationDataContext.setCurrentSetLongline((SetLongline) entity); + break; + case FloatingObject: + validationDataContext.setCurrentFloatingObject((FloatingObject) entity); + break; + case NonTargetLength: + break; + case TargetLength: + break; + case TransmittingBuoy: + break; + case NonTargetCatch: + break; + case TargetCatch: + break; + case NonTargetSample: + break; + case TargetSample: + break; + case ObjectObservedSpecies: + break; + case SchoolEstimate: + break; + case ObjectSchoolEstimate: + break; + case VesselActivitySeine: + break; + case SurroundingActivity: + break; + case Vessel: + break; + case VesselSizeCategory: + break; + case WeightCategory: + break; + case ReasonForNullSet: + break; + case ReasonForNoFishing: + break; + case SpeciesFate: + break; + case ObjectFate: + break; + case Species: + break; + case SpeciesGroup: + break; + case DetectionMode: + break; + case Person: + break; + case Ocean: + break; + case TransmittingBuoyOperation: + break; + case ObjectOperation: + break; + case Organism: + break; + case LengthWeightParameter: + break; + case Country: + break; + case Program: + break; + case ReasonForDiscard: + break; + case SpeciesStatus: + break; + case ObservedSystem: + break; + case TransmittingBuoyType: + break; + case VesselType: + break; + case ObjectType: + break; + case Wind: + break; + } + } - for (String messageToAdd : messagesToAdd) { - ValidationMessage validationMessage = new ValidationMessage(event.getScope(), event.getField(), messageToAdd); - detectedMessages.put(currentEntity, validationMessage); - if (log.isDebugEnabled()) { - log.debug(String.format("On entity %s add message %s", currentEntity.getTopiaId(), validationMessage)); - } + protected void removeEntityFromContext(TopiaEntity entity) { + + ObserveEntityEnum anEnum = ObserveEntityEnum.valueOf(entity); + switch (anEnum) { + case Route: + validationDataContext.setCurrentRoute(null); + break; + case TripSeine: + validationDataContext.setCurrentTripSeine(null); + break; + case ActivitySeine: + validationDataContext.setCurrentActivitySeine(null); + break; + case SetSeine: + validationDataContext.setCurrentSetSeine(null); + break; + case TripLongline: + validationDataContext.setCurrentTripLongline(null); + break; + case ActivityLongline: + validationDataContext.setCurrentActivityLongline(null); + break; + case SetLongline: + validationDataContext.setCurrentSetLongline(null); + break; + case FloatingObject: + validationDataContext.setCurrentFloatingObject(null); + break; + case NonTargetLength: + break; + case TargetLength: + break; + case TransmittingBuoy: + break; + case NonTargetCatch: + break; + case TargetCatch: + break; + case NonTargetSample: + break; + case TargetSample: + break; + case ObjectObservedSpecies: + break; + case SchoolEstimate: + break; + case ObjectSchoolEstimate: + break; + case VesselActivitySeine: + break; + case SurroundingActivity: + break; + case Vessel: + break; + case VesselSizeCategory: + break; + case WeightCategory: + break; + case ReasonForNullSet: + break; + case ReasonForNoFishing: + break; + case SpeciesFate: + break; + case ObjectFate: + break; + case Species: + break; + case SpeciesGroup: + break; + case DetectionMode: + break; + case Person: + break; + case Ocean: + break; + case TransmittingBuoyOperation: + break; + case ObjectOperation: + break; + case Organism: + break; + case LengthWeightParameter: + break; + case Country: + break; + case Program: + break; + case ReasonForDiscard: + break; + case SpeciesStatus: + break; + case ObservedSystem: + break; + case TransmittingBuoyType: + break; + case VesselType: + break; + case ObjectType: + break; + case Wind: + break; } - } } - public <E extends TopiaEntity> Map<TopiaEntity, Collection<ValidationMessage>> getDetectedMessages(final Class<E> entityType) { - return Multimaps.filterEntries(detectedMessages, new Predicate<Map.Entry<TopiaEntity, ValidationMessage>>() { - - @Override - public boolean apply(Map.Entry<TopiaEntity, ValidationMessage> input) { - return entityType.isAssignableFrom(input.getKey().getClass()); - } - }).asMap(); - } } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopiaTest.java new file mode 100644 index 0000000..6702b8d --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidateServiceTopiaTest.java @@ -0,0 +1,207 @@ +package fr.ird.observe.services.service.actions.validate; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.service.AbstractServiceTopiaTest; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.validator.NuitonValidatorScope; + +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ValidateServiceTopiaTest extends AbstractServiceTopiaTest { + + protected ValidateService service; + + @Override + public Set<String> getTestNamesChangeDataBase() { + return ImmutableSet.of(); + } + + @Override + public String getScriptName() { + return "dataForTestSeine"; + } + + @Override + public void setUp() throws Exception { + super.setUp(); + service = newService(ValidateService.class); + } + + @Test + public void testValidateReferantials() throws Exception { + + ValidateReferentialsRequest request = new ValidateReferentialsRequest(); + + request.setValidationContext(ValidateService.N1_UPDATE_CONTEXT); + request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); + request.setReferentialTypes(ObserveServiceTopia.getReferentialDtoTypes()); + + ValidateReferentialsResult result = service.validate(request); + Assert.assertNotNull(result); + ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType = result.getResultByType(); + Assert.assertNotNull(resultByType); + Assert.assertEquals(59, resultByType.size()); + +// for (Map.Entry<Class<? extends ReferentialDto>, ValidateResultForDtoType> entry : resultByType.entrySet()) { +// System.out.println("assertValidateResultForReferentialDtoType(resultByType, " + entry.getKey().getName() + ".class, " + entry.getValue().getValidationResultForDto().size() + ");"); +// } + + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.CountryDto.class, 53); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.FpaZoneDto.class, 41); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.GearCaracteristicDto.class, 22); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.GearCaracteristicTypeDto.class, 6); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.GearDto.class, 26); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.HarbourDto.class, 74); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.LengthWeightParameterDto.class, 352); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.OceanDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.OrganismDto.class, 8); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.PersonDto.class, 390); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.ProgramDto.class, 27); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.SexDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.SpeciesDto.class, 275); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.SpeciesGroupDto.class, 8); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.SpeciesListDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.VesselDto.class, 977); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.VesselSizeCategoryDto.class, 13); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.VesselTypeDto.class, 14); + + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.BaitHaulingStatusDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.BaitSettingStatusDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.BaitTypeDto.class, 16); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.CatchFateLonglineDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.EncounterTypeDto.class, 12); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.HealthnessDto.class, 6); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.HookPositionDto.class, 13); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.HookSizeDto.class, 22); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.HookTypeDto.class, 13); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.ItemHorizontalPositionDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.ItemVerticalPositionDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.LightsticksColorDto.class, 7); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.LightsticksTypeDto.class, 2); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.LineTypeDto.class, 8); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.MaturityStatusDto.class, 12); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.MitigationTypeDto.class, 15); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.SensorBrandDto.class, 4); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.SensorDataFormatDto.class, 2); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.SensorTypeDto.class, 4); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.SettingShapeDto.class, 6); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.SizeMeasureTypeDto.class, 17); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.StomacFullnessDto.class, 7); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.TripTypeDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.VesselActivityLonglineDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.longline.WeightMeasureTypeDto.class, 3); + + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.DetectionModeDto.class, 10); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ObjectFateDto.class, 9); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ObjectOperationDto.class, 4); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ObjectTypeDto.class, 23); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ObservedSystemDto.class, 21); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ReasonForDiscardDto.class, 5); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ReasonForNoFishingDto.class, 13); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.ReasonForNullSetDto.class, 10); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.SpeciesFateDto.class, 9); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.SpeciesStatusDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.SurroundingActivityDto.class, 8); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.TransmittingBuoyOperationDto.class, 3); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.TransmittingBuoyTypeDto.class, 12); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto.class, 23); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.WeightCategoryDto.class, 101); + assertValidateResultForReferentialDtoType(resultByType, fr.ird.observe.services.dto.referential.seine.WindDto.class, 13); + + } + + @Test + public void testValidateTripSeinesCreate() throws Exception { + + ValidateDataRequest request = new ValidateDataRequest(); + + request.setValidationContext(ValidateService.N1_CREATE_CONTEXT); + request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); + request.setDataIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); + + ValidateDataResult result = service.validate(request); + Assert.assertNotNull(result); + ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType = result.getResultByType(); + Assert.assertNotNull(resultByType); + Assert.assertEquals(5, resultByType.size()); + +// for (Map.Entry<Class<? extends IdDto>, ValidateResultForDtoType> entry : resultByType.entrySet()) { +// System.out.println("assertValidateResultForDtoType(resultByType, " + entry.getKey().getName() + ".class, " + entry.getValue().getValidationResultForDto().size() + ");"); +// } + + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.TripSeineDto.class, 2); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.RouteDto.class, 80); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.ActivitySeineDto.class, 1519); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.FloatingObjectDto.class, 99); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.SetSeineDto.class, 77); + + } + + @Test + public void testValidateTripSeinesUdpate() throws Exception { + + ValidateDataRequest request = new ValidateDataRequest(); + + request.setValidationContext(ValidateService.N1_UPDATE_CONTEXT); + request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); + request.setDataIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); + + ValidateDataResult result = service.validate(request); + Assert.assertNotNull(result); + + ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType = result.getResultByType(); + Assert.assertNotNull(resultByType); + Assert.assertEquals(8, resultByType.size()); + +// for (Map.Entry<Class<? extends IdDto>, ValidateResultForDtoType> entry : resultByType.entrySet()) { +// System.out.println("assertValidateResultForDtoType(resultByType, " + entry.getKey().getName() + ".class, " + entry.getValue().getValidationResultForDto().size() + ");"); +// } + + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.TripSeineDto.class, 2); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.RouteDto.class, 80); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.ActivitySeineDto.class, 1519); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.FloatingObjectDto.class, 99); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.TransmittingBuoyDto.class, 42); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.SetSeineDto.class, 77); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.NonTargetCatchDto.class, 3); + assertValidateResultForDtoType(resultByType, fr.ird.observe.services.dto.seine.SchoolEstimateDto.class, 27); + + } + + protected <D extends ReferentialDto> void assertValidateResultForReferentialDtoType(ImmutableMap<Class<? extends ReferentialDto>, ValidateResultForDtoType> resultByType, Class<D> dtoType, int expectedCount) { + + ValidateResultForDtoType<D> validateResultForDtoType = resultByType.get(dtoType); + Assert.assertNotNull(validateResultForDtoType); + ImmutableSet<ValidationResultForDto<D>> validationResultForDtos = validateResultForDtoType.getValidationResultForDto(); + Assert.assertNotNull(validationResultForDtos); + Assert.assertEquals(expectedCount, validationResultForDtos.size()); + for (ValidationResultForDto<D> validationResultForDto : validationResultForDtos) { + Assert.assertNotNull(validationResultForDto.getMessages()); + Assert.assertFalse(validationResultForDto.getMessages().isEmpty()); + } + + } + + protected <D extends IdDto> void assertValidateResultForDtoType(ImmutableMap<Class<? extends IdDto>, ValidateResultForDtoType> resultByType, Class<D> dtoType, int expectedCount) { + + ValidateResultForDtoType<D> validateResultForDtoType = resultByType.get(dtoType); + Assert.assertNotNull(validateResultForDtoType); + ImmutableSet<ValidationResultForDto<D>> validationResultForDtos = validateResultForDtoType.getValidationResultForDto(); + Assert.assertNotNull(validationResultForDtos); + Assert.assertEquals(expectedCount, validationResultForDtos.size()); + for (ValidationResultForDto<D> validationResultForDto : validationResultForDtos) { + Assert.assertNotNull(validationResultForDto.getMessages()); + Assert.assertFalse(validationResultForDto.getMessages().isEmpty()); + } + + } + +} diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java deleted file mode 100644 index 7d2f2e1..0000000 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package fr.ird.observe.services.service.actions.validate; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.dto.referential.PersonDto; -import fr.ird.observe.services.dto.referential.ProgramDto; -import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.service.AbstractServiceTopiaTest; -import org.junit.Assert; -import org.junit.Test; -import org.nuiton.validator.NuitonValidatorScope; - -import java.util.Set; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ValidationServiceTopiaTest extends AbstractServiceTopiaTest { - - protected ValidationService service; - - @Override - public Set<String> getTestNamesChangeDataBase() { - return ImmutableSet.of(); - } - - @Override - public String getScriptName() { - return "dataForTestSeine"; - } - - @Override - public void setUp() throws Exception { - super.setUp(); - service = newService(ValidationService.class); - } - - @Test - public void testValidateReferantials() throws Exception { - - ValidateReferentialsRequest request = new ValidateReferentialsRequest(); - - request.setValidationContext("n1-update"); - request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); - ImmutableSet<Class<? extends ReferentialDto>> of = ImmutableSet.of( - ProgramDto.class, PersonDto.class); - request.setReferentialTypes(of); - - ValidateReferentialsResult result = service.validate(request); - Assert.assertNotNull(result); - } - - @Test - public void testValidateTripSeines() throws Exception { - - ValidateDataRequest request = new ValidateDataRequest(); - - request.setValidationContext("n1-create"); - request.setScopes(ImmutableSet.copyOf(NuitonValidatorScope.values())); - request.setDataIds(ImmutableSet.of(TRIP_SEINE_ID_1, TRIP_SEINE_ID_2)); - - ValidateDataResult result = service.validate(request); - Assert.assertNotNull(result); - -// List<ValidationResultForDtoType> validationResults = service.validate(request); -// -// Assert.assertNotNull(validationResults); -// Assert.assertEquals(5, validationResults.size()); -// -// Assert.assertEquals(ActivitySeineDto.class, validationResults.get(0).getDtoType()); -// Assert.assertEquals(SetSeineDto.class, validationResults.get(1).getDtoType()); -// Assert.assertEquals(TripSeineDto.class, validationResults.get(2).getDtoType()); -// Assert.assertEquals(FloatingObjectDto.class, validationResults.get(3).getDtoType()); -// Assert.assertEquals(RouteDto.class, validationResults.get(4).getDtoType()); -// -// ValidationResultForDtoType tripValidationResult = validationResults.get(2); -// -// List<ValidationResultForDto> validationResultForDtos = tripValidationResult.getValidationResultForDtos(); -// Assert.assertNotNull(validationResultForDtos); -// Assert.assertEquals(2, validationResultForDtos.size()); -// Assert.assertEquals(TRIP_SEINE_ID_1, validationResultForDtos.get(0).getDto().getId()); -// Assert.assertEquals(TRIP_SEINE_ID_2, validationResultForDtos.get(1).getDto().getId()); -// -// List<ValidationMessage> messages = validationResultForDtos.get(0).getMessages(); -// -// Assert.assertNotNull(messages); -// Assert.assertEquals(5, messages.size()); -// -// Assert.assertEquals(ValidationScope.ERROR, messages.get(0).getScope()); -// Assert.assertEquals("Port de départ", messages.get(0).getFieldName()); -// Assert.assertEquals("La sélection d'un port de départ est obligatoire.", messages.get(0).getMessage()); -// -// Assert.assertEquals(ValidationScope.ERROR, messages.get(1).getScope()); -// Assert.assertEquals("Bateau", messages.get(1).getFieldName()); -// Assert.assertEquals("Le bateau sélectionné est désactivé.", messages.get(1).getMessage()); -// -// Assert.assertEquals(ValidationScope.WARNING, messages.get(2).getScope()); -// Assert.assertEquals("Capitaine", messages.get(2).getFieldName()); -// Assert.assertEquals("Pas de capitaine sélectionné.", messages.get(2).getMessage()); -// -// Assert.assertEquals(ValidationScope.WARNING, messages.get(3).getScope()); -// Assert.assertEquals("Saisisseur", messages.get(3).getFieldName()); -// Assert.assertEquals("Pas de saisisseur sélectionné.", messages.get(3).getMessage()); -// -// Assert.assertEquals(ValidationScope.WARNING, messages.get(4).getScope()); -// Assert.assertEquals("Port d'arrivée", messages.get(4).getFieldName()); -// Assert.assertEquals("Pas de port d'arrivé sélectionné.", messages.get(4).getMessage()); - - - } - -} diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java index 25136f5..8750114 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySimpleSpeedValidator.java @@ -170,10 +170,12 @@ public class ActivitySimpleSpeedValidator extends FieldValidatorSupport { return "activitySimpleSpeed"; } + //FIXME protected String decorate(ActivitySeine activitySeine) { return activitySeine.toString(); } + //FIXME protected String decorate(GPSPoint currentPoint) { return currentPoint.toString(); } diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java index 3df46cb..858242b 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/ActivitySpeedValidator.java @@ -96,10 +96,12 @@ public class ActivitySpeedValidator extends FieldValidatorSupport { return invalidActivity; } + //FIXME protected String decorate(ActivitySeine activitySeine) { return activitySeine.toString(); } + //FIXME protected String decorate(GPSPoint currentPoint) { return currentPoint.toString(); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 70d655bc69f6aa77de3536ace620ad9b929eb88a Merge: d87b480 ac1f0ff Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 3 16:16:35 2015 +0200 Tout sur develop (mais il reste encore à gerer les traductions des messages) See #7493 Merge branch 'feature/7493' into develop .../ird/observe/entities/seine/ActivitySeines.java | 160 +++++++ .../src/main/xmi/observe-common.properties | 1 + .../src/main/xmi/observe-longline.properties | 1 + .../src/main/xmi/observe-seine.properties | 1 + observe-services-api/pom.xml | 5 + .../actions/validate/ValidateDataRequest.java | 54 +++ .../actions/validate/ValidateDataResult.java | 32 ++ .../validate/ValidateReferentialsRequest.java | 55 +++ .../validate/ValidateReferentialsResult.java | 32 ++ .../actions/validate/ValidateResultForDtoType.java | 28 ++ .../service/actions/validate/ValidateService.java | 25 ++ .../actions/validate/ValidationMessage.java | 45 ++ .../actions/validate/ValidationResultForDto.java | 34 ++ observe-services-topia/pom.xml | 9 + .../ird/observe/services/ObserveServiceTopia.java | 33 ++ .../service/actions/validate/ObserveValidator.java | 166 +++++++ .../actions/validate/ValidateServiceTopia.java | 226 ++++++++++ .../actions/validate/ValidationDataContext.java | 181 ++++++++ .../validate/ValidationMessageDetector.java | 489 +++++++++++++++++++++ .../service/actions/validate/ValidatorsMap.java | 121 +++++ .../actions/validate/ValidateServiceTopiaTest.java | 207 +++++++++ observe-validation/pom.xml | 4 +- .../field/ActivityDebutDePecheSaneValidator.java | 9 +- .../field/ActivityFinDePecheSaneValidator.java | 11 +- .../field/ActivityFinDeVeilleExistsValidator.java | 3 +- .../field/ActivitySimpleSpeedValidator.java | 27 +- .../validation/field/ActivitySpeedValidator.java | 30 +- .../validation/field/OpenableFieldValidator.java | 138 ------ .../field/RouteActivitysFieldValidator.java | 7 +- .../field/SetLonglineUniqueHomeIdValidator.java | 14 +- .../field/SetLonglineUniqueNumberValidator.java | 14 +- .../field/VesselActivityFieldValidator.java | 49 ++- .../TripLongline-n1-update-warning-validation.xml | 10 +- .../seine/Route-n1-update-warning-validation.xml | 6 +- .../TripSeine-n1-update-warning-validation.xml | 6 +- .../src/main/resources/validators.xml | 2 +- .../validation/BeanValidatorDetectorTest.java | 4 +- .../field/ActivitySeineSpeedValidatorTest.java | 3 +- .../field/OpenableEntityFieldValidatorTest.java | 82 ---- .../seine/TripSeine-testOpen-error-validation.xml | 32 -- pom.xml | 2 +- 41 files changed, 2012 insertions(+), 346 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm