branch feature/7493 updated (4e379a0 -> a8e1954)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7493 in repository observe. See http://git.codelutin.com/observe.git from 4e379a0 ajout du test du service de validation (refs #7493) new ace80f4 Ajout FIXME new dae6974 Ajout d'une option pour configurer l'adminApiKey qui autorise d'accéder à la configuration new ada11f2 Ajout de propertyChange listener sur les entités (See #7493) new f84711c Implantation du service de validation (See #7493) new a8e1954 Debut d'intégration des validateurs d'entités (See #7493) The 5 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 a8e1954bc637f26cccd0f561d4e462f8170d8b23 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 f84711ccea03755362968cfb6bbc726bf3411b23 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 23:32:01 2015 +0200 Implantation du service de validation (See #7493) commit ada11f27246f8281c6511c0dce9fdad18b194feb 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 dae69741631bfc41af6896c8385fa244697d5507 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 02:28:34 2015 +0200 Ajout d'une option pour configurer l'adminApiKey qui autorise d'accéder à la configuration commit ace80f4717c93f659a7d3922be7e6d001b93ffc0 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 15:34:49 2015 +0200 Ajout FIXME Summary of changes: .../web/InvalidAdminKeyApiException.java | 21 ++ .../application/web/ObserveWebMotionFilter.java | 13 +- .../ObserveWebApplicationConfiguration.java | 3 + .../ObserveWebApplicationConfigurationOption.java | 1 + .../web/controller/v1/ConfigurationController.java | 7 + .../web/request/ObserveWebRequestContext.java | 14 +- observe-application-web/src/main/resources/mapping | 2 +- .../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 + .../services/ObserveServiceInitializer.java | 1 + .../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 - observe-services-topia/pom.xml | 5 + .../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 ------ 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 +- 57 files changed, 1513 insertions(+), 1194 deletions(-) create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/InvalidAdminKeyApiException.java 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/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-api/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationService.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationMessage.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationRequest.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDto.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationResultForDtoType.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationService.java delete mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationContext.java delete mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/operation/ValidationScope.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/ValidationContext.java rename observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/{validation => validate}/ValidationMessageDetector.java (58%) create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopia.java rename observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/{validation => validate}/ValidatorsMap.java (74%) delete mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopia.java create mode 100644 observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validate/ValidationServiceTopiaTest.java delete mode 100644 observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/validation/ValidationServiceTopiaTest.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 feature/7493 in repository observe. See http://git.codelutin.com/observe.git commit ace80f4717c93f659a7d3922be7e6d001b93ffc0 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 15:34:49 2015 +0200 Ajout FIXME --- .../src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java index c201fc6..7e15004 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java @@ -59,6 +59,7 @@ public class ObserveServiceInitializer { /** * Le répertoire où créer les répertoires temporaires. + * FIXME A revoir car dans le cadre d'un appel distant cela n'a pas de sens. */ protected File temporaryDirectoryRoot; -- 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 feature/7493 in repository observe. See http://git.codelutin.com/observe.git commit dae69741631bfc41af6896c8385fa244697d5507 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Sep 2 02:28:34 2015 +0200 Ajout d'une option pour configurer l'adminApiKey qui autorise d'accéder à la configuration --- .../web/InvalidAdminKeyApiException.java | 21 +++++++++++++++++++++ .../application/web/ObserveWebMotionFilter.java | 13 +++++++++++-- .../ObserveWebApplicationConfiguration.java | 3 +++ .../ObserveWebApplicationConfigurationOption.java | 1 + .../web/controller/v1/ConfigurationController.java | 7 +++++++ .../web/request/ObserveWebRequestContext.java | 14 +++++++++++++- observe-application-web/src/main/resources/mapping | 2 +- 7 files changed, 57 insertions(+), 4 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/InvalidAdminKeyApiException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/InvalidAdminKeyApiException.java new file mode 100644 index 0000000..331ce44 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/InvalidAdminKeyApiException.java @@ -0,0 +1,21 @@ +package fr.ird.observe.application.web; + +/** + * Created on 02/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidAdminKeyApiException extends Exception { + + private static final long serialVersionUID = 1L; + + protected final String adminApiKey; + + public InvalidAdminKeyApiException(String adminApiKey) { + this.adminApiKey = adminApiKey; + } + + public String getAdminApiKey() { + return adminApiKey; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index c54892e..e34a42d 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -24,7 +24,7 @@ import java.util.Locale; */ public class ObserveWebMotionFilter extends WebMotionFilter { - public void inject(HttpContext context) throws InvalidAuthenticationTokenException, UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException { + public void inject(HttpContext context) throws InvalidAuthenticationTokenException, UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException, InvalidAdminKeyApiException { ObserveWebApplicationContext applicationContext = ObserveWebApplicationContext.getApplicationContext(context); @@ -34,7 +34,16 @@ public class ObserveWebMotionFilter extends WebMotionFilter { Locale applicationLocale = getApplicationLocale(request); ReferentialLocale referentialLocale = getReferentialLocale(request); - ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, securityContext, applicationLocale, referentialLocale); + + String adminApiKey = getRequestHeaderOrParameterValueOrNull(request, "adminApiKey"); + + if (adminApiKey != null) { + String configurationAdminKey = applicationContext.getApplicationConfiguration().getAdminApiKey(); + if (!configurationAdminKey.equals(adminApiKey)) { + throw new InvalidAdminKeyApiException(adminApiKey); + } + } + ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, securityContext, applicationLocale, referentialLocale, adminApiKey); ObserveWebRequestContext.setRequestContext(context, requestContext); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java index eea7653..8570f7b 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java @@ -98,6 +98,9 @@ public class ObserveWebApplicationConfiguration { return applicationConfig.getOptionAsInt(ObserveWebApplicationConfigurationOption.SESSION_EXPIRATION_DELAY.getKey()); } + public String getAdminApiKey() { + return applicationConfig.getOption(ObserveWebApplicationConfigurationOption.ADMIN_API_KEY.getKey()); + } public void init(String... args) { if (log.isInfoEnabled()) { diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java index b863bc8..3783ac2 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java @@ -25,6 +25,7 @@ public enum ObserveWebApplicationConfigurationOption implements ConfigOptionDef BUILD_VERSION("observeweb.build.version", n("observeweb.build.version.description"), "", Version.class), BUILD_DATE("observeweb.build.date", n("observeweb.build.date.description"), "", String.class), BUILD_NUMBER("observeweb.build.number", n("observeweb.build.number.description"), "", String.class), + ADMIN_API_KEY("observeweb.adminApiKey", n("observeweb.adminApiKey.description"), "changeme", String.class), DEV_MODE("observeweb.devMode", n("observeweb.devMode.description"), "true", boolean.class), BASE_DIRECTORY("observeweb.baseDirectory", n("observeweb.baseDirectory.description"), "/var/local/observeweb", File.class), diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java index 5a2d4da..7803048 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java @@ -6,6 +6,7 @@ import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; import fr.ird.observe.application.web.configuration.user.ObserveWebUsersHelper; import fr.ird.observe.application.web.controller.ObserveWebMotionController; import org.apache.commons.io.IOUtils; +import org.debux.webmotion.server.WebMotionContextable; import org.debux.webmotion.server.render.Render; import java.io.IOException; @@ -19,6 +20,12 @@ import java.io.StringWriter; */ public class ConfigurationController extends ObserveWebMotionController { + @Override + public void setContextable(WebMotionContextable contextable) { + super.setContextable(contextable); + getRequestContext().checkAdminApiKeyIsPresent(); + } + public Render mapping() { InputStream mappingUrl = getClass().getResourceAsStream("/mapping"); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java index 4dc0c8e..0eec00b 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -38,18 +38,26 @@ public class ObserveWebRequestContext { protected final ReferentialLocale referentialLocale; + protected final Optional<String> optionalAdminApiKey; + protected final Optional<ObserveWebRequestSecurityContext> optionalSecurityContext; public ObserveWebRequestContext(ObserveWebApplicationContext applicationContext, ObserveWebRequestSecurityContext optionalSecurityContext, Locale applicationLocale, - ReferentialLocale referentialLocale) { + ReferentialLocale referentialLocale, + String adminApiKey) { this.applicationContext = applicationContext; this.applicationLocale = applicationLocale; this.referentialLocale = referentialLocale; + this.optionalAdminApiKey = Optional.fromNullable(adminApiKey); this.optionalSecurityContext = Optional.fromNullable(optionalSecurityContext); } + public Optional<String> getOptionalAdminApiKey() { + return optionalAdminApiKey; + } + public ObserveWebApplicationContext getApplicationContext() { return applicationContext; } @@ -78,6 +86,10 @@ public class ObserveWebRequestContext { Preconditions.checkState(optionalSecurityContext.isPresent()); } + public void checkAdminApiKeyIsPresent() { + Preconditions.checkState(optionalAdminApiKey.isPresent()); + } + public ObserveDataSourceConfiguration getDataSourceConfiguration() { checkSecurityContextIsPresent(); return optionalSecurityContext.get().getDataSourceConfiguration(); diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index df7804d..0fdc07a 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -40,7 +40,7 @@ default.render=fr.ird.observe.application.web.ObserveWebMotionRender [actions] -GET /api/v1/configuration/{method} ConfigurationController.{method} +GET /admin/configuration/{method} ConfigurationController.{method} GET,POST /api/v1/referential/{method} ReferentialServiceController.{method} GET,POST /api/v1/dataSource/{method} DataSourceServiceController.{method} -- 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 feature/7493 in repository observe. See http://git.codelutin.com/observe.git commit ada11f27246f8281c6511c0dce9fdad18b194feb 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 feature/7493 in repository observe. See http://git.codelutin.com/observe.git commit f84711ccea03755362968cfb6bbc726bf3411b23 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 feature/7493 in repository observe. See http://git.codelutin.com/observe.git commit a8e1954bc637f26cccd0f561d4e462f8170d8b23 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>.
participants (1)
-
codelutin.com scm