Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
02ef108
Support scanning for class path resources
mpkorstanje Jan 9, 2024
2f76493
Formatting
mpkorstanje Feb 25, 2024
277272a
Doc
mpkorstanje Feb 25, 2024
f683deb
Fix
mpkorstanje Feb 25, 2024
c457b58
Clean up todos
mpkorstanje Feb 29, 2024
c9b3b0e
Clean up todos
mpkorstanje Feb 29, 2024
e5a1751
Clean up
mpkorstanje Mar 7, 2024
2bab069
Extract common code in findClassesForPath and findResourcesForPath
mpkorstanje Mar 7, 2024
f34c4c9
Extract common file visitor code
mpkorstanje Mar 7, 2024
c84ad5e
Docs
mpkorstanje Mar 7, 2024
e43258e
Tests
mpkorstanje Mar 7, 2024
c374b93
Spotless
mpkorstanje Mar 7, 2024
440e0e7
Merge remote-tracking branch 'origin/main' into support-classpath-res…
mpkorstanje Mar 7, 2024
6cca62a
Update CHANGELOG
mpkorstanje Mar 7, 2024
704e584
Update CHANGELOG
mpkorstanje Mar 7, 2024
9f99477
Remove resource name filter predicate
mpkorstanje Jun 13, 2024
2df5201
Clean up to do.
mpkorstanje Jun 13, 2024
862cb3b
Merge remote-tracking branch 'origin/main' into support-classpath-res…
mpkorstanje Jun 13, 2024
f5d892b
Replace resource filter with predicate
mpkorstanje Jun 14, 2024
6e95eeb
Revert "Replace resource filter with predicate"
mpkorstanje Jun 14, 2024
e59cc59
Revert "Remove resource name filter predicate"
mpkorstanje Jun 14, 2024
767dcf4
Load canonical resources through classloader
mpkorstanje Jun 14, 2024
94215bc
Touch up
mpkorstanje Jun 14, 2024
794793a
Correctly resolve shadowed resources
mpkorstanje Jun 14, 2024
ac77e69
Fixup changelog
mpkorstanje Jun 14, 2024
79f13bf
Fix up java doc
mpkorstanje Jun 14, 2024
cdeb3ea
Merge remote-tracking branch 'origin/main' into support-classpath-res…
mpkorstanje Jun 14, 2024
966e21f
Fix tryToLoadResource
mpkorstanje Jun 15, 2024
358693f
Wrap class loader call in try
mpkorstanje Jun 15, 2024
917f004
Add more tryToLoadResource tests
mpkorstanje Jun 15, 2024
ca1f81b
Touchups
mpkorstanje Jun 15, 2024
59705ba
Merge remote-tracking branch 'origin/main' into support-classpath-res…
mpkorstanje Jun 15, 2024
7ffff49
Remove unnesesary try-catch
mpkorstanje Jun 15, 2024
2144abe
Add more reflection support tests
mpkorstanje Jun 15, 2024
27c0750
Merge branch 'main' into support-classpath-resources-scanning
mpkorstanje Jun 17, 2024
52e5884
Merge remote-tracking branch 'origin/main' into support-classpath-res…
mpkorstanje Jun 26, 2024
7df46a3
Find all available resources, including duplicates
mpkorstanje Jul 8, 2024
ee7b42a
Remove unused tryToLoadResource
mpkorstanje Jul 8, 2024
c0c9ee6
Suppress warnings
mpkorstanje Jul 8, 2024
8621935
Remove resourceNameFilter predicate from Javadoc
marcphilipp Jul 9, 2024
3a14696
Add test for finding duplicate resources
marcphilipp Jul 9, 2024
3f348b3
Merge branch 'main' into support-classpath-resources-scanning
marcphilipp Jul 9, 2024
b826b32
Clean up unused import
mpkorstanje Jul 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Revert "Replace resource filter with predicate"
This reverts commit f5d892b.
  • Loading branch information
mpkorstanje committed Jun 14, 2024
commit 6e95eeba1ab69aa32aba2177c84081b750ffa5f6
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ List<Class<?>> scanForClassesInClasspathRoot(URI root, ClassFilter classFilter)
return findClassesForUri(root, PackageUtils.DEFAULT_PACKAGE_NAME, classFilter);
}

List<Resource> scanForResourcesInPackage(String basePackageName, Predicate<Resource> resourceFilter) {
List<Resource> scanForResourcesInPackage(String basePackageName, ResourceFilter resourceFilter) {
Preconditions.condition(
PackageUtils.DEFAULT_PACKAGE_NAME.equals(basePackageName) || isNotBlank(basePackageName),
"basePackageName must not be null or blank");
Expand All @@ -105,7 +105,7 @@ List<Resource> scanForResourcesInPackage(String basePackageName, Predicate<Resou
return findResourcesForUris(roots, basePackageName, resourceFilter);
}

List<Resource> scanForResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter) {
List<Resource> scanForResourcesInClasspathRoot(URI root, ResourceFilter resourceFilter) {
Preconditions.notNull(root, "root must not be null");
Preconditions.notNull(resourceFilter, "resourceFilter must not be null");

Expand Down Expand Up @@ -139,7 +139,7 @@ private List<Class<?>> findClassesForUri(URI baseUri, String basePackageName, Cl
* Recursively scan for resources in all the supplied source directories.
*/
private List<Resource> findResourcesForUris(List<URI> baseUris, String basePackageName,
Predicate<Resource> resourceFilter) {
ResourceFilter resourceFilter) {
// @formatter:off
return baseUris.stream()
.map(baseUri -> findResourcesForUri(baseUri, basePackageName, resourceFilter))
Expand All @@ -149,8 +149,7 @@ private List<Resource> findResourcesForUris(List<URI> baseUris, String basePacka
// @formatter:on
}

private List<Resource> findResourcesForUri(URI baseUri, String basePackageName,
Predicate<Resource> resourceFilter) {
private List<Resource> findResourcesForUri(URI baseUri, String basePackageName, ResourceFilter resourceFilter) {
List<Resource> resources = new ArrayList<>();
// @formatter:off
walkFilesForUri(baseUri, ClasspathFilters.resourceFiles(),
Expand Down Expand Up @@ -203,7 +202,7 @@ private void processClassFileSafely(Path baseDir, String basePackageName, ClassF
}
}

private void processResourceFileSafely(Path baseDir, String basePackageName, Predicate<Resource> resourceFilter,
private void processResourceFileSafely(Path baseDir, String basePackageName, ResourceFilter resourceFilter,
Path resourceFile, Consumer<Resource> resourceConsumer) {
try {
String fullyQualifiedResourceName = determineFullyQualifiedResourceName(baseDir, basePackageName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;

import org.apiguardian.api.API;
import org.junit.platform.commons.logging.Logger;
Expand Down Expand Up @@ -109,7 +108,7 @@ public static List<Class<?>> findAllClassesInModule(String moduleName, ClassFilt
* but potentially empty
*/
@API(status = INTERNAL, since = "1.11")
public static List<Resource> findAllResourcesInModule(String moduleName, Predicate<Resource> filter) {
public static List<Resource> findAllResourcesInModule(String moduleName, ResourceFilter filter) {
Preconditions.notBlank(moduleName, "Module name must not be null or empty");
Preconditions.notNull(filter, "Resource filter must not be null");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1052,6 +1052,15 @@ public static List<Class<?>> findAllClassesInClasspathRoot(URI root, Predicate<C
return findAllClassesInClasspathRoot(root, ClassFilter.of(classNameFilter, classFilter));
}

/**
* @since 1.11
* @see #findAllResourcesInClasspathRoot(URI, Predicate)
*/
public static List<Resource> findAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter) {
// unmodifiable since returned by public, non-internal method(s)
return findAllResourcesInClasspathRoot(root, ResourceFilter.of(resourceFilter));
}

/**
* @since 1.10
* @see org.junit.platform.commons.support.ReflectionSupport#streamAllClassesInClasspathRoot(URI, Predicate, Predicate)
Expand All @@ -1061,6 +1070,14 @@ public static Stream<Class<?>> streamAllClassesInClasspathRoot(URI root, Predica
return streamAllClassesInClasspathRoot(root, ClassFilter.of(classNameFilter, classFilter));
}

/**
* @since 1.11
* @see #streamAllResourcesInClasspathRoot(URI, Predicate)
*/
public static Stream<Resource> streamAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter) {
return streamAllResourcesInClasspathRoot(root, ResourceFilter.of(resourceFilter));
}

/**
* @since 1.1
*/
Expand All @@ -1071,7 +1088,7 @@ public static List<Class<?>> findAllClassesInClasspathRoot(URI root, ClassFilter
/**
* @since 1.11
*/
public static List<Resource> findAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter) {
public static List<Resource> findAllResourcesInClasspathRoot(URI root, ResourceFilter resourceFilter) {
return Collections.unmodifiableList(classpathScanner.scanForResourcesInClasspathRoot(root, resourceFilter));
}

Expand All @@ -1085,7 +1102,7 @@ public static Stream<Class<?>> streamAllClassesInClasspathRoot(URI root, ClassFi
/**
* @since 1.11
*/
public static Stream<Resource> streamAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter) {
public static Stream<Resource> streamAllResourcesInClasspathRoot(URI root, ResourceFilter resourceFilter) {
return findAllResourcesInClasspathRoot(root, resourceFilter).stream();
}

Expand All @@ -1098,6 +1115,15 @@ public static List<Class<?>> findAllClassesInPackage(String basePackageName, Pre
return findAllClassesInPackage(basePackageName, ClassFilter.of(classNameFilter, classFilter));
}

/**
* @since 1.11
* @see org.junit.platform.commons.support.ReflectionSupport#findAllClassesInPackage(String, Predicate, Predicate)
*/
public static List<Resource> findAllResourcesInPackage(String basePackageName, Predicate<Resource> resourceFilter) {
// unmodifiable since returned by public, non-internal method(s)
return findAllResourcesInPackage(basePackageName, ResourceFilter.of(resourceFilter));
}

/**
* since 1.10
* @see org.junit.platform.commons.support.ReflectionSupport#streamAllClassesInPackage(String, Predicate, Predicate)
Expand All @@ -1107,6 +1133,15 @@ public static Stream<Class<?>> streamAllClassesInPackage(String basePackageName,
return streamAllClassesInPackage(basePackageName, ClassFilter.of(classNameFilter, classFilter));
}

/**
* since 1.11
* @see #streamAllResourcesInPackage(String, Predicate)
*/
public static Stream<Resource> streamAllResourcesInPackage(String basePackageName,
Predicate<Resource> resourceFilter) {
return streamAllResourcesInPackage(basePackageName, ResourceFilter.of(resourceFilter));
}

/**
* @since 1.1
*/
Expand All @@ -1117,7 +1152,7 @@ public static List<Class<?>> findAllClassesInPackage(String basePackageName, Cla
/**
* @since 1.11
*/
public static List<Resource> findAllResourcesInPackage(String basePackageName, Predicate<Resource> resourceFilter) {
public static List<Resource> findAllResourcesInPackage(String basePackageName, ResourceFilter resourceFilter) {
return Collections.unmodifiableList(
classpathScanner.scanForResourcesInPackage(basePackageName, resourceFilter));
}
Expand All @@ -1132,8 +1167,7 @@ public static Stream<Class<?>> streamAllClassesInPackage(String basePackageName,
/**
* @since 1.11
*/
public static Stream<Resource> streamAllResourcesInPackage(String basePackageName,
Predicate<Resource> resourceFilter) {
public static Stream<Resource> streamAllResourcesInPackage(String basePackageName, ResourceFilter resourceFilter) {
return findAllResourcesInPackage(basePackageName, resourceFilter).stream();
}

Expand All @@ -1147,6 +1181,15 @@ public static List<Class<?>> findAllClassesInModule(String moduleName, Predicate
return findAllClassesInModule(moduleName, ClassFilter.of(classNameFilter, classFilter));
}

/**
* @since 1.11
* @see #findAllResourcesInModule(String, Predicate)
*/
public static List<Resource> findAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter) {
// unmodifiable since returned by public, non-internal method(s)
return findAllResourcesInModule(moduleName, ResourceFilter.of(resourceFilter));
}

/**
* @since 1.10
* @see org.junit.platform.commons.support.ReflectionSupport#streamAllClassesInModule(String, Predicate, Predicate)
Expand All @@ -1156,6 +1199,14 @@ public static Stream<Class<?>> streamAllClassesInModule(String moduleName, Predi
return streamAllClassesInModule(moduleName, ClassFilter.of(classNameFilter, classFilter));
}

/**
* @since 1.11
* @see #streamAllResourcesInModule(String, Predicate)
*/
public static Stream<Resource> streamAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter) {
return streamAllResourcesInModule(moduleName, ResourceFilter.of(resourceFilter));
}

/**
* @since 1.1.1
*/
Expand All @@ -1166,7 +1217,7 @@ public static List<Class<?>> findAllClassesInModule(String moduleName, ClassFilt
/**
* @since 1.11
*/
public static List<Resource> findAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter) {
public static List<Resource> findAllResourcesInModule(String moduleName, ResourceFilter resourceFilter) {
return Collections.unmodifiableList(ModuleUtils.findAllResourcesInModule(moduleName, resourceFilter));
}

Expand All @@ -1180,7 +1231,7 @@ public static Stream<Class<?>> streamAllClassesInModule(String moduleName, Class
/**
* @since 1.11
*/
public static Stream<Resource> streamAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter) {
public static Stream<Resource> streamAllResourcesInModule(String moduleName, ResourceFilter resourceFilter) {
return findAllResourcesInModule(moduleName, resourceFilter).stream();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2015-2024 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/

package org.junit.platform.commons.util;

import static org.apiguardian.api.API.Status.INTERNAL;

import java.util.function.Predicate;

import org.apiguardian.api.API;
import org.junit.platform.commons.support.Resource;

/**
* Resource-related predicate used by reflection utilities.
*
* <h2>DISCLAIMER</h2>
*
* <p>These utilities are intended solely for usage within the JUnit framework
* itself. <strong>Any usage by external parties is not supported.</strong>
* Use at your own risk!
*
* @since 1.11
*/
@API(status = INTERNAL, since = "1.11")
public class ResourceFilter implements Predicate<Resource> {

/**
* Create a {@link ResourceFilter} instance that filters resources.
*/
public static ResourceFilter of(Predicate<Resource> resourcePredicate) {
return new ResourceFilter(resourcePredicate);
}

private final Predicate<Resource> resourcePredicate;

private ResourceFilter(Predicate<Resource> resourcePredicate) {
this.resourcePredicate = Preconditions.notNull(resourcePredicate, "resource predicate must not be null");
}

@Override
public boolean test(Resource resource) {
return resourcePredicate.test(resource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public static List<Class<?>> findAllClassesInModule(String moduleName, ClassFilt
* but potentially empty
*/
@API(status = INTERNAL, since = "1.11")
public static List<Resource> findAllResourcesInModule(String moduleName, Predicate<Resource> filter) {
public static List<Resource> findAllResourcesInModule(String moduleName, ResourceFilter filter) {
Preconditions.notBlank(moduleName, "Module name must not be null or empty");
Preconditions.notNull(filter, "Resource filter must not be null");

Expand Down Expand Up @@ -185,8 +185,7 @@ private static List<Class<?>> scan(Set<ModuleReference> references, ClassFilter
* Scan for classes using the supplied set of module references, class
* filter, and loader.
*/
private static List<Resource> scan(Set<ModuleReference> references, Predicate<Resource> filter,
ClassLoader loader) {
private static List<Resource> scan(Set<ModuleReference> references, ResourceFilter filter, ClassLoader loader) {
logger.debug(() -> "Scanning " + references.size() + " module references: " + references);
ModuleReferenceResourceScanner scanner = new ModuleReferenceResourceScanner(filter, loader);
List<Resource> classes = new ArrayList<>();
Expand Down Expand Up @@ -267,10 +266,10 @@ private Class<?> loadClassUnchecked(String binaryName) {
*/
static class ModuleReferenceResourceScanner {

private final Predicate<Resource> resourceFilter;
private final ResourceFilter resourceFilter;
private final ClassLoader classLoader;

ModuleReferenceResourceScanner(Predicate<Resource> resourceFilter, ClassLoader classLoader) {
ModuleReferenceResourceScanner(ResourceFilter resourceFilter, ClassLoader classLoader) {
this.resourceFilter = resourceFilter;
this.classLoader = classLoader;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ void findAllResourcesInClasspathRootPreconditions() {
var path = Path.of(".").toUri();
assertPreconditionViolationException("root",
() -> ReflectionSupport.findAllResourcesInClasspathRoot(null, allResources));
assertPreconditionViolationException("resourceFilter",
assertPreconditionViolationException("resource predicate",
() -> ReflectionSupport.findAllResourcesInClasspathRoot(path, null));
}

Expand Down Expand Up @@ -190,7 +190,7 @@ void findAllResourcesInPackageDelegates() {
void findAllResourcesInPackagePreconditions() {
assertPreconditionViolationExceptionForString("basePackageName",
() -> ReflectionSupport.findAllResourcesInPackage(null, allResources));
assertPreconditionViolationException("resourceFilter",
assertPreconditionViolationException("resource predicate",
() -> ReflectionSupport.findAllResourcesInPackage("org.junit", null));
}

Expand Down Expand Up @@ -222,7 +222,7 @@ void findAllResourcesInModulePreconditions() {
var exception = assertThrows(PreconditionViolationException.class,
() -> ReflectionSupport.findAllResourcesInModule(null, allResources));
assertEquals("Module name must not be null or empty", exception.getMessage());
assertPreconditionViolationException("Resource filter",
assertPreconditionViolationException("resource predicate",
() -> ReflectionSupport.findAllResourcesInModule("org.junit.platform.commons", null));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
class ClasspathScannerTests {

private static final ClassFilter allClasses = ClassFilter.of(type -> true);
private static final Predicate<Resource> allResources = type -> true;
private static final ResourceFilter allResources = ResourceFilter.of(type -> true);

private final List<Class<?>> loadedClasses = new ArrayList<>();

Expand Down Expand Up @@ -146,7 +146,9 @@ void scanForResourcesInClasspathRootWhenGenericRuntimeExceptionOccurs(LogRecordL
}

private void assertResourcesScannedWhenExceptionIsThrown(Predicate<Resource> filter) {
var resources = this.classpathScanner.scanForResourcesInClasspathRoot(getTestClasspathResourceRoot(), filter);
var resourceFilter = ResourceFilter.of(filter);
var resources = this.classpathScanner.scanForResourcesInClasspathRoot(getTestClasspathResourceRoot(),
resourceFilter);
assertThat(resources).hasSizeGreaterThanOrEqualTo(150);
}

Expand Down Expand Up @@ -343,7 +345,7 @@ void scanForClassesInDefaultPackage() {

@Test
void scanForResourcesInDefaultPackage() {
Predicate<Resource> resourceFilter = this::inDefaultPackage;
var resourceFilter = ResourceFilter.of(this::inDefaultPackage);
var resources = classpathScanner.scanForResourcesInPackage("", resourceFilter);

assertThat(resources).as("number of resources found in default package").isNotEmpty();
Expand All @@ -360,17 +362,17 @@ void scanForClassesInPackageWithFilter() {

@Test
void scanForResourcesInPackageWithFilter() {
Predicate<Resource> thisResourceOnly = resource -> "org/junit/platform/commons/example.resource".equals(
resource.getName());
var thisResourceOnly = ResourceFilter.of(
resource -> "org/junit/platform/commons/example.resource".equals(resource.getName()));
var resources = classpathScanner.scanForResourcesInPackage("org.junit.platform.commons", thisResourceOnly);
assertThat(resources).extracting(Resource::getName).containsExactly(
"org/junit/platform/commons/example.resource");
}

@Test
void resourcesCanBeRead() throws IOException {
Predicate<Resource> thisResourceOnly = resource -> "org/junit/platform/commons/example.resource".equals(
resource.getName());
var thisResourceOnly = ResourceFilter.of(
resource -> "org/junit/platform/commons/example.resource".equals(resource.getName()));
var resources = classpathScanner.scanForResourcesInPackage("org.junit.platform.commons", thisResourceOnly);
Resource resource = resources.get(0);

Expand Down