Skip to content

Commit d5a3511

Browse files
committed
Pass ServiceLoader to Utils to avoid failing its caller check
When used on the module path, `ServiceLoader` determines its calling module from the stack and check whether its module descriptor contains a `uses` directive for the service type. If not, it will throw an exception. Therefore, `ServiceLoader.load` needs to be called directly in the module using the service but the filtering can still occur in junit-platform-commons.
1 parent 2568ffe commit d5a3511

File tree

4 files changed

+16
-15
lines changed

4 files changed

+16
-15
lines changed

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ private static void registerAutoDetectedExtensions(MutableExtensionRegistry exte
102102
configuration.getExtensionAutodetectionIncludePattern().orElse("*"),
103103
configuration.getExtensionAutodetectionExcludePattern().orElse(""));
104104

105-
ServiceLoaderUtils.load(Extension.class, filter, ClassLoaderUtils.getDefaultClassLoader()) //
105+
ServiceLoader<Extension> serviceLoader = ServiceLoader.load(Extension.class,
106+
ClassLoaderUtils.getDefaultClassLoader());
107+
ServiceLoaderUtils.filter(serviceLoader, filter) //
106108
.forEach(extensionRegistry::registerAutoDetectedExtension);
107109
}
108110

junit-platform-commons/src/main/java/org/junit/platform/commons/util/ServiceLoaderUtils.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,16 @@ private ServiceLoaderUtils() {
3636
}
3737

3838
/**
39-
* Loads services of the given type using the specified class loader and filters them using the provided predicate.
39+
* Filters the supplied service loader using the supplied predicate.
4040
*
4141
* @param <T> the type of the service
42-
* @param service the class of the service to be loaded
42+
* @param serviceLoader the service loader to be filtered
4343
* @param providerPredicate the predicate to filter the loaded services
44-
* @param loader the class loader to be used to load the services
4544
* @return a stream of loaded services that match the predicate
4645
*/
47-
public static <T> Stream<T> load(Class<T> service, Predicate<? super Class<? extends T>> providerPredicate,
48-
ClassLoader loader) {
49-
return StreamSupport.stream(ServiceLoader.load(service, loader).spliterator(), false).filter(it -> {
46+
public static <T> Stream<T> filter(ServiceLoader<T> serviceLoader,
47+
Predicate<? super Class<? extends T>> providerPredicate) {
48+
return StreamSupport.stream(serviceLoader.spliterator(), false).filter(it -> {
5049
@SuppressWarnings("unchecked")
5150
Class<? extends T> type = (Class<? extends T>) it.getClass();
5251
return providerPredicate.test(type);

junit-platform-commons/src/main/java9/org/junit/platform/commons/util/ServiceLoaderUtils.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,17 @@ private ServiceLoaderUtils() {
3636
}
3737

3838
/**
39-
* Loads services of the given type using the specified class loader and filters them using the provided predicate.
39+
* Filters the supplied service loader using the supplied predicate.
4040
*
4141
* @param <T> the type of the service
42-
* @param service the class of the service to be loaded
42+
* @param serviceLoader the service loader to be filtered
4343
* @param providerPredicate the predicate to filter the loaded services
44-
* @param loader the class loader to be used to load the services
4544
* @return a stream of loaded services that match the predicate
4645
*/
47-
public static <T> Stream<T> load(Class<T> service, Predicate<? super Class<? extends T>> providerPredicate,
48-
ClassLoader loader) {
46+
public static <T> Stream<T> filter(ServiceLoader<T> serviceLoader,
47+
Predicate<? super Class<? extends T>> providerPredicate) {
4948
// @formatter:off
50-
return ServiceLoader.load(service, loader)
49+
return serviceLoader
5150
.stream()
5251
.filter(provider -> providerPredicate.test(provider.type()))
5352
.map(ServiceLoader.Provider::get);

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.util.ArrayList;
1616
import java.util.List;
17+
import java.util.ServiceLoader;
1718
import java.util.function.Function;
1819
import java.util.function.Predicate;
1920

@@ -54,9 +55,9 @@ private static <T> String logLoadedInstances(Class<T> type, List<T> instances, L
5455

5556
private static <T> List<T> load(Class<T> type, Predicate<String> classNameFilter,
5657
Function<List<T>, String> logMessageSupplier) {
58+
ServiceLoader<T> serviceLoader = ServiceLoader.load(type, ClassLoaderUtils.getDefaultClassLoader());
5759
Predicate<Class<? extends T>> providerPredicate = clazz -> classNameFilter.test(clazz.getName());
58-
List<T> instances = ServiceLoaderUtils.load(type, providerPredicate, ClassLoaderUtils.getDefaultClassLoader()) //
59-
.collect(toList());
60+
List<T> instances = ServiceLoaderUtils.filter(serviceLoader, providerPredicate).collect(toList());
6061
getLogger().config(() -> logMessageSupplier.apply(instances));
6162
return instances;
6263
}

0 commit comments

Comments
 (0)