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 45b1b5b6ecfc83b227b6cc41dd5ca9f34ed93830
Author: Nicolas Filotto <nfilo...@talend.com>
AuthorDate: Mon Apr 3 15:43:09 2023 +0200

    Ref #4716: java-joor-dsl - Support RegisterForReflection for the current 
class
---
 .../java/joor/deployment/JavaJoorDslProcessor.java | 36 +++++++++++++---------
 1 file changed, 22 insertions(+), 14 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 4b1d577c26..b52818dc46 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
@@ -109,12 +109,14 @@ public class JavaJoorDslProcessor {
                         .produce(new 
JavaJoorGeneratedClassBuildItem(className, 
nameToResource.get(className).getLocation(),
                                 result.getByteCode(className)));
                 Class<?> aClass = result.getClass(className);
+                // Inner classes
                 for (Class<?> clazz : aClass.getDeclaredClasses()) {
                     String name = clazz.getName();
                     generatedClass
                             .produce(new JavaJoorGeneratedClassBuildItem(name, 
nameToResource.get(className).getLocation(),
                                     result.getByteCode(name)));
                 }
+                // Anonymous classes
                 for (int i = 1;; i++) {
                     String name = String.format("%s$%d", className, i);
                     byte[] content = result.getByteCode(name);
@@ -125,8 +127,7 @@ public class JavaJoorDslProcessor {
                             .produce(new JavaJoorGeneratedClassBuildItem(name, 
nameToResource.get(className).getLocation(),
                                     content));
                 }
-                registerForReflection(reflectiveClass, 
lambdaCapturingTypeProducer,
-                        aClass.getAnnotation(RegisterForReflection.class));
+                registerForReflection(reflectiveClass, 
lambdaCapturingTypeProducer, aClass);
             }
         } finally {
             // Restore the CP
@@ -135,8 +136,8 @@ public class JavaJoorDslProcessor {
     }
 
     private void registerForReflection(BuildProducer<ReflectiveClassBuildItem> 
reflectiveClass,
-            BuildProducer<LambdaCapturingTypeBuildItem> 
lambdaCapturingTypeProducer,
-            RegisterForReflection annotation) {
+            BuildProducer<LambdaCapturingTypeBuildItem> 
lambdaCapturingTypeProducer, Class<?> aClass) {
+        RegisterForReflection annotation = 
aClass.getAnnotation(RegisterForReflection.class);
         if (annotation == null) {
             return;
         }
@@ -153,17 +154,25 @@ public class JavaJoorDslProcessor {
             LOG.warn(
                     "The element 'registerFullHierarchy' of the annotation 
'RegisterForReflection' is not supported by the extension Camel Java jOOR DSL");
         }
-        for (Class<?> type : annotation.targets()) {
-            registerClass(type.getName(), methods, fields, ignoreNested, 
serialization, reflectiveClass);
+        Class<?>[] targets = annotation.targets();
+        String[] classNames = annotation.classNames();
+        if (targets.length == 0 && classNames.length == 0) {
+            // No target and classname set, the target is then the class itself
+            registerClass(aClass, aClass.getName(), methods, fields, 
ignoreNested, serialization, reflectiveClass);
+            return;
+        }
+
+        for (Class<?> type : targets) {
+            registerClass(type, type.getName(), methods, fields, ignoreNested, 
serialization, reflectiveClass);
         }
 
-        for (String className : annotation.classNames()) {
-            registerClass(className, methods, fields, ignoreNested, 
serialization, reflectiveClass);
+        for (String className : classNames) {
+            registerClass(null, className, methods, fields, ignoreNested, 
serialization, reflectiveClass);
         }
     }
 
-    private void registerClass(String className, boolean methods, boolean 
fields, boolean ignoreNested, boolean serialization,
-            BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
+    private void registerClass(Class<?> type, String className, boolean 
methods, boolean fields, boolean ignoreNested,
+            boolean serialization, BuildProducer<ReflectiveClassBuildItem> 
reflectiveClass) {
         reflectiveClass.produce(serialization
                 ? ReflectiveClassBuildItem.serializationClass(className)
                 : new ReflectiveClassBuildItem(methods, fields, className));
@@ -173,10 +182,9 @@ public class JavaJoorDslProcessor {
         }
 
         try {
-            Class<?>[] declaredClasses = 
Thread.currentThread().getContextClassLoader().loadClass(className)
-                    .getDeclaredClasses();
-            for (Class<?> clazz : declaredClasses) {
-                registerClass(clazz.getName(), methods, fields, false, 
serialization, reflectiveClass);
+            Class<?> aClass = type == null ? 
Thread.currentThread().getContextClassLoader().loadClass(className) : type;
+            for (Class<?> clazz : aClass.getDeclaredClasses()) {
+                registerClass(clazz, clazz.getName(), methods, fields, false, 
serialization, reflectiveClass);
             }
         } catch (ClassNotFoundException e) {
             LOG.warn("Failed to load Class {}", className, e);

Reply via email to