diff --git a/.gitignore b/.gitignore index f90abb3a7c..3ae74e4d13 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ atlassian-ide-plugin.xml .project .settings .factorypath +.checkstyle .externalToolBuilders maven-eclipse.xml @@ -46,3 +47,7 @@ maven-eclipse.xml *.log .clover .DS_Store + +# Maven wrapper files +.mvn +mvnw* diff --git a/.travis.yml b/.travis.yml index 1729ded0d8..c2620ec715 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ install: - mvn -N io.takari:maven:wrapper - ./mvnw -v # first run to download all the Maven dependencies without logging - - travis_wait ./mvnw -B -q -DskipTests=true install + - travis_wait ./mvnw -s settings-example.xml -B -q -DskipTests=true install before_script: script: - - ./mvnw clean verify + - ./mvnw -s settings-example.xml clean verify diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000..246e9cb2d3 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,545 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ + +import groovy.transform.Field + +/* + * See https://github.com/hibernate/hibernate-jenkins-pipeline-helpers + */ +@Library('hibernate-jenkins-pipeline-helpers') _ + +import org.hibernate.jenkins.pipeline.helpers.job.JobHelper +import org.hibernate.jenkins.pipeline.helpers.alternative.AlternativeMultiMap + +/* + * WARNING: DO NOT IMPORT LOCAL LIBRARIES HERE. + * + * By local, I mean libraries whose files are in the same Git repository. + * + * The Jenkinsfile is protected and will not be executed if modified in pull requests from external users, + * but other local library files are not protected. + * A user could potentially craft a malicious PR by modifying a local library. + * + * See https://blog.grdryn.me/blog/jenkins-pipeline-trust.html for a full explanation, + * and a potential solution if we really need local libraries. + * Alternatively we might be able to host libraries in a separate GitHub repo and configure + * them in the GUI: see https://ci.hibernate.org/job/hibernate-validator/configure, "Pipeline Libraries". + */ + +/* + * See https://github.com/hibernate/hibernate-jenkins-pipeline-helpers for the documentation + * of the helpers library used in this Jenkinsfile, + * and for help writing Jenkinsfiles. + * + * ### Jenkins configuration + * + * #### Jenkins plugins + * + * This file requires the following plugins in particular: + * + * - everything required by the helpers library (see the org.hibernate.(...) imports for a link to its documentation) + * - https://plugins.jenkins.io/pipeline-github for the trigger on pull request comments + * + * #### Script approval + * + * If not already done, you will need to allow the following calls in /scriptApproval/: + * + * - everything required by the helpers library (see the org.hibernate.(...) imports for a link to its documentation) + * + * ### Integrations + * + * ### Job configuration + * + * This Jenkinsfile gets its configuration from four sources: + * branch name, environment variables, a configuration file, and credentials. + * All configuration is optional for the default build (and it should stay that way), + * but some features require some configuration. + * + * #### Branch name + * + * See the org.hibernate.(...) imports for a link to the helpers library documentation, + * which explains the basics. + * + * #### Environment variables + * + * No particular environment variables is necessary. + * + * #### Job configuration file + * + * See the org.hibernate.(...) imports for a link to the helpers library documentation, + * which explains the basic structure of this file and how to set it up. + * + * Below is the additional structure specific to this Jenkinsfile: + * + */ + +@Field final String DEFAULT_JDK_TOOL = 'OracleJDK8 Latest' +@Field final String MAVEN_TOOL = 'Apache Maven 3.2' + +// Default node pattern, to be used for resource-intensive stages. +// Should not include the controller node. +@Field final String NODE_PATTERN_BASE = 'Worker&&Containers' +// Quick-use node pattern, to be used for very light, quick, and environment-independent stages, +// such as sending a notification. May include the controller node in particular. +@Field final String QUICK_USE_NODE_PATTERN = 'Controller||Worker' + +@Field AlternativeMultiMap environments +@Field JobHelper helper + +@Field boolean enableDefaultBuild = false +@Field boolean enableDefaultBuildIT = false + +this.helper = new JobHelper(this) + +helper.runWithNotification { + + stage('Configure') { + // We want to make sure that if we are building a PR that the branch name will not require any escaping of symbols in it. + // Otherwise, it may lead to cryptic build errors. + if (helper.scmSource.branch.name && !(helper.scmSource.branch.name ==~ /^[\w\d\/\\_\-\.]+$/)) { + throw new IllegalArgumentException(""" + Branch name ${helper.scmSource.branch.name} contains unexpected symbols. + Only characters, digits and -_.\\/ symbols are allowed in the branch name. + Change the branch name and open a new Pull Request. + """) + } + + requireApprovalForPullRequest 'hibernate' + + this.environments = AlternativeMultiMap.create([ + jdk: [ + new JdkBuildEnvironment(testJavaVersion: '8', testCompilerTool: 'OracleJDK8 Latest', + condition: TestCondition.BEFORE_MERGE, + isDefault: true), + + // We want to enable preview features when testing newer builds of OpenJDK: + // even if we don't use these features, just enabling them can cause side effects + // and it's useful to test that. + new JdkBuildEnvironment(testJavaVersion: '9', testCompilerTool: 'OracleJDK 9 Latest', + testLauncherArgs: '--enable-preview', + condition: TestCondition.AFTER_MERGE) + ], + wildflyTck: [ + new WildFlyTckBuildEnvironment(testJavaVersion: '8', testCompilerTool: 'OracleJDK8 Latest', + condition: TestCondition.ON_DEMAND) + ], + sigtest: [ + new SigTestBuildEnvironment(testJavaVersion: '8', jdkTool: 'OracleJDK8 Latest', + condition: TestCondition.BEFORE_MERGE) + ] + ]) + + helper.configure { + configurationNodePattern QUICK_USE_NODE_PATTERN + file 'job-configuration.yaml' + jdk { + defaultTool DEFAULT_JDK_TOOL + } + maven { + defaultTool MAVEN_TOOL + producedArtifactPattern "org/hibernate/*" + } + } + + properties([ + buildDiscarder( + logRotator(daysToKeepStr: '30', numToKeepStr: '10') + ), + disableConcurrentBuilds(abortPrevious: true), + pipelineTriggers( + // HSEARCH-3417: do not add snapshotDependencies() here, this was known to cause problems. + [ + issueCommentTrigger('.*test this please.*') + ] + + helper.generateUpstreamTriggers() + ), + helper.generateNotificationProperty(), + parameters([ + choice( + name: 'ENVIRONMENT_SET', + choices: """AUTOMATIC +DEFAULT +SUPPORTED +ALL""", + description: """A set of environments that must be checked. +'AUTOMATIC' picks a different set of environments based on the branch name. +'DEFAULT' means a single build with the default environment expected by the Maven configuration, +while other options will trigger multiple Maven executions in different environments.""" + ), + string( + name: 'ENVIRONMENT_FILTER', + defaultValue: '', + trim: true, + description: """A regex filter to apply to the environments that must be checked. +If this parameter is non-empty, ENVIRONMENT_SET will be ignored and environments whose tag matches the given regex will be checked. +Some useful filters: 'default', 'jdk', 'jdk-10', 'eclipse'. +""" + ) + ]) + ]) + + if (params.ENVIRONMENT_FILTER) { + keepOnlyEnvironmentsMatchingFilter(params.ENVIRONMENT_FILTER) + } + else { + keepOnlyEnvironmentsFromSet(params.ENVIRONMENT_SET) + } + + // Determine whether ITs need to be run in the default build + enableDefaultBuildIT = environments.content.any { key, envSet -> + return envSet.enabled.contains(envSet.default) + } + // No need to re-test default environments separately, they will be tested as part of the default build if needed + environments.content.each { key, envSet -> + envSet.enabled.remove(envSet.default) + } + + if ( enableDefaultBuildIT && params.LEGACY_IT ) { + echo "Enabling legacy integration tests in default environment due to explicit request" + enableDefaultBuildLegacyIT = true + } + + enableDefaultBuild = + enableDefaultBuildIT || + environments.content.any { key, envSet -> envSet.enabled.any { buildEnv -> buildEnv.requiresDefaultBuildArtifacts() } } + + echo """Branch: ${helper.scmSource.branch.name} +PR: ${helper.scmSource.pullRequest?.id} +params.ENVIRONMENT_SET: ${params.ENVIRONMENT_SET} +params.ENVIRONMENT_FILTER: ${params.ENVIRONMENT_FILTER} + +Resulting execution plan: + enableDefaultBuild=$enableDefaultBuild + enableDefaultBuildIT=$enableDefaultBuildIT + environments=${environments.enabledAsString} +""" + } + + stage('Default build') { + if (!enableDefaultBuild) { + echo 'Skipping default build and integration tests in the default environment' + helper.markStageSkipped() + return + } + runBuildOnNode { + withMavenWorkspace { + mvn """ \ + clean install \ + --fail-at-end \ + -Pdist \ + -Pcoverage \ + -Pjqassistant -Pci-build \ + ${enableDefaultBuildIT ? '' : '-DskipITs'} \ + ${toTestJdkArg(environments.content.jdk.default)} \ + """ + + dir(helper.configuration.maven.localRepositoryPath) { + stash name:'default-build-result', includes:"org/hibernate/**" + } + } + } + } + + stage('Non-default environments') { + Map parameters = [:] + + // Test with multiple JDKs + environments.content.jdk.enabled.each { JdkBuildEnvironment buildEnv -> + parameters.put(buildEnv.tag, { + runBuildOnNode { + withMavenWorkspace { + mavenNonDefaultBuild buildEnv, """ \ + clean install \ + """ + } + } + }) + } + + // Run the TCK with WildFly in multiple environments + environments.content.wildflyTck.enabled.each { WildFlyTckBuildEnvironment buildEnv -> + parameters.put(buildEnv.tag, { + runBuildOnNode { + withMavenWorkspace { + mavenNonDefaultBuild buildEnv, """ \ + clean install \ + -pl tck-runner \ + -Dincontainer -Dincontainer-prepared \ + """ + } + } + }) + } + + // Run the TCK signature test + environments.content.sigtest.enabled.each { SigTestBuildEnvironment buildEnv -> + parameters.put(buildEnv.tag, { + runBuildOnNode { + withMavenWorkspace(jdk: buildEnv.jdkTool) { + mavenNonDefaultBuild buildEnv, """ \ + clean install \ + -pl tck-runner \ + -Psigtest \ + -Denforcer.skip=true \ + -DskipTests=true -Dcheckstyle.skip=true \ + -DdisableDistributionBuild=true -DdisableDocumentationBuild=true \ + -Dscan=false -Dno-build-cache \ + """ + } + } + }) + } + + if (parameters.isEmpty()) { + echo 'Skipping builds in non-default environments' + helper.markStageSkipped() + } + else { + parameters.put('failFast', false) + parallel(parameters) + } + } +} // End of helper.runWithNotification + +// Job-specific helpers + +enum TestCondition { + // For environments that are expected to work correctly + // before merging into main or maintenance branches. + // Tested on main and maintenance branches, on feature branches, and for PRs. + BEFORE_MERGE, + // For environments that are expected to work correctly, + // but are considered too resource-intensive to test them on pull requests. + // Tested on main and maintenance branches only. + // Not tested on feature branches or PRs. + AFTER_MERGE, + // For environments that may not work correctly. + // Only tested when explicitly requested through job parameters. + ON_DEMAND; + + // Work around JENKINS-33023 + // See https://issues.jenkins-ci.org/browse/JENKINS-33023?focusedCommentId=325738&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-325738 + public TestCondition() {} +} + +abstract class BuildEnvironment { + boolean isDefault = false + TestCondition condition + String testJavaVersion + String testCompilerTool + String testLauncherTool + String testLauncherArgs + String toString() { getTag() } + abstract String getTag() + boolean isDefault() { isDefault } + boolean requiresDefaultBuildArtifacts() { true } + boolean generatesCoverage() { true } +} + +class JdkBuildEnvironment extends BuildEnvironment { + @Override + String getTag() { "jdk-$testJavaVersion" } + @Override + boolean requiresDefaultBuildArtifacts() { false } +} + +class WildFlyTckBuildEnvironment extends BuildEnvironment { + @Override + String getTag() { "wildfly-tck-jdk$testJavaVersion" } + @Override + boolean requiresDefaultBuildArtifacts() { true } +} + +class SigTestBuildEnvironment extends BuildEnvironment { + String jdkTool + @Override + String getTag() { "sigtest-jdk$testJavaVersion" } + @Override + boolean requiresDefaultBuildArtifacts() { true } + boolean generatesCoverage() { false } +} + +void keepOnlyEnvironmentsMatchingFilter(String regex) { + def pattern = /$regex/ + + boolean enableDefault = ('default' =~ pattern) + + environments.content.each { key, envSet -> + envSet.enabled.removeAll { buildEnv -> + !(buildEnv.tag =~ pattern) && !(envSet.default == buildEnv && enableDefault) + } + } +} + +void keepOnlyEnvironmentsFromSet(String environmentSetName) { + boolean enableDefaultEnv = false + boolean enableBeforeMergeEnvs = false + boolean enableAfterMergeEnvs = false + boolean enableOnDemandEnvs = false + switch (environmentSetName) { + case 'DEFAULT': + enableDefaultEnv = true + break + case 'SUPPORTED': + enableDefaultEnv = true + enableBeforeMergeEnvs = true + enableAfterMergeEnvs = true + break + case 'ALL': + enableDefaultEnv = true + enableBeforeMergeEnvs = true + enableAfterMergeEnvs = true + enableOnDemandEnvs = true + break + case 'AUTOMATIC': + if (helper.scmSource.pullRequest) { + echo "Building pull request '$helper.scmSource.pullRequest.id'" + enableDefaultEnv = true + enableBeforeMergeEnvs = true + } else if (helper.scmSource.branch.primary) { + echo "Building primary branch '$helper.scmSource.branch.name'" + enableDefaultEnv = true + enableBeforeMergeEnvs = true + enableAfterMergeEnvs = true + echo "Legacy integration tests are enabled for the default build environment." + enableDefaultBuildLegacyIT = true + } else { + echo "Building feature branch '$helper.scmSource.branch.name'" + enableDefaultEnv = true + enableBeforeMergeEnvs = true + } + break + default: + throw new IllegalArgumentException( + "Unknown value for param 'ENVIRONMENT_SET': '$environmentSetName'." + ) + } + + // Filter environments + + environments.content.each { key, envSet -> + envSet.enabled.removeAll { buildEnv -> ! ( + enableDefaultEnv && buildEnv.isDefault || + enableBeforeMergeEnvs && buildEnv.condition == TestCondition.BEFORE_MERGE || + enableAfterMergeEnvs && buildEnv.condition == TestCondition.AFTER_MERGE || + enableOnDemandEnvs && buildEnv.condition == TestCondition.ON_DEMAND ) } + } +} + +void runBuildOnNode(Closure body) { + runBuildOnNode( NODE_PATTERN_BASE, body ) +} + +void runBuildOnNode(String label, Closure body) { + node( label ) { + timeout( [time: 1, unit: 'HOURS'], body ) + } +} + +void mavenNonDefaultBuild(BuildEnvironment buildEnv, String args, String projectPath = '.') { + if ( buildEnv.requiresDefaultBuildArtifacts() ) { + dir(helper.configuration.maven.localRepositoryPath) { + unstash name:'default-build-result' + } + } + + // Add a suffix to tests to distinguish between different executions + // of the same test in different environments in reports + def testSuffix = buildEnv.tag.replaceAll('[^a-zA-Z0-9_\\-+]+', '_') + + dir(projectPath) { + mvn """ \ + -Dsurefire.environment=$testSuffix \ + ${toTestJdkArg(buildEnv)} \ + --fail-at-end \ + $args \ + """ + } + + if ( buildEnv.generatesCoverage() ) { + // We allow an empty stash here since it can happen that a PR build is triggered + // but because of incremental build there will be no tests executed and no jacoco files generated: + stash name: "${buildEnv.tag}-build-jacoco-reports", includes:"**/jacoco.exec", allowEmpty: true + } +} + +String toTestJdkArg(BuildEnvironment buildEnv) { + String args = '' + + String testCompilerTool = buildEnv.testCompilerTool + if ( testCompilerTool && DEFAULT_JDK_TOOL != testCompilerTool ) { + def testCompilerToolPath = tool(name: testCompilerTool, type: 'jdk') + args += " -Djava-version.test.compiler.java_home=$testCompilerToolPath" + } + // Note: the POM uses the java_home of the test compiler for the test launcher by default. + String testLauncherTool = buildEnv.testLauncherTool + if ( testLauncherTool && DEFAULT_JDK_TOOL != testLauncherTool ) { + def testLauncherToolPath = tool(name: testLauncherTool, type: 'jdk') + args += " -Djava-version.test.launcher.java_home=$testLauncherToolPath" + } + String defaultVersion = environments.content.jdk.default.testJavaVersion + String version = buildEnv.testJavaVersion + if ( defaultVersion != version ) { + args += " -Djava-version.test.release=$version" + } + + if ( buildEnv.testLauncherArgs ) { + args += " -Dsurefire.jvm.args.commandline=${buildEnv.testLauncherArgs}" + } + + return args +} + +void withMavenWorkspace(Closure body) { + withMavenWorkspace([:], body) +} + +void withMavenWorkspace(Map args, Closure body) { + args.put("options", [ + // Artifacts are not needed and take up disk space + artifactsPublisher(disabled: true), + // stdout/stderr for successful tests is not needed and takes up disk space + // we archive test results and stdout/stderr as part of the build scan anyway, + // see https://develocity.commonhaus.dev/scans?search.rootProjectNames=Hibernate%20Validator + junitPublisher(disabled: true) + ]) + helper.withMavenWorkspace(args, body) +} + +void mvn(String args) { + sh "mvn $args" +} + +// try-finally construct that properly suppresses exceptions thrown in the finally block. +def tryFinally(Closure main, Closure ... finallies) { + def mainFailure = null + try { + main() + } + catch (Throwable t) { + mainFailure = t + throw t + } + finally { + finallies.each {it -> + try { + it() + } + catch (Throwable t) { + if ( mainFailure ) { + mainFailure.addSuppressed( t ) + } + else { + mainFailure = t + } + } + } + } + if ( mainFailure ) { // We may reach here if only the "finally" failed + throw mainFailure + } +} diff --git a/README.md b/README.md index bbffa97dcf..416293a55f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Hibernate Validator -*Version: 5.3.0.Alpha1, 15.01.2016* +*Version: 5.3.6.Final - 19-10-2017* ## What is it? @@ -35,7 +35,7 @@ Logging will delegate any log requests to that provider. org.hibernate hibernate-validator - 5.3.0.Alpha1 + 5.3.6.SP1 You also need an API and implementation of the Unified Expression Language. These dependencies must be explicitly added in an SE environment. @@ -59,7 +59,7 @@ extension by adding the following dependency: org.hibernate hibernate-validator-cdi - 5.3.0.Alpha1 + 5.3.6.Final * _hibernate-validator-annotation-processor-<version>.jar_ is an optional jar which can be integrated with your build @@ -76,7 +76,7 @@ the Apache Software License 2.0. Refer to license.txt for more information. You can build Hibernate Validator from source by cloning the git repository git://github.com/hibernate/hibernate-validator.git. You will also need a JDK 8 and Maven 3 (>= 3.0.3). With these prerequisites in place you can compile the source via - mvn clean install + mvn -s settings-example.xml clean install There are more build options available as well. For more information refer to [Contributing to Hibernate Validator](http://hibernate.org/validator/contribute/). @@ -84,19 +84,23 @@ There are more build options available as well. For more information refer to [C To build Hibernate Validator with JDK 9, export the following environment variable: - export MAVEN_OPTS="-addmods java.annotations.common,java.xml.bind" + export MAVEN_OPTS="--add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED" Then the build can be started like this: - mvn clean install -DdisableDocumentationBuild=true -DdisableDistributionBuild + mvn -s settings-example.xml clean install -The documentation and distribution modules are known to not work on Java 9 for the time being, hence they need to be excluded. -Also the integration tests on WildFly will fail on Java 9 currently, hence this "integration" module is excluded automatically when building on JDK 9. +Also the OSGi integration tests will fail on Java 9 currently, hence the "osgi" module is excluded automatically when building on JDK 9. We are waiting for the release of a Karaf version supporting the latest Java 9 builds. +Here are the reasons why we added the various --add-opens options: + + * java.security: required by wildfly-maven-plugin:execute-commands (for the WildFly integration tests and the TCK runner running in container mode) + * java.lang: required by JRuby for Asciidoc processing + * java.util: required by the gmavenplus script used to start WildFly ## Continuous Integration -The [official Continuous Integration service for the project](https://hibernate-validator.ci.cloudbees.com/) is hosted at CloudBees. +The official Continuous Integration service for the project is hosted on [ci.hibernate.org](http://ci.hibernate.org/view/Validator/). We provide a `.travis.yml` file so that you can enable CI for your GitHub fork by enabling the build in [your Travis CI account](https://travis-ci.org/). @@ -107,4 +111,5 @@ We provide a `.travis.yml` file so that you can enable CI for your GitHub fork b * [Downloads](http://hibernate.org/validator/downloads/) * [Mailing Lists](http://hibernate.org/community/) * [Issue Tracking](https://hibernate.atlassian.net/browse/HV) -* [Continuous Integration](https://hibernate-validator.ci.cloudbees.com/) [![Build Status](https://hibernate-validator.ci.cloudbees.com/buildStatus/icon?job=HV-5-MASTER)](https://hibernate-validator.ci.cloudbees.com/view/Hibernate%20Validator%205/job/HV-5-MASTER/) +* [Continuous Integration](http://ci.hibernate.org/view/Validator/) | [![Build Status](http://ci.hibernate.org/view/Validator/job/hibernate-validator-master/badge/icon)](http://ci.hibernate.org/view/Validator/job/hibernate-validator-master/) + diff --git a/annotation-processor/pom.xml b/annotation-processor/pom.xml index b57f4b76cf..f9babae1fd 100644 --- a/annotation-processor/pom.xml +++ b/annotation-processor/pom.xml @@ -11,7 +11,7 @@ hibernate-validator-parent org.hibernate - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT ../pom.xml diff --git a/build-config/pom.xml b/build-config/pom.xml index 3e89600681..6ea722bdd9 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -11,7 +11,7 @@ hibernate-validator-parent org.hibernate - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT ../pom.xml diff --git a/build-config/src/main/resources/checkstyle.xml b/build-config/src/main/resources/checkstyle.xml index 8c16ca9c1a..71c808d511 100644 --- a/build-config/src/main/resources/checkstyle.xml +++ b/build-config/src/main/resources/checkstyle.xml @@ -131,7 +131,7 @@ diff --git a/cdi/pom.xml b/cdi/pom.xml index d9c8c74b48..f9120fbfd0 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -11,7 +11,7 @@ hibernate-validator-parent org.hibernate - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT ../pom.xml @@ -174,13 +174,6 @@ - - org.apache.maven.plugins - maven-surefire-plugin - - ${surefire.argLine.extension} - - org.apache.maven.plugins maven-surefire-report-plugin @@ -189,6 +182,25 @@ org.apache.maven.plugins maven-release-plugin + + com.github.siom79.japicmp + japicmp-maven-plugin + + false + + + + + jdk9 + + 9 + + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + diff --git a/changelog.txt b/changelog.txt index 51b156dbfc..d5e14104cb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,152 @@ Hibernate Validator Changelog ============================= +5.3.6.SP1 (2025-06-13) +------------------------- + +** Improvement + * HV-1816 Disable Expression Language by default for custom constraint violations (Partial backport of internal changes only) + +5.3.6.Final (19-10-2017) +------------------------- + +** Bug + * HV-1498 - engine - Privilege escalation when running under the security manager + * HV-1494 - validators - Hibernate Validator specific @NotEmpty used on return type throws an exception + +** Improvement + * HV-1454 - build - Support JDK 9 build 180 + +5.3.5.Final (15-03-2017) +------------------------- + +** Bug + * HV-1284 - build - Reenable testing under the security manager + * HV-1220 - engine - Programmatically defined cross parameter method constraints don't work on method returning void + +** Improvement + * HV-1187 - build, engine - Support JDK9 ea+148 + +** New Feature + * HV-1280 - - Class loading conflict when custom Xerces is part of a deployment + +** Task + * HV-1266 - build - Update build instructions as per latest Java 9 releases + * HV-1210 - build - Upgrade to Groovy 2.4.8 + +5.3.4.Final (08-12-2016) +------------------------- + +** Bug + * HV-1176 - engine - Type argument constraints for Optional are ignored for method parameters and return value if there are no other constraints + * HV-1165 - engine - Use type annotations for Set values with @NotNull annotation on the Set + * HV-1164 - engine - getDynamicPayload(Class type) throws Nullpointerexception + +** Task + * HV-1183 - validators - Upgrade JodaTime to 2.9.5 + +5.3.3.Final (22-11-2016) +------------------------- + +** Bug + * HV-1155 - engine - ClassLoader issues in modularized environments + +5.3.2.Final (10-11-2016) +------------------------- + +** Bug + * HV-1153 - engine - Missing javax.el impl throws a javax.el.ELException instead of a ValidationException + +** Improvement + * HV-1154 - build - Make distribution and documentation buildable with JDK9 + +5.3.1.Final (27-10-2016) +------------------------- + +** Bug + * HV-1140 - engine - StringHelper#decapitalize not working properly on turkish locale + * HV-1134 - documentation - Asciidoc Docbook processing is missing the sourcedir attribute + * HV-1132 - documentation - Force language in documentation tests + * HV-1131 - engine - EL once again a hard requirement + * HV-1032 - engine - Infinite Loop when validating custom type constraint under certain inheritance scheme + * HV-1002 - engine - validateProperty() behaviour for prop paths with a Set/ List inconsistent with validateValue() + +** Improvement + * HV-1130 - build - Ensure 5.3 runs on JDK 9 + * HV-1129 - tests - Upgrade WildFly Arquillian version + * HV-1128 - tests - Enable integration tests on JDK 9 + * HV-1126 - build - Upgrade the plexus-archiver dependency used by the assembly plugin to support JDK9 + +** Task + * HV-1125 - build - Latest Java 9 preview builds need --add-modules instead of -addmods as build option + +5.3.0.Final (11-10-2016) +------------------------- + +** Bug + * HV-1117 - build - Downgrade to surefire and failsafe 2.18.1 + * HV-1109 - documentation - Fix "Using validation groups" example + * HV-1101 - engine - Issues when using XML validation configuration + +** Improvement + * HV-1123 - build - Set up japicmp tooling to create API/SPI change reports + * HV-1121 - engine - Validation error path generation for TYPE_USE annotation + * HV-1112 - translations - ValidationMessages for Slovak + * HV-1098 - tck-runner - Adapt test.policy file of TCK runner for reading "validation.provider" property + +** Task + * HV-1093 - build - Change CI links in README.md and pom.xml + +5.3.0.CR1 (05-09-2016) +------------------------- + +** Bug + * HV-1057 - engine - Group sequences don't honor inheritance relationships properly + * HV-1055 - engine - Default group sequence does not honour group hierarchy + * HV-1068 - engine - Wrong import in MessageDescriptorFormatException + * HV-1071 - engine - HV-1049 prevents annotations in the default package working + * HV-1049 - engine - Don't access annotations from "jdk.internal" package + * HV-1054 - engine - Catch correct exception type in AbstractMessageInterpolator + * HV-1072 - engine - Parameter validation does not stop when group in sequence has cascaded constraint violations. + * HV-1050 - build - Build fails under Windows + * HV-1063 - tests - Upgrade dependencies used by OSGi integration tests + * HV-1080 - engine - Validation of Java 8 Optional throws ClassCastException + * HV-1066 - validators - email domains with a 63 character length fails EmailValidator + * HV-1048 - engine - Correctly interpret version string returned by JDK 9 + * HV-1062 - validators - Use type annotations for map values with @NotNull annotation on the map + * HV-1013 - validators - Validator invokes hashCode() with null mandatory field + * HV-1046 - documentation - Fix example 11.4 in reference guide + * HV-1091 - engine - java.lang.StackOverflowError generated when using too big validation message + * HV-1031 - engine - Type parameter validations are not executed against all elements in a collection if elements contain the same object instance. + +** Improvement + * HV-1038 - build - Update to ClassMate 1.3.0 + * HV-1058 - engine - Avoid repeated retrieval of default group sequence in BeanMetadataImpl#getConstrainedPropertiesAsDescriptors() + * HV-1060 - engine - Include messages for @EAN and @ParameterScriptAssert in Brazilian Portuguese error messages + * HV-1076 - build - Improve Checkstyle configuration + * HV-1081 - build - Reuse the release scripts of OGM to automatize the release process + * HV-1077 - engine - Add missing @Override annotation + * HV-1074 - engine - Add Arabic translation + * HV-1015 - tests - Provide test case template + * HV-1082 - documentation - Upgrade maven-jdocbook-plugin and pressgang to generate valid HTML5 documentation + * HV-1078 - documentation - Update the CONTRIBUTING.md file + * HV-1075 - validators - Update and improve the French translation + * HV-1083 - build - Properly ignore hibernate-noorm-release-scripts directory in the build + * HV-1014 - documentation - Clarify what @ValidPart is in example 2.3 of the reference guide + * HV-1096 - validators - ValidationMessages for Russian + * HV-1086 - build - Update Maven dependencies and align with WildFly 10.1.0.Final + +** New Feature + * HV-1070 - build - Preparatory work for building with Java 9 + * HV-501 - engine - Extend programmatic API to allow alteration of ConstraintValidator list for a given constraint + * HV-1065 - engine - Add hibernate.validator.constraint_mapping_contributor*s* to take a list of contributors and deprecate hibernate.validator.constraint_mapping_contributor + +** Task + * HV-1053 - build - Use WildFly 10.0.0.Final for integration tests + * HV-1052 - build - Upgrade to current version of JBoss logging processor + * HV-1034 - build - Allow compilation using JDK9 + * HV-1064 - tests - Add Travis support + 5.3.0.Alpha1 (15.01.2016) ------------------------- diff --git a/copyright.txt b/copyright.txt index cacd84f5e0..2248e388de 100644 --- a/copyright.txt +++ b/copyright.txt @@ -1,5 +1,6 @@ Adam Stawicki Alaa Nassef +Andrey Derevyanko Andrey Rodionov Benson Margulies Brent Douglas @@ -25,6 +26,7 @@ Henno Vermeulen Jan-Willem Willebrands Jason T. Greene Julien May +Julien Furgerot Juraci Krohling Justin Nauman Kathryn Killebrew @@ -34,9 +36,11 @@ Lee KyoungIl Leonardo Loch Zanivan Lucas Pouzac Mark Hobson +Mert Çalişkan Paolo Perrotta Pete Muir Sanne Grinovero +Sebastian Bayerl Shane Bryzak Shelly McGowan Steve Ebersole diff --git a/distribution/pom.xml b/distribution/pom.xml index 16e2e2ec25..1b143d9762 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -10,7 +10,7 @@ hibernate-validator-parent org.hibernate - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT ../pom.xml @@ -23,6 +23,7 @@ true false + @@ -131,6 +132,7 @@ org.hibernate.validator.ap* + ${javadoc.additional.param} @@ -164,4 +166,15 @@ + + + jdk9 + + 9 + + + --add-modules=${maven-javadoc-plugin.jigsaw.modules} + + + diff --git a/distribution/src/main/assembly/dist.xml b/distribution/src/main/assembly/dist.xml index f3e2a915b6..b03f1c6591 100644 --- a/distribution/src/main/assembly/dist.xml +++ b/distribution/src/main/assembly/dist.xml @@ -87,8 +87,6 @@ license.txt - **/zanata.sh - **/zanata.xml src/main/scripts/** hibernate-noorm-release-scripts/** diff --git a/documentation/pom.xml b/documentation/pom.xml index dec85332fc..1dd3f97ec2 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -11,7 +11,7 @@ hibernate-validator-parent org.hibernate - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT ../pom.xml @@ -25,6 +25,7 @@ false true + -Duser.language=en @@ -95,6 +96,13 @@ + + + org.jruby + jruby-complete + 1.7.26 + + org.apache.maven.plugins @@ -123,99 +131,103 @@ docbook - - - org.asciidoctor - asciidoctor-maven-plugin - - - output-docbook - generate-resources - - process-asciidoc - - - docbook - target/asciidoc-docbook/en-US - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-docbook-images-to-staging - generate-resources - - copy-resources - + + + org.asciidoctor + asciidoctor-maven-plugin + + + output-docbook + generate-resources + + process-asciidoc + + + docbook + target/asciidoc-docbook/en-US + + ${basedir}/src/test/java + ${basedir}/../engine/src/main/java + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-docbook-images-to-staging + generate-resources + + copy-resources + + + ${basedir}/target/docbook/staging/images/images + + + ${basedir}/src/main/asciidoc/images + + + + + + + + org.jboss.maven.plugins + maven-jdocbook-plugin - ${basedir}/target/docbook/staging/images/images - - - ${basedir}/src/main/asciidoc/images - - + ${basedir}/target/asciidoc-docbook + index.xml + en-US + + + html_single + classpath:/xslt/org/hibernate/jdocbook/xslt/xhtml-single.xsl + + index.html + + + html + classpath:/xslt/org/hibernate/jdocbook/xslt/xhtml.xsl + + index.html + + + pdf + classpath:/xslt/org/hibernate/jdocbook/xslt/pdf.xsl + + hibernate_validator_reference.pdf + + + + true + saxon + + + + - + yyyy-MM-dd + + UA-45270411-3 + GTM-NJWS5L + Hibernate + + - - - - - org.jboss.maven.plugins - maven-jdocbook-plugin - - ${basedir}/target/asciidoc-docbook - index.xml - en-US - - - html_single - classpath:/xslt/org/hibernate/jdocbook/xslt/xhtml-single.xsl - - index.html - - - html - classpath:/xslt/org/hibernate/jdocbook/xslt/xhtml.xsl - - index.html - - - pdf - classpath:/xslt/org/hibernate/jdocbook/xslt/pdf.xsl - - hibernate_validator_reference.pdf - - - - true - saxon - - - - - - yyyy-MM-dd - - UA-45270411-3 - GTM-NJWS5L - Hibernate - - - - - - docbook-processing - generate-resources - - resources - generate - - - - - + + + docbook-processing + generate-resources + + resources + generate + + + + + diff --git a/documentation/src/main/asciidoc/ch01.asciidoc b/documentation/src/main/asciidoc/ch01.asciidoc index 59b5ef3ae8..ce9a244061 100644 --- a/documentation/src/main/asciidoc/ch01.asciidoc +++ b/documentation/src/main/asciidoc/ch01.asciidoc @@ -104,6 +104,9 @@ The following shows how to do this via a http://docs.oracle.com/javase/8/docs/te grant codeBase "file:path/to/hibernate-validator-{hvVersion}.jar" { permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.RuntimePermission "accessDeclaredMembers"; + permission java.lang.RuntimePermission "setContextClassLoader"; + + permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers"; // Only needed when working with XML descriptors (validation.xml or XML constraint mappings) permission java.util.PropertyPermission "mapAnyUriToUri", "read"; @@ -321,4 +324,3 @@ To learn more about the validation of beans and properties, just continue readin <>. If you are interested in using Bean Validation for the validation of method pre- and postcondition refer to <>. In case your application has specific validation requirements have a look at <>. - diff --git a/documentation/src/main/asciidoc/ch02.asciidoc b/documentation/src/main/asciidoc/ch02.asciidoc index de129d5f56..0b4629e172 100644 --- a/documentation/src/main/asciidoc/ch02.asciidoc +++ b/documentation/src/main/asciidoc/ch02.asciidoc @@ -152,6 +152,8 @@ When applying constraints on an `Iterable` type argument, Hibernate Validator wi element. <> shows an example of a `List` with a type argument constraint. +In this example, `@ValidPart` is a custom constraint allowed to be used in the `TYPE_USE` context. + [[example-type-arguments-constraints-collections]] .Type argument constraint on `List` ==== @@ -185,7 +187,8 @@ assertEquals( "'null' is not a valid car part.", constraintViolations.iterator().next().getMessage() ); -assertEquals( "parts[1]", constraintViolations.iterator().next().getPropertyPath().toString() ); +assertEquals( "parts[1].", + constraintViolations.iterator().next().getPropertyPath().toString() ); ---- ==== diff --git a/documentation/src/main/asciidoc/ch05.asciidoc b/documentation/src/main/asciidoc/ch05.asciidoc index 0e28b9fdc6..f53a787103 100644 --- a/documentation/src/main/asciidoc/ch05.asciidoc +++ b/documentation/src/main/asciidoc/ch05.asciidoc @@ -183,7 +183,7 @@ assertEquals( // let's go to the vehicle inspection car.setPassedVehicleInspection( true ); -assertEquals( 0, validator.validate( car ).size() ); +assertEquals( 0, validator.validate( car, CarChecks.class ).size() ); // now let's add a driver. He is 18, but has not passed the driving test yet Driver john = new Driver( "John Doe" ); diff --git a/documentation/src/main/asciidoc/ch11.asciidoc b/documentation/src/main/asciidoc/ch11.asciidoc index 2b7724b243..34a1cde088 100644 --- a/documentation/src/main/asciidoc/ch11.asciidoc +++ b/documentation/src/main/asciidoc/ch11.asciidoc @@ -292,7 +292,7 @@ include::{sourcedir}/org/hibernate/validator/referenceguide/chapter11/constraint If you are not bootstrapping a validator factory manually but work with the default factory as configured via _META-INF/validation.xml_ (see <>), -you can add one or more constraint mappings by creating a constraint mapping contributor. +you can add one or more constraint mappings by creating one or several constraint mapping contributors. To do so, implement the `ConstraintMappingContributor` contract: [[example-constraint-mapping-contributor]] @@ -305,7 +305,8 @@ include::{sourcedir}/org/hibernate/validator/referenceguide/chapter11/constraint ==== You then need to specify the fully-qualified class name of the contributor implementation in _META-INF/validation.xml_, -using the property key `hibernate.validator.constraint_mapping_contributor`. +using the property key `hibernate.validator.constraint_mapping_contributors`. You can specify several +contributors by separating them with a comma. [[section-advanced-constraint-composition]] === Advanced constraint composition features @@ -424,7 +425,7 @@ unwrapped to `HibernateConstraintViolation` in order to retrieve the dynamic pay ==== [source, JAVA, indent=0] ---- -include::{sourcedir}/org/hibernate/validator/referenceguide/chapter11/dynamicpayload/DynamicPayloadTest.java[tags=include] +include::{sourcedir}/org/hibernate/validator/referenceguide/chapter11/dynamicpayload/DynamicPayLoadTest.java[tags=include] ---- ==== @@ -810,7 +811,7 @@ definitions. You can use the programmatic constraint declaration API - see [[example-using-constraint-definition-api]] .Adding constraint definitions through the programmatic API -======== +==== [source, JAVA, indent=0] ---- include::{sourcedir}/org/hibernate/validator/referenceguide/chapter11/constraintapi/ConstraintApiTest.java[tags=constraintDefinition] @@ -845,6 +846,7 @@ There are several cases in which Hibernate Validator needs to load resources or * XML descriptors (_META-INF/validation.xml_ as well as XML constraint mappings) * classes specified by name in XML descriptors (e.g. custom message interpolators etc.) * the _ValidationMessages_ resource bundle +* the `ExpressionFactory` implementation used for expression based message interpolation By default Hibernate Validator tries to load these resources via the current thread context classloader. If that's not successful, Hibernate Validator's own classloader will be tried as a fallback. diff --git a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter02/ValidationTest.java b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter02/ValidationTest.java index ec12815a9c..cdfb986a61 100644 --- a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter02/ValidationTest.java +++ b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter02/ValidationTest.java @@ -87,7 +87,7 @@ public void validateListTypeArgumentConstraint() { "'null' is not a valid car part.", constraintViolations.iterator().next().getMessage() ); - assertEquals( "parts[1]", constraintViolations.iterator().next().getPropertyPath().toString() ); + assertEquals( "parts[1].", constraintViolations.iterator().next().getPropertyPath().toString() ); } @Test diff --git a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter05/GroupTest.java b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter05/GroupTest.java index 5ca43d6d97..7b4156d774 100644 --- a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter05/GroupTest.java +++ b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter05/GroupTest.java @@ -39,7 +39,7 @@ public void driveAway() { // let's go to the vehicle inspection car.setPassedVehicleInspection( true ); - assertEquals( 0, validator.validate( car ).size() ); + assertEquals( 0, validator.validate( car, CarChecks.class ).size() ); // now let's add a driver. He is 18, but has not passed the driving test yet Driver john = new Driver( "John Doe" ); diff --git a/engine-jdk8-tests/pom.xml b/engine-jdk8-tests/pom.xml index a04dd88a2d..3d8efd1119 100644 --- a/engine-jdk8-tests/pom.xml +++ b/engine-jdk8-tests/pom.xml @@ -10,7 +10,7 @@ org.hibernate hibernate-validator-parent - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT hibernate-validator-engine-jdk8-tests @@ -61,6 +61,11 @@ javax.el-api provided + + org.glassfish.web + javax.el + provided + + --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED + + + diff --git a/integration/src/test/java/org/hibernate/validator/integration/wildfly/OptionalConstraintsIT.java b/integration/src/test/java/org/hibernate/validator/integration/wildfly/OptionalConstraintsIT.java new file mode 100644 index 0000000000..ac45d166d8 --- /dev/null +++ b/integration/src/test/java/org/hibernate/validator/integration/wildfly/OptionalConstraintsIT.java @@ -0,0 +1,83 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ +package org.hibernate.validator.integration.wildfly; + +import static org.junit.Assert.assertEquals; + +import java.util.Set; + +import javax.inject.Inject; +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import javax.validation.constraints.Future; + +import org.hibernate.validator.constraints.SafeHtml; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.joda.time.DateTime; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Asserts that the constraints based on the JodaTime and JSoup server modules can be used. + * + * @author Gunnar Morling + */ +@RunWith(Arquillian.class) +public class OptionalConstraintsIT { + + private static final String WAR_FILE_NAME = OptionalConstraintsIT.class + .getSimpleName() + ".war"; + + public static class Shipment { + + @Future + public DateTime deliveryDate = new DateTime( 2014, 10, 21, 0, 0, 0, 0 ); + } + + public static class Item { + + @SafeHtml + public String descriptionHtml = " + @@ -335,7 +319,6 @@ org.apache.maven.plugins maven-surefire-plugin - -Xmx1024m -Djava.util.logging.manager=org.jboss.logmanager.LogManager ${surefire.argLine.extension} once incontainer @@ -351,6 +334,7 @@ 9 + --add-opens java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED ${project.build.directory}/test-classes/tck-tests-jdk9.xml diff --git a/tck-runner/src/test/resources/arquillian.xml b/tck-runner/src/test/resources/arquillian.xml index a3e6420779..0370cd97e0 100644 --- a/tck-runner/src/test/resources/arquillian.xml +++ b/tck-runner/src/test/resources/arquillian.xml @@ -20,7 +20,8 @@ ${wildflyTargetDir} - -Xmx1024m -XX:MaxPermSize=512m ${remote.debug} + ${arquillian.javaVmArguments.add-opens} + -Xmx1024m -XX:MaxPermSize=512m ${remote.debug} -Dvalidation.provider=${validation.provider} true diff --git a/tck-runner/src/test/resources/test.policy b/tck-runner/src/test/resources/test.policy index 7c7b72e704..1f737bca49 100644 --- a/tck-runner/src/test/resources/test.policy +++ b/tck-runner/src/test/resources/test.policy @@ -26,7 +26,11 @@ grant codeBase "file:${localRepository}/org/hibernate/hibernate-validator/${project.version}/hibernate-validator-${project.version}.jar" { permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.RuntimePermission "accessDeclaredMembers"; + permission java.lang.RuntimePermission "setContextClassLoader"; + permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers"; + permission java.lang.RuntimePermission "getenv.ORG_HIBERNATE_VALIDATOR_EXPRESSION_LANGUAGE_ENABLED"; + permission java.util.PropertyPermission "org.hibernate.validator.expressionLanguageEnabled", "read"; // JAXB permission java.util.PropertyPermission "mapAnyUriToUri", "read"; }; @@ -36,7 +40,11 @@ grant codeBase "file:${localRepository}/org/hibernate/hibernate-validator/${proj grant codeBase "file:${basedir}/../engine/target/hibernate-validator-${project.version}.jar" { permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.RuntimePermission "accessDeclaredMembers"; + permission java.lang.RuntimePermission "setContextClassLoader"; + permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers"; + permission java.lang.RuntimePermission "getenv.ORG_HIBERNATE_VALIDATOR_EXPRESSION_LANGUAGE_ENABLED"; + permission java.util.PropertyPermission "org.hibernate.validator.expressionLanguageEnabled", "read"; // JAXB permission java.util.PropertyPermission "mapAnyUriToUri", "read"; }; @@ -55,6 +63,10 @@ grant codeBase "file:${localRepository}/org/jboss/logging/jboss-logging/-" { grant codeBase "file:${localRepository}/javax/validation/validation-api/-" { permission java.io.FilePermission "<>", "read"; + + // in some tests this property is accessed by the TCK when the API JAR is on the callstack; the TCK doesn't + // use privileged actions, hence allow this read + permission java.util.PropertyPermission "validation.provider", "read"; }; /* =================== */ @@ -75,6 +87,7 @@ grant codeBase "file:${project.build.directory}/classes" { permission java.util.PropertyPermission "validation.provider", "read"; permission java.io.FilePermission "${localRepository}/org/hibernate/beanvalidation/tck/beanvalidation-tck-tests/${tck.version}/beanvalidation-tck-tests-${tck.version}.jar", "read"; permission java.util.PropertyPermission "user.language", "write"; + permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers"; }; grant codeBase "file:${project.build.directory}/test-classes" { diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 5953422ae9..faa9bca5c8 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -10,7 +10,7 @@ org.hibernate hibernate-validator-parent - 5.3.0-SNAPSHOT + 5.3.6.SP2-SNAPSHOT hibernate-validator-test-utils