You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2023/04/11 19:45:50 UTC

[camel-quarkus] 02/06: Ref #4731: java-joor-dsl - Add support of inner classes (#4732)

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch java-joor-dsl-backports
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit d67689557c66504d0de8466fd5dbd619b6f1877d
Author: Nicolas Filotto <es...@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"));
     }
 }