From 4145e10f71d254cc856730a070ef85ea1cf10e86 Mon Sep 17 00:00:00 2001 From: Claude Warren Date: Fri, 18 Oct 2024 11:30:17 +0100 Subject: [PATCH 1/4] changes for RAT --- .../java/org/codehaus/plexus/util/MatchPattern.java | 10 +++++++++- .../org/codehaus/plexus/util/MatchPatterns.java | 12 ++++++++++++ .../org/codehaus/plexus/util/SelectorUtils.java | 13 ++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/util/MatchPattern.java b/src/main/java/org/codehaus/plexus/util/MatchPattern.java index 4dc757e3..12c12bc7 100644 --- a/src/main/java/org/codehaus/plexus/util/MatchPattern.java +++ b/src/main/java/org/codehaus/plexus/util/MatchPattern.java @@ -58,6 +58,14 @@ private MatchPattern(String source, String separator) { } } + /** + * Gets the source pattern for this matchpattern. + * @return the source string without Ant or Regex pattern markers. + */ + public String getSource() { + return source; + } + public boolean matchPath(String str, boolean isCaseSensitive) { if (regexPattern != null) { return str.matches(regexPattern); @@ -99,7 +107,7 @@ public boolean startsWith(String string) { return source.startsWith(string); } - static String[] tokenizePathToString(String path, String separator) { + public static String[] tokenizePathToString(String path, String separator) { List ret = new ArrayList(); StringTokenizer st = new StringTokenizer(path, separator); while (st.hasMoreTokens()) { diff --git a/src/main/java/org/codehaus/plexus/util/MatchPatterns.java b/src/main/java/org/codehaus/plexus/util/MatchPatterns.java index fd36a9d8..9c14bf00 100644 --- a/src/main/java/org/codehaus/plexus/util/MatchPatterns.java +++ b/src/main/java/org/codehaus/plexus/util/MatchPatterns.java @@ -16,6 +16,18 @@ private MatchPatterns(MatchPattern[] patterns) { this.patterns = patterns; } + /** + * Gets a list of enclosed MatchPattern sources. + * @return A list of enclosed MatchPattern sources. + */ + public List getSources() { + List sources = new ArrayList<>(); + for (MatchPattern pattern : patterns) { + sources.add(pattern.getSource()); + } + return sources; + } + /** *

Checks these MatchPatterns against a specified string.

* diff --git a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java index f5122c78..37d654ab 100644 --- a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java +++ b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java @@ -243,6 +243,17 @@ public static boolean matchPath(String pattern, String str, String separator, bo } } + public static String extractPattern(final String pattern, final String separator) { + if (isRegexPrefixedPattern(pattern)) { + return pattern.substring(REGEX_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()); + } else { + String localPattern = isAntPrefixedPattern(pattern) + ? pattern.substring(ANT_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()) + : pattern; + return toOSRelatedPath(localPattern, separator); + } + } + private static String toOSRelatedPath(String pattern, String separator) { if ("/".equals(separator)) { return pattern.replace("\\", separator); @@ -253,7 +264,7 @@ private static String toOSRelatedPath(String pattern, String separator) { return pattern; } - static boolean isRegexPrefixedPattern(String pattern) { + public static boolean isRegexPrefixedPattern(String pattern) { return pattern.length() > (REGEX_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1) && pattern.startsWith(REGEX_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX); From 7344734f27d542c52468052b0e033c0a94f693cf Mon Sep 17 00:00:00 2001 From: Claude Warren Date: Sat, 19 Oct 2024 12:23:26 +0100 Subject: [PATCH 2/4] updated documentation --- .../codehaus/plexus/util/MatchPattern.java | 2 +- .../codehaus/plexus/util/SelectorUtils.java | 31 ++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/util/MatchPattern.java b/src/main/java/org/codehaus/plexus/util/MatchPattern.java index 12c12bc7..4c276f3b 100644 --- a/src/main/java/org/codehaus/plexus/util/MatchPattern.java +++ b/src/main/java/org/codehaus/plexus/util/MatchPattern.java @@ -59,7 +59,7 @@ private MatchPattern(String source, String separator) { } /** - * Gets the source pattern for this matchpattern. + * Gets the source pattern for this match pattern. * @return the source string without Ant or Regex pattern markers. */ public String getSource() { diff --git a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java index 37d654ab..3f767b14 100644 --- a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java +++ b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java @@ -139,7 +139,7 @@ public static boolean matchPatternStart(String pattern, String str, boolean isCa } } - static boolean isAntPrefixedPattern(String pattern) { + public static boolean isAntPrefixedPattern(String pattern) { return pattern.length() > (ANT_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1) && pattern.startsWith(ANT_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX); @@ -243,17 +243,6 @@ public static boolean matchPath(String pattern, String str, String separator, bo } } - public static String extractPattern(final String pattern, final String separator) { - if (isRegexPrefixedPattern(pattern)) { - return pattern.substring(REGEX_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()); - } else { - String localPattern = isAntPrefixedPattern(pattern) - ? pattern.substring(ANT_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()) - : pattern; - return toOSRelatedPath(localPattern, separator); - } - } - private static String toOSRelatedPath(String pattern, String separator) { if ("/".equals(separator)) { return pattern.replace("\\", separator); @@ -719,4 +708,22 @@ public static String removeWhitespace(String input) { } return result.toString(); } + + /** + * Extract the pattern without the Regex or Ant prefix. In the case of Ant style matches ensure + * that the path uses specified separator. + * @param pattern the pattern to extract from. + * @param separator the system file name separator in the pattern. + * @return The pattern without the Regex or Ant prefix. + */ + public static String extractPattern(final String pattern, final String separator) { + if (isRegexPrefixedPattern(pattern)) { + return pattern.substring(REGEX_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()); + } else { + String localPattern = isAntPrefixedPattern(pattern) + ? pattern.substring(ANT_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length()) + : pattern; + return toOSRelatedPath(localPattern, separator); + } + } } From 3be7c45e77598c35bbc4ce666921ff91728a0817 Mon Sep 17 00:00:00 2001 From: Claude Warren Date: Mon, 4 Nov 2024 13:40:20 +0000 Subject: [PATCH 3/4] added tests, fixed one bug --- .../codehaus/plexus/util/MatchPattern.java | 2 +- .../plexus/util/MatchPatternTest.java | 32 +++++++++++++++++ .../plexus/util/MatchPatternsTest.java | 15 ++++++++ .../plexus/util/SelectorUtilsTest.java | 36 +++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/codehaus/plexus/util/MatchPattern.java b/src/main/java/org/codehaus/plexus/util/MatchPattern.java index 4c276f3b..93381c51 100644 --- a/src/main/java/org/codehaus/plexus/util/MatchPattern.java +++ b/src/main/java/org/codehaus/plexus/util/MatchPattern.java @@ -63,7 +63,7 @@ private MatchPattern(String source, String separator) { * @return the source string without Ant or Regex pattern markers. */ public String getSource() { - return source; + return regexPattern == null ? source : regexPattern; } public boolean matchPath(String str, boolean isCaseSensitive) { diff --git a/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java b/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java index 7dbef6b3..809b8ad4 100644 --- a/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java +++ b/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java @@ -18,6 +18,8 @@ import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,6 +31,20 @@ * @since 3.4.0 */ public class MatchPatternTest { + + /** + *

testGetSource

+ */ + @Test + public void testGetSource() { + MatchPattern mp = MatchPattern.fromString("ABC*"); + assertEquals("ABC*", mp.getSource()); + mp = MatchPattern.fromString("%ant[some/ABC*]"); + assertEquals("some/ABC*", mp.getSource()); + mp = MatchPattern.fromString("%regex[[ABC].*]"); + assertEquals("[ABC].*", mp.getSource()); + } + /** *

testMatchPath.

* @@ -58,4 +74,20 @@ public void testMatchPatternStart() { assertFalse(mp.matchPatternStart("XXXX", true)); assertFalse(mp.matchPatternStart("XXXX", false)); } + + /** + *

testTokenizePathToString.

+ */ + @Test + public void testTokenizePathToString() { + String[] expected = {"hello", "world"}; + String[] actual = MatchPattern.tokenizePathToString("hello/world", "/"); + assertArrayEquals(expected, actual); + + actual = MatchPattern.tokenizePathToString("/hello/world", "/"); + assertArrayEquals(expected, actual); + + actual = MatchPattern.tokenizePathToString("/hello/world/", "/"); + assertArrayEquals(expected, actual); + } } diff --git a/src/test/java/org/codehaus/plexus/util/MatchPatternsTest.java b/src/test/java/org/codehaus/plexus/util/MatchPatternsTest.java index 47074f8f..b31b5b2f 100644 --- a/src/test/java/org/codehaus/plexus/util/MatchPatternsTest.java +++ b/src/test/java/org/codehaus/plexus/util/MatchPatternsTest.java @@ -16,8 +16,12 @@ * limitations under the License. */ +import java.util.Arrays; +import java.util.List; + import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,6 +33,17 @@ * @since 3.4.0 */ public class MatchPatternsTest { + /** + *

testGetSource

+ */ + @Test + public void testGetSources() { + List expected = Arrays.asList("ABC**", "some/ABC*", "[ABC].*"); + MatchPatterns from = MatchPatterns.from("ABC**", "%ant[some/ABC*]", "%regex[[ABC].*]"); + List actual = from.getSources(); + assertEquals(expected, actual); + } + /** *

testMatches.

* diff --git a/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java b/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java index 21a10e2f..d48759de 100644 --- a/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java +++ b/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -30,6 +31,41 @@ * @since 3.4.0 */ public class SelectorUtilsTest { + /** + *

testExtractPattern.

+ */ + @Test + public void testExtractPattern() { + assertEquals("[A-Z].*", SelectorUtils.extractPattern("%regex[[A-Z].*]", "/")); + assertEquals("ABC*", SelectorUtils.extractPattern("%ant[ABC*]", "/")); + assertEquals("some/ABC*", SelectorUtils.extractPattern("%ant[some/ABC*]", "/")); + assertEquals("some\\ABC*", SelectorUtils.extractPattern("%ant[some\\ABC*]", "\\")); + assertEquals("some/ABC*", SelectorUtils.extractPattern("%ant[some\\ABC*]", "/")); + assertEquals("some\\ABC*", SelectorUtils.extractPattern("%ant[some/ABC*]", "\\")); + } + + /** + *

testIsAntPrefixedPattern.

+ */ + @Test + public void testIsAntPrefixedPattern() { + assertFalse(SelectorUtils.isAntPrefixedPattern("%ant[A]")); // single char not allowed + assertTrue(SelectorUtils.isAntPrefixedPattern("%ant[AB]")); + assertFalse(SelectorUtils.isAntPrefixedPattern("%ant[]")); + assertFalse(SelectorUtils.isAntPrefixedPattern("*")); + } + + /** + *

testIsRegexPrefixedPattern.

+ */ + @Test + public void testIsRegexPrefixedPattern() { + assertFalse(SelectorUtils.isRegexPrefixedPattern("%regex[A]")); // single char not allowed + assertTrue(SelectorUtils.isRegexPrefixedPattern("%regex[.*]")); + assertFalse(SelectorUtils.isRegexPrefixedPattern("%regex[]")); + assertFalse(SelectorUtils.isRegexPrefixedPattern("*")); + } + /** *

testMatchPath_DefaultFileSeparator.

*/ From bba7c35194f4ab350e362ce28017ba216a1220b9 Mon Sep 17 00:00:00 2001 From: Claude Warren Date: Tue, 5 Nov 2024 12:07:30 +0000 Subject: [PATCH 4/4] fix for issue #279 --- src/main/java/org/codehaus/plexus/util/SelectorUtils.java | 4 ++-- src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java index 3f767b14..571bc002 100644 --- a/src/main/java/org/codehaus/plexus/util/SelectorUtils.java +++ b/src/main/java/org/codehaus/plexus/util/SelectorUtils.java @@ -140,7 +140,7 @@ public static boolean matchPatternStart(String pattern, String str, boolean isCa } public static boolean isAntPrefixedPattern(String pattern) { - return pattern.length() > (ANT_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1) + return pattern.length() > (ANT_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length()) && pattern.startsWith(ANT_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX); } @@ -254,7 +254,7 @@ private static String toOSRelatedPath(String pattern, String separator) { } public static boolean isRegexPrefixedPattern(String pattern) { - return pattern.length() > (REGEX_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1) + return pattern.length() > (REGEX_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length()) && pattern.startsWith(REGEX_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX); } diff --git a/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java b/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java index d48759de..0cb98efe 100644 --- a/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java +++ b/src/test/java/org/codehaus/plexus/util/SelectorUtilsTest.java @@ -49,7 +49,7 @@ public void testExtractPattern() { */ @Test public void testIsAntPrefixedPattern() { - assertFalse(SelectorUtils.isAntPrefixedPattern("%ant[A]")); // single char not allowed + assertTrue(SelectorUtils.isAntPrefixedPattern("%ant[A]")); // single char not allowed assertTrue(SelectorUtils.isAntPrefixedPattern("%ant[AB]")); assertFalse(SelectorUtils.isAntPrefixedPattern("%ant[]")); assertFalse(SelectorUtils.isAntPrefixedPattern("*")); @@ -60,7 +60,7 @@ public void testIsAntPrefixedPattern() { */ @Test public void testIsRegexPrefixedPattern() { - assertFalse(SelectorUtils.isRegexPrefixedPattern("%regex[A]")); // single char not allowed + assertTrue(SelectorUtils.isRegexPrefixedPattern("%regex[A]")); // single char not allowed assertTrue(SelectorUtils.isRegexPrefixedPattern("%regex[.*]")); assertFalse(SelectorUtils.isRegexPrefixedPattern("%regex[]")); assertFalse(SelectorUtils.isRegexPrefixedPattern("*"));