Skip to content

Commit 202a04a

Browse files
authored
Merge pull request #9938 from geoand/#9886
Fix deepClone issue with Supplier
2 parents 4a5c76d + 1978f4f commit 202a04a

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

integration-tests/main/src/test/java/io/quarkus/it/main/ParameterResolverTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44

55
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.function.Supplier;
68

79
import javax.inject.Inject;
810

@@ -18,15 +20,19 @@
1820

1921
@QuarkusTest
2022
@ExtendWith(ParameterResolverTest.UnusedBeanDummyInputResolver.class)
23+
@ExtendWith(ParameterResolverTest.SupplierParameterResolver.class)
2124
public class ParameterResolverTest {
2225

2326
@Inject
2427
UnusedBean unusedBean;
2528

2629
@Test
27-
public void testParameterResolver(UnusedBean.DummyInput dummyInput) {
30+
public void testParameterResolver(UnusedBean.DummyInput dummyInput, Supplier<UnusedBean.DummyInput> supplier) {
2831
UnusedBean.DummyResult dummyResult = unusedBean.dummy(dummyInput);
2932
assertEquals("whatever/6", dummyResult.getResult());
33+
34+
dummyResult = unusedBean.dummy(supplier.get());
35+
assertEquals("fromSupplier/0", dummyResult.getResult());
3036
}
3137

3238
public static class UnusedBeanDummyInputResolver implements ParameterResolver {
@@ -44,4 +50,20 @@ public Object resolveParameter(ParameterContext parameterContext,
4450
}
4551
}
4652

53+
public static class SupplierParameterResolver implements ParameterResolver {
54+
55+
@Override
56+
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
57+
throws ParameterResolutionException {
58+
return Supplier.class.getName().equals(parameterContext.getParameter().getType().getName());
59+
}
60+
61+
@Override
62+
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
63+
throws ParameterResolutionException {
64+
return (Supplier<UnusedBean.DummyInput>) () -> new UnusedBean.DummyInput("fromSupplier",
65+
new UnusedBean.NestedDummyInput(Collections.emptyList()));
66+
}
67+
}
68+
4769
}

test-framework/junit5/src/main/java/io/quarkus/test/junit/internal/XStreamDeepClone.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.test.junit.internal;
22

3+
import java.util.function.Supplier;
4+
35
import com.thoughtworks.xstream.XStream;
46

57
/**
@@ -17,7 +19,33 @@ public XStreamDeepClone(ClassLoader classLoader) {
1719
}
1820

1921
public Object clone(Object objectToClone) {
22+
if (objectToClone == null) {
23+
return null;
24+
}
25+
26+
if (objectToClone instanceof Supplier) {
27+
return handleSupplier((Supplier<?>) objectToClone);
28+
}
29+
30+
return doClone(objectToClone);
31+
}
32+
33+
private Supplier<Object> handleSupplier(final Supplier<?> supplier) {
34+
return new Supplier<Object>() {
35+
@Override
36+
public Object get() {
37+
return doClone(supplier.get());
38+
}
39+
};
40+
}
41+
42+
private Object doClone(Object objectToClone) {
2043
final String serialized = xStream.toXML(objectToClone);
21-
return xStream.fromXML(serialized);
44+
final Object result = xStream.fromXML(serialized);
45+
if (result == null) {
46+
throw new IllegalStateException("Unable to deep clone object of type '" + objectToClone.getClass().getName()
47+
+ "'. Please report the issue on the Quarkus issue tracker.");
48+
}
49+
return result;
2250
}
2351
}

0 commit comments

Comments
 (0)