diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java b/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java index 4c7476bdc162..4f28cb0f2e32 100644 --- a/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java +++ b/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java @@ -18,6 +18,8 @@ */ package org.apache.maven.toolchain; +import java.util.regex.Pattern; + import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; @@ -66,7 +68,7 @@ private VersionMatcher(String version) { @Override public boolean matches(String requirement) { try { - VersionRange range = VersionRange.createFromVersionSpec(requirement); + VersionRange range = convertRequirementToVersionRange(requirement); if (range.hasRestrictions()) { return range.containsVersion(version); } else { @@ -79,6 +81,32 @@ public boolean matches(String requirement) { } } + private static final Pattern PATTERN_MAJOR_VERSION = Pattern.compile("^[0-9]+$"); + private static final Pattern PATTERN_MAJOR_MINOR_VERSION = Pattern.compile("^[0-9]+\\.[0-9]+$"); + + private VersionRange convertRequirementToVersionRange(String requirement) + throws InvalidVersionSpecificationException { + // Specific for Version _requirement_ matching; + // If the version is a simple integer (like "25") + // then treat this as the requirement "the major version is 25" + if (PATTERN_MAJOR_VERSION.matcher(requirement).matches()) { + int majorVersion = Integer.parseInt(requirement); + return VersionRange.createFromVersionSpec("[" + majorVersion + "," + (majorVersion + 1) + ")"); + } + + // If the version is a major.minor (like "1.5") + // then treat this as the requirement "the major version is 1 and the minor is 5" + if (PATTERN_MAJOR_MINOR_VERSION.matcher(requirement).matches()) { + String[] split = requirement.split("\\.", 2); + int majorVersion = Integer.parseInt(split[0]); + int minorVersion = Integer.parseInt(split[1]); + return VersionRange.createFromVersionSpec( + "[" + majorVersion + "." + minorVersion + "," + majorVersion + "." + (minorVersion + 1) + ")"); + } + + return VersionRange.createFromVersionSpec(requirement); + } + @Override public String toString() { return version.toString(); diff --git a/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java b/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java index 6b9cc2d8003d..2b7c9a98eb6d 100644 --- a/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java +++ b/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java @@ -50,11 +50,18 @@ public void testCreateExactMatcher() { public void testCreateVersionMatcher() { RequirementMatcher matcher; matcher = RequirementMatcherFactory.createVersionMatcher("1.5.2"); - assertFalse(matcher.matches("1.5")); - assertTrue(matcher.matches("1.5.2")); + assertTrue(matcher.matches("1")); // Major matches + assertTrue(matcher.matches("1.5")); // Major.Minor matches + assertTrue(matcher.matches("1.5.2")); // Full match + assertFalse(matcher.matches("1.6")); // Wrong minor + assertFalse(matcher.matches("2")); // Wrong major + assertFalse(matcher.matches("2.5")); // Wrong major, right minor assertFalse(matcher.matches("[1.4,1.5)")); assertFalse(matcher.matches("[1.5,1.5.2)")); + assertTrue(matcher.matches("[1.5,1.5.3)")); + assertTrue(matcher.matches("(1.5.1,1.6)")); assertFalse(matcher.matches("(1.5.2,1.6)")); + assertTrue(matcher.matches("[1.5.2,1.6)")); assertTrue(matcher.matches("(1.4,1.5.2]")); assertTrue(matcher.matches("(1.5,)")); assertEquals("1.5.2", matcher.toString()); @@ -63,4 +70,29 @@ public void testCreateVersionMatcher() { matcher = RequirementMatcherFactory.createVersionMatcher("1.5"); assertEquals("1.5", matcher.toString()); } + + @Test + public void testCreateVersionMatcherMultiDigit() { + RequirementMatcher matcher; + matcher = RequirementMatcherFactory.createVersionMatcher("11.55.22"); + assertTrue(matcher.matches("11")); // Major matches + assertTrue(matcher.matches("11.55")); // Major.Minor matches + assertTrue(matcher.matches("11.55.22")); // Full match + assertFalse(matcher.matches("11.66")); // Wrong minor + assertFalse(matcher.matches("22")); // Wrong major + assertFalse(matcher.matches("22.55")); // Wrong major, right minor + assertFalse(matcher.matches("[11.54,11.55)")); + assertFalse(matcher.matches("[11.55,11.55.22)")); + assertTrue(matcher.matches("[11.55,11.55.33)")); + assertTrue(matcher.matches("(11.55.11,11.56)")); + assertFalse(matcher.matches("(11.55.22,11.56)")); + assertTrue(matcher.matches("[11.55.22,11.56)")); + assertTrue(matcher.matches("(11.54,11.55.22]")); + assertTrue(matcher.matches("(11.55,)")); + assertEquals("11.55.22", matcher.toString()); + + // Ensure it is not printed as 1.5.0 + matcher = RequirementMatcherFactory.createVersionMatcher("11.55"); + assertEquals("11.55", matcher.toString()); + } }