This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch 2.16.x in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 38e38bf6de3233c3f575b47ddcf3e1478b6a0b8f Author: Nicolas Filotto <essob...@users.noreply.github.com> AuthorDate: Mon Apr 3 15:25:48 2023 +0200 Ref #4731: java-joor-dsl - Add support of inner classes (#4732) When a `RouteBuilder` class has an inner class, the inner class is unknown by Quarkus in native mode which causes a native compilation issue. The goal of this PR is to add the support of inner classes to prevent the native compilation issue. * Produce `JavaJoorGeneratedClassBuildItem` for inner classes too * Add a unit test to ensure that it works as expected --- .../dsl/java/joor/deployment/JavaJoorDslProcessor.java | 9 ++++++++- .../camel/quarkus/dsl/java/joor/JavaJoorDslResource.java | 8 ++++++++ .../java-joor-dsl/src/main/resources/routes/MyRoutes.java | 15 +++++++++++++++ .../camel/quarkus/dsl/java/joor/JavaJoorDslTest.java | 12 +++++++++++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/extensions/java-joor-dsl/deployment/src/main/java/org/apache/camel/quarkus/dsl/java/joor/deployment/JavaJoorDslProcessor.java b/extensions/java-joor-dsl/deployment/src/main/java/org/apache/camel/quarkus/dsl/java/joor/deployment/JavaJoorDslProcessor.java index a782e772c8..7e72562f78 100644 --- a/extensions/java-joor-dsl/deployment/src/main/java/org/apache/camel/quarkus/dsl/java/joor/deployment/JavaJoorDslProcessor.java +++ b/extensions/java-joor-dsl/deployment/src/main/java/org/apache/camel/quarkus/dsl/java/joor/deployment/JavaJoorDslProcessor.java @@ -108,8 +108,15 @@ public class JavaJoorDslProcessor { generatedClass .produce(new JavaJoorGeneratedClassBuildItem(className, nameToResource.get(className).getLocation(), result.getByteCode(className))); + Class<?> aClass = result.getClass(className); + for (Class<?> clazz : aClass.getDeclaredClasses()) { + String name = clazz.getName(); + generatedClass + .produce(new JavaJoorGeneratedClassBuildItem(name, nameToResource.get(className).getLocation(), + result.getByteCode(name))); + } registerForReflection(reflectiveClass, lambdaCapturingTypeProducer, - result.getClass(className).getAnnotation(RegisterForReflection.class)); + aClass.getAnnotation(RegisterForReflection.class)); } } finally { // Restore the CP diff --git a/integration-tests/java-joor-dsl/src/main/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslResource.java b/integration-tests/java-joor-dsl/src/main/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslResource.java index 049f24a358..5f08ccbeea 100644 --- a/integration-tests/java-joor-dsl/src/main/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslResource.java +++ b/integration-tests/java-joor-dsl/src/main/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslResource.java @@ -88,4 +88,12 @@ public class JavaJoorDslResource { return producerTemplate.requestBody("direct:joorHi", name, String.class); } + @POST + @Path("/echo") + @Consumes(MediaType.TEXT_PLAIN) + @Produces(MediaType.TEXT_PLAIN) + public String echo(String msg) { + return producerTemplate.requestBody("direct:joorEcho", msg, String.class); + } + } diff --git a/integration-tests/java-joor-dsl/src/main/resources/routes/MyRoutes.java b/integration-tests/java-joor-dsl/src/main/resources/routes/MyRoutes.java index fdcfa82266..065f921c43 100644 --- a/integration-tests/java-joor-dsl/src/main/resources/routes/MyRoutes.java +++ b/integration-tests/java-joor-dsl/src/main/resources/routes/MyRoutes.java @@ -14,6 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import java.util.function.Function; + import io.quarkus.runtime.annotations.RegisterForReflection; import org.apache.camel.builder.RouteBuilder; @@ -32,5 +34,18 @@ public class MyRoutes extends RouteBuilder { Class<?> c2 = Thread.currentThread().getContextClassLoader().loadClass("org.apache.camel.quarkus.dsl.java.joor.JavaJoorDslBean$Inner"); exchange.getMessage().setBody(c2.getMethod("addSource", String.class).invoke(null, hi)); }); + from("direct:joorEcho") + .id("inner-classes-route") + .process(exchange -> { + exchange.getMessage().setBody(Inner.format((String) exchange.getMessage().getBody())); + }); + } + + public static class Inner { + + public static String format(String result) { + Function<String, String> toUpperCase = String::toUpperCase; + return String.format("Msg: %s", toUpperCase.apply(result)); + } } } \ No newline at end of file diff --git a/integration-tests/java-joor-dsl/src/test/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslTest.java b/integration-tests/java-joor-dsl/src/test/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslTest.java index 56862ea213..52bfde5bbd 100644 --- a/integration-tests/java-joor-dsl/src/test/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslTest.java +++ b/integration-tests/java-joor-dsl/src/test/java/org/apache/camel/quarkus/dsl/java/joor/JavaJoorDslTest.java @@ -45,6 +45,16 @@ class JavaJoorDslTest { .body(CoreMatchers.is("Hi Will Smith from jOOR!")); } + @Test + void joorEcho() { + RestAssured.given() + .body("Ping") + .post("/java-joor-dsl/echo") + .then() + .statusCode(200) + .body(CoreMatchers.is("Msg: PING")); + } + @Test void testMainInstanceWithJavaRoutes() { RestAssured.given() @@ -63,6 +73,6 @@ class JavaJoorDslTest { .get("/java-joor-dsl/main/routes") .then() .statusCode(200) - .body(CoreMatchers.is("my-java-route,reflection-route")); + .body(CoreMatchers.is("inner-classes-route,my-java-route,reflection-route")); } }