From 6da288cfbdaa2b65acae9619446e4b47fb6a028f Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Mon, 11 Nov 2019 20:36:54 +0530 Subject: [PATCH 1/2] issue-5326 Add a testcase to reproduce the issue --- .../resteasy/test/cdi/BeanGenerationTest.java | 32 +++++++++++++++++++ .../quarkus/resteasy/test/cdi/Greeting.java | 14 ++++++++ .../resteasy/test/cdi/GreetingEndpoint.java | 21 ++++++++++++ .../resteasy/test/cdi/MorningGreeting.java | 15 +++++++++ .../resteasy/test/cdi/internal/Hello.java | 11 +++++++ .../test/cdi/internal/PublicHello.java | 11 +++++++ 6 files changed, 104 insertions(+) create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/BeanGenerationTest.java create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/Greeting.java create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/GreetingEndpoint.java create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/Hello.java create mode 100644 extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/PublicHello.java diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/BeanGenerationTest.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/BeanGenerationTest.java new file mode 100644 index 0000000000000..fba7e8729fc89 --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/BeanGenerationTest.java @@ -0,0 +1,32 @@ +package io.quarkus.resteasy.test.cdi; + +import static io.restassured.RestAssured.when; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.resteasy.test.cdi.internal.PublicHello; +import io.quarkus.test.QuarkusUnitTest; + +/** + * + */ +public class BeanGenerationTest { + + @RegisterExtension + static QuarkusUnitTest runner = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addPackage(PublicHello.class.getPackage()) + .addClasses(Greeting.class, MorningGreeting.class, GreetingEndpoint.class)); + + @Test + public void testInvocation() throws Exception { + when().get("/cdi-greeting/greet") + .then() + .statusCode(200) + .body(Matchers.is("Good Morning")); + } +} diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/Greeting.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/Greeting.java new file mode 100644 index 0000000000000..89d1df0a1bfae --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/Greeting.java @@ -0,0 +1,14 @@ +package io.quarkus.resteasy.test.cdi; + +import io.quarkus.resteasy.test.cdi.internal.PublicHello; + +/** + * + */ +public class Greeting extends PublicHello { + + @Override + public String greet() { + return "Hello user"; + } +} diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/GreetingEndpoint.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/GreetingEndpoint.java new file mode 100644 index 0000000000000..b901300df3876 --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/GreetingEndpoint.java @@ -0,0 +1,21 @@ +package io.quarkus.resteasy.test.cdi; + +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +/** + * + */ +@Path("/cdi-greeting") +public class GreetingEndpoint { + + @Inject + Greeting greeting; + + @GET + @Path("/greet") + public String greet() { + return greeting.greet(); + } +} diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java new file mode 100644 index 0000000000000..f7d5df8cf345f --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java @@ -0,0 +1,15 @@ +package io.quarkus.resteasy.test.cdi; + +import javax.enterprise.context.Dependent; + +/** + * + */ +@Dependent +public class MorningGreeting extends Greeting { + + @Override + public String greet() { + return "Good morning"; + } +} diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/Hello.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/Hello.java new file mode 100644 index 0000000000000..6d63bfcd782b8 --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/Hello.java @@ -0,0 +1,11 @@ +package io.quarkus.resteasy.test.cdi.internal; + +/** + * + */ +class Hello { + + void noop() { + System.out.println("Hello"); + } +} diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/PublicHello.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/PublicHello.java new file mode 100644 index 0000000000000..5d8ecf4340e9d --- /dev/null +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/internal/PublicHello.java @@ -0,0 +1,11 @@ +package io.quarkus.resteasy.test.cdi.internal; + +/** + * + */ +public class PublicHello extends Hello { + + public String greet() { + return "Hello"; + } +} From 2c6df7301c9243beb4ad00181daae7ff2a25e980 Mon Sep 17 00:00:00 2001 From: Stuart Douglas Date: Tue, 12 Nov 2019 08:07:57 +1100 Subject: [PATCH 2/2] Load classes using Class.forName We need to do this as the class may be package private. Fixes #5326 --- .../resteasy/test/cdi/MorningGreeting.java | 2 +- .../java/io/quarkus/arc/processor/Types.java | 18 ++++++++++++++++-- .../src/main/java/io/quarkus/arc/Arc.java | 13 +++++++++---- .../java/io/quarkus/test/QuarkusUnitTest.java | 2 +- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java index f7d5df8cf345f..e7a3a6bde9dc5 100644 --- a/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java +++ b/extensions/resteasy/deployment/src/test/java/io/quarkus/resteasy/test/cdi/MorningGreeting.java @@ -10,6 +10,6 @@ public class MorningGreeting extends Greeting { @Override public String greet() { - return "Good morning"; + return "Good Morning"; } } diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Types.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Types.java index 5673eb3a04348..78af2a16e697f 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Types.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Types.java @@ -1,6 +1,7 @@ package io.quarkus.arc.processor; import static io.quarkus.arc.processor.IndexClassLookupUtils.getClassByName; +import static io.quarkus.gizmo.MethodDescriptor.ofMethod; import io.quarkus.arc.impl.GenericArrayTypeImpl; import io.quarkus.arc.impl.ParameterizedTypeImpl; @@ -49,7 +50,8 @@ private Types() { static ResultHandle getTypeHandle(BytecodeCreator creator, Type type) { if (Kind.CLASS.equals(type.kind())) { - return creator.loadClass(type.asClassType().name().toString()); + String className = type.asClassType().name().toString(); + return doLoadClass(creator, className); } else if (Kind.TYPE_VARIABLE.equals(type.kind())) { // E.g. T -> new TypeVariableImpl("T") TypeVariable typeVariable = type.asTypeVariable(); @@ -79,7 +81,7 @@ static ResultHandle getTypeHandle(BytecodeCreator creator, Type type) { return creator.newInstance( MethodDescriptor.ofConstructor(ParameterizedTypeImpl.class, java.lang.reflect.Type.class, java.lang.reflect.Type[].class), - creator.loadClass(parameterizedType.name().toString()), typeArgsHandle); + doLoadClass(creator, parameterizedType.name().toString()), typeArgsHandle); } else if (Kind.ARRAY.equals(type.kind())) { Type componentType = type.asArrayType().component(); @@ -128,6 +130,18 @@ static ResultHandle getTypeHandle(BytecodeCreator creator, Type type) { } } + private static ResultHandle doLoadClass(BytecodeCreator creator, String className) { + //we need to use Class.forName as the class may be package private + ResultHandle currentThread = creator + .invokeStaticMethod(ofMethod(Thread.class, "currentThread", Thread.class)); + ResultHandle tccl = creator.invokeVirtualMethod( + ofMethod(Thread.class, "getContextClassLoader", ClassLoader.class), + currentThread); + return creator.invokeStaticMethod( + ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class), + creator.load(className), creator.load(true), tccl); + } + static Type getProviderType(ClassInfo classInfo) { List typeParameters = classInfo.typeParameters(); if (!typeParameters.isEmpty()) { diff --git a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/Arc.java b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/Arc.java index 1eacc312c04a9..2e715388b2315 100644 --- a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/Arc.java +++ b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/Arc.java @@ -16,10 +16,15 @@ public final class Arc { public static ArcContainer initialize() { if (INITIALIZED.compareAndSet(false, true)) { - ArcContainerImpl container = new ArcContainerImpl(); - INSTANCE.set(container); - container.init(); - return container; + try { + ArcContainerImpl container = new ArcContainerImpl(); + INSTANCE.set(container); + container.init(); + return container; + } catch (Throwable t) { + INITIALIZED.set(false); + throw new RuntimeException("Failed to initialize Arc", t); + } } return container(); } diff --git a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusUnitTest.java b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusUnitTest.java index fdf414dbe47fe..5191f3071d52b 100644 --- a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusUnitTest.java +++ b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusUnitTest.java @@ -301,7 +301,7 @@ public void execute(BuildContext context) { Object actualTest = factory.get(); extensionContext.getStore(ExtensionContext.Namespace.GLOBAL).put(testClass.getName(), actualTest); - } catch (Exception e) { + } catch (Throwable e) { started = false; if (assertException != null) { if (e instanceof RuntimeException) {