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>.