From b0170a612bbfd079ac1ccecc0f8cac9452785363 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 29 Aug 2023 13:33:17 +0200 Subject: [PATCH] [MNG-7851] Improve error message when modelVersion is 4.0 (#1219) Improve DefaultModelValidator.compareModelVersions to be able to compare versions which different numbers of segments, allowing it to compare "4", "4.0", and "4.0.0" to each other for example. Signed-off-by: Craig Andrews # Conflicts: # maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java Co-authored-by: Craig Andrews --- .../validation/DefaultModelValidator.java | 10 +++----- .../validation/DefaultModelValidatorTest.java | 10 ++++++++ .../poms/validation/modelVersion-4_0.xml | 25 +++++++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 maven-model-builder/src/test/resources/poms/validation/modelVersion-4_0.xml diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java index 3f7812a29c..c897f7c9ae 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java @@ -1531,16 +1531,14 @@ private static int compareModelVersions(String first, String second) { // we use a dedicated comparator because we control our model version scheme. String[] firstSegments = StringUtils.split(first, "."); String[] secondSegments = StringUtils.split(second, "."); - for (int i = 0; i < Math.min(firstSegments.length, secondSegments.length); i++) { - int result = Long.valueOf(firstSegments[i]).compareTo(Long.valueOf(secondSegments[i])); + for (int i = 0; i < Math.max(firstSegments.length, secondSegments.length); i++) { + int result = Long.valueOf(i < firstSegments.length ? firstSegments[i] : "0") + .compareTo(Long.valueOf(i < secondSegments.length ? secondSegments[i] : "0")); if (result != 0) { return result; } } - if (firstSegments.length == secondSegments.length) { - return 0; - } - return firstSegments.length > secondSegments.length ? -1 : 1; + return 0; } @SuppressWarnings("checkstyle:parameternumber") diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java index 35cef28b09..df311581d5 100644 --- a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java +++ b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java @@ -122,6 +122,16 @@ void testBadModelVersion() throws Exception { assertTrue(result.getFatals().get(0).contains("modelVersion")); } + @Test + void testModelVersionMessage() throws Exception { + SimpleProblemCollector result = + validateRaw("modelVersion-4_0.xml", ModelBuildingRequest.VALIDATION_LEVEL_STRICT); + + assertViolations(result, 0, 1, 0); + + assertTrue(result.getErrors().get(0).contains("'modelVersion' must be one of")); + } + @Test void testMissingArtifactId() throws Exception { SimpleProblemCollector result = validate("missing-artifactId-pom.xml"); diff --git a/maven-model-builder/src/test/resources/poms/validation/modelVersion-4_0.xml b/maven-model-builder/src/test/resources/poms/validation/modelVersion-4_0.xml new file mode 100644 index 0000000000..544331b1f1 --- /dev/null +++ b/maven-model-builder/src/test/resources/poms/validation/modelVersion-4_0.xml @@ -0,0 +1,25 @@ + + + + 4.0 + foo + bar + 0.1 +