Skip to content

Commit 27b738f

Browse files
committed
Make creating LauncherSessionListeners interceptable
1 parent d65913c commit 27b738f

File tree

3 files changed

+45
-42
lines changed

3 files changed

+45
-42
lines changed

junit-platform-launcher/src/main/java/org/junit/platform/launcher/LauncherInterceptor.java

+40
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
package org.junit.platform.launcher;
1212

1313
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
14+
import static org.apiguardian.api.API.Status.INTERNAL;
15+
16+
import java.util.List;
1417

1518
import org.apiguardian.api.API;
1619

@@ -28,6 +31,18 @@
2831
@API(status = EXPERIMENTAL, since = "1.10")
2932
public interface LauncherInterceptor {
3033

34+
LauncherInterceptor NOOP = new LauncherInterceptor() {
35+
@Override
36+
public <T> T intercept(Invocation<T> invocation) {
37+
return invocation.proceed();
38+
}
39+
40+
@Override
41+
public void close() {
42+
// do nothing
43+
}
44+
};
45+
3146
/**
3247
* Intercept the supplied invocation.
3348
*
@@ -54,4 +69,29 @@ public interface LauncherInterceptor {
5469
interface Invocation<T> {
5570
T proceed();
5671
}
72+
73+
@API(status = INTERNAL, since = "1.10")
74+
static LauncherInterceptor composite(List<LauncherInterceptor> interceptors) {
75+
if (interceptors.isEmpty()) {
76+
return NOOP;
77+
}
78+
return interceptors.stream() //
79+
.skip(1) //
80+
.reduce(interceptors.get(0), (a, b) -> new LauncherInterceptor() {
81+
@Override
82+
public void close() {
83+
try {
84+
a.close();
85+
}
86+
finally {
87+
b.close();
88+
}
89+
}
90+
91+
@Override
92+
public <T> T intercept(Invocation<T> invocation) {
93+
return a.intercept(() -> b.intercept(invocation));
94+
}
95+
});
96+
}
5797
}

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ class DefaultLauncherSession implements LauncherSession {
3333

3434
DefaultLauncherSession(List<LauncherInterceptor> interceptors, Supplier<Launcher> launcherSupplier,
3535
Supplier<LauncherSessionListener> listenerSupplier) {
36-
this.listener = listenerSupplier.get();
37-
CloseableLauncher closeableLauncher = InterceptingClosableLauncher.decorate(launcherSupplier, interceptors);
36+
LauncherInterceptor interceptor = LauncherInterceptor.composite(interceptors);
37+
this.listener = interceptor.intercept(listenerSupplier::get);
38+
Launcher launcher = interceptor.intercept(launcherSupplier::get);
39+
CloseableLauncher closeableLauncher = new InterceptingClosableLauncher(launcher, interceptor);
3840
this.launcher = new DelegatingCloseableLauncher<>(closeableLauncher, delegate -> {
3941
delegate.close();
4042
return ClosedLauncher.INSTANCE;

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

+1-40
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010

1111
package org.junit.platform.launcher.core;
1212

13-
import static java.util.function.Function.identity;
14-
15-
import java.util.List;
16-
import java.util.Optional;
17-
import java.util.function.Supplier;
18-
1913
import org.junit.platform.launcher.Launcher;
2014
import org.junit.platform.launcher.LauncherDiscoveryRequest;
2115
import org.junit.platform.launcher.LauncherInterceptor;
@@ -27,42 +21,9 @@
2721
*/
2822
class InterceptingClosableLauncher extends DelegatingCloseableLauncher<Launcher> {
2923

30-
static CloseableLauncher decorate(Supplier<Launcher> launcherSupplier, List<LauncherInterceptor> interceptors) {
31-
Optional<LauncherInterceptor> combinedInterceptor = composite(interceptors);
32-
Launcher launcher = combinedInterceptor.map(it -> it.intercept(launcherSupplier::get)).orElseGet(
33-
launcherSupplier);
34-
return combinedInterceptor //
35-
.map(it -> (CloseableLauncher) new InterceptingClosableLauncher(launcher, it)) //
36-
.orElse(new DelegatingCloseableLauncher<>(launcher, identity()));
37-
}
38-
39-
private static Optional<LauncherInterceptor> composite(List<LauncherInterceptor> interceptors) {
40-
if (interceptors.isEmpty()) {
41-
return Optional.empty();
42-
}
43-
return Optional.of(interceptors.stream() //
44-
.skip(1) //
45-
.reduce(interceptors.get(0), (a, b) -> new LauncherInterceptor() {
46-
@Override
47-
public void close() {
48-
try {
49-
a.close();
50-
}
51-
finally {
52-
b.close();
53-
}
54-
}
55-
56-
@Override
57-
public <T> T intercept(Invocation<T> invocation) {
58-
return a.intercept(() -> b.intercept(invocation));
59-
}
60-
}));
61-
}
62-
6324
private final LauncherInterceptor interceptor;
6425

65-
private InterceptingClosableLauncher(Launcher delegate, LauncherInterceptor interceptor) {
26+
InterceptingClosableLauncher(Launcher delegate, LauncherInterceptor interceptor) {
6627
super(delegate, it -> {
6728
interceptor.close();
6829
return it;

0 commit comments

Comments
 (0)