This is an automated email from the ASF dual-hosted git repository.
desruisseaux pushed a commit to branch maven-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/maven-4.0.x by this push:
new 21e551af82 Backport of "Add PathMatcherFactory.includesAll()" (#11008)
21e551af82 is described below
commit 21e551af82186f3bcd48a69aae1a9c832f9d2e08
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Mon Jul 28 18:21:49 2025 +0200
Backport of "Add PathMatcherFactory.includesAll()" (#11008)
Minor modifications to the `PathMatcherFactor` service:
* Make package-private.
* Ensure that `simplify()` is always invoked.
* Add `PathMatcherFactory.includesAll()` and `isIncludesAll(PathMatcher)`
methods.
The Maven Clean Plugin needs this information for checking if it can run in
a background thread.
---
.../maven/api/services/PathMatcherFactory.java | 22 +++++++++++++++
.../maven/impl/DefaultPathMatcherFactory.java | 8 +++++-
.../org/apache/maven/impl/DefaultSourceRoot.java | 2 +-
.../java/org/apache/maven/impl/PathSelector.java | 32 ++++++++++++++--------
.../maven/impl/DefaultPathMatcherFactoryTest.java | 10 ++++---
.../org/apache/maven/impl/PathSelectorTest.java | 13 +++++----
6 files changed, 64 insertions(+), 23 deletions(-)
diff --git
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/PathMatcherFactory.java
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/PathMatcherFactory.java
index 19cdd973c7..9f83e2e0f8 100644
---
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/PathMatcherFactory.java
+++
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/PathMatcherFactory.java
@@ -21,6 +21,7 @@
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.Collection;
+import java.util.Objects;
import org.apache.maven.api.Service;
import org.apache.maven.api.annotations.Experimental;
@@ -138,4 +139,25 @@ default PathMatcher createIncludeOnlyMatcher(@Nonnull Path
baseDirectory, Collec
*/
@Nonnull
PathMatcher deriveDirectoryMatcher(@Nonnull PathMatcher fileMatcher);
+
+ /**
+ * Returns the path matcher that unconditionally returns {@code true} for
all files.
+ * It should be the matcher returned by the other methods of this
interface when the
+ * given patterns match all files.
+ *
+ * @return path matcher that unconditionally returns {@code true} for all
files
+ */
+ @Nonnull
+ PathMatcher includesAll();
+
+ /**
+ * {@return whether the given matcher includes all files}.
+ * This method may conservatively returns {@code false} if case of doubt.
+ * A return value of {@code true} means that the pattern is certain to
match all files.
+ *
+ * @param matcher the matcher to test
+ */
+ default boolean isIncludesAll(@Nonnull PathMatcher matcher) {
+ return Objects.requireNonNull(matcher) == includesAll();
+ }
}
diff --git
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPathMatcherFactory.java
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPathMatcherFactory.java
index bd65b4d96a..83d1919385 100644
---
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPathMatcherFactory.java
+++
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPathMatcherFactory.java
@@ -52,7 +52,7 @@ public PathMatcher createPathMatcher(
boolean useDefaultExcludes) {
requireNonNull(baseDirectory, "baseDirectory cannot be null");
- return new PathSelector(baseDirectory, includes, excludes,
useDefaultExcludes);
+ return PathSelector.of(baseDirectory, includes, excludes,
useDefaultExcludes);
}
@Nonnull
@@ -72,4 +72,10 @@ public PathMatcher deriveDirectoryMatcher(@Nonnull
PathMatcher fileMatcher) {
}
return PathSelector.INCLUDES_ALL;
}
+
+ @Nonnull
+ @Override
+ public PathMatcher includesAll() {
+ return PathSelector.INCLUDES_ALL;
+ }
}
diff --git
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSourceRoot.java
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSourceRoot.java
index 733825dfd5..dc8aaa206a 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSourceRoot.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSourceRoot.java
@@ -219,7 +219,7 @@ public PathMatcher matcher(Collection<String>
defaultIncludes, boolean useDefaul
if (actual == null || actual.isEmpty()) {
actual = defaultIncludes;
}
- return new PathSelector(directory(), actual, excludes(),
useDefaultExcludes).simplify();
+ return PathSelector.of(directory(), actual, excludes(),
useDefaultExcludes);
}
/**
diff --git
a/impl/maven-impl/src/main/java/org/apache/maven/impl/PathSelector.java
b/impl/maven-impl/src/main/java/org/apache/maven/impl/PathSelector.java
index 348d47887b..20d68cd7bb 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/PathSelector.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/PathSelector.java
@@ -61,7 +61,7 @@
*
* @see java.nio.file.FileSystem#getPathMatcher(String)
*/
-public class PathSelector implements PathMatcher {
+final class PathSelector implements PathMatcher {
/**
* Patterns which should be excluded by default, like <abbr>SCM</abbr>
files.
*
@@ -232,7 +232,7 @@ public class PathSelector implements PathMatcher {
* @param useDefaultExcludes whether to augment the excludes with a
default set of <abbr>SCM</abbr> patterns
* @throws NullPointerException if directory is null
*/
- public PathSelector(
+ private PathSelector(
@Nonnull Path directory,
Collection<String> includes,
Collection<String> excludes,
@@ -248,6 +248,24 @@ public PathSelector(
needRelativize = needRelativize(includePatterns) ||
needRelativize(excludePatterns);
}
+ /**
+ * Creates a new matcher from the given includes and excludes.
+ *
+ * @param directory the base directory of the files to filter
+ * @param includes the patterns of the files to include, or null or empty
for including all files
+ * @param excludes the patterns of the files to exclude, or null or empty
for no exclusion
+ * @param useDefaultExcludes whether to augment the excludes with a
default set of <abbr>SCM</abbr> patterns
+ * @throws NullPointerException if directory is null
+ * @return a path matcher for the given includes and excludes
+ */
+ public static PathMatcher of(
+ @Nonnull Path directory,
+ Collection<String> includes,
+ Collection<String> excludes,
+ boolean useDefaultExcludes) {
+ return new PathSelector(directory, includes, excludes,
useDefaultExcludes).simplify();
+ }
+
/**
* Returns the given array of excludes, optionally expanded with a default
set of excludes,
* then with unnecessary excludes omitted. An unnecessary exclude is an
exclude which will never
@@ -563,19 +581,11 @@ private static PathMatcher[] matchers(final FileSystem
fs, final String[] patter
return matchers;
}
- /**
- * {@return whether there are no include or exclude filters}.
- * In such case, this {@code PathSelector} instance should be ignored.
- */
- public boolean isEmpty() {
- return includes.length == 0 && excludes.length == 0;
- }
-
/**
* {@return a potentially simpler matcher equivalent to this matcher}.
*/
@SuppressWarnings("checkstyle:MissingSwitchDefault")
- public PathMatcher simplify() {
+ private PathMatcher simplify() {
if (!needRelativize && excludes.length == 0) {
switch (includes.length) {
case 0:
diff --git
a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPathMatcherFactoryTest.java
b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPathMatcherFactoryTest.java
index 57f9b745fc..964b2b6b9f 100644
---
a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPathMatcherFactoryTest.java
+++
b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPathMatcherFactoryTest.java
@@ -33,6 +33,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -134,11 +135,12 @@ public void testCreatePathMatcherDefaultMethod(@TempDir
Path tempDir) throws IOE
}
@Test
- public void testPathMatcherReturnsPathSelector(@TempDir Path tempDir) {
+ public void testIncludesAll(@TempDir Path tempDir) {
PathMatcher matcher = factory.createPathMatcher(tempDir, null, null,
false);
- // Verify that the returned matcher is actually a PathSelector
- assertTrue(matcher instanceof PathSelector);
+ // Because no pattern has been specified, simplify to includes all.
+ // IT must be the same instance, by method contract.
+ assertSame(factory.includesAll(), matcher);
}
/**
@@ -183,7 +185,7 @@ public void testNullParameterThrowsNPE(@TempDir Path
tempDir) {
// Test that PathSelector constructor also throws NPE for null
directory
assertThrows(
- NullPointerException.class, () -> new PathSelector(null,
List.of("*.txt"), List.of("*.tmp"), false));
+ NullPointerException.class, () -> PathSelector.of(null,
List.of("*.txt"), List.of("*.tmp"), false));
// Test that deriveDirectoryMatcher throws NPE for null fileMatcher
assertThrows(NullPointerException.class, () ->
factory.deriveDirectoryMatcher(null));
diff --git
a/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
b/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
index ea3e06875a..c7d860bc0b 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.PathMatcher;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -60,9 +61,9 @@ public void testTree(final @TempDir Path directory) throws
IOException {
*/
private static void assertFilteredFilesContains(final Path directory,
final String syntax, final String... expected)
throws IOException {
- var includes = List.of(syntax + "**/*.txt");
- var excludes = List.of(syntax + "baz/**");
- var matcher = new PathSelector(directory, includes, excludes, false);
+ List<String> includes = List.of(syntax + "**/*.txt");
+ List<String> excludes = List.of(syntax + "baz/**");
+ PathMatcher matcher = PathSelector.of(directory, includes, excludes,
false);
Set<Path> filtered =
new
HashSet<>(Files.walk(directory).filter(matcher::matches).toList());
for (String path : expected) {
@@ -81,9 +82,9 @@ private static void assertFilteredFilesContains(final Path
directory, final Stri
@Test
public void testExcludeOmission() {
Path directory = Path.of("dummy");
- var includes = List.of("**/*.java");
- var excludes = List.of("baz/**");
- var matcher = new PathSelector(directory, includes, excludes, true);
+ List<String> includes = List.of("**/*.java");
+ List<String> excludes = List.of("baz/**");
+ PathMatcher matcher = PathSelector.of(directory, includes, excludes,
true);
String s = matcher.toString();
assertTrue(s.contains("glob:**/*.java"));
assertFalse(s.contains("project.pj")); // Unnecessary exclusion should
have been omitted.