You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/12/12 15:32:25 UTC

(camel) 05/07: CAMEL-20141: Consolidate camel-joor and camel-java-joor-dsl

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

davsclaus pushed a commit to branch joor
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e70aa0eff26409b8d2d1445900fcd899db5aeb99
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 12 13:53:07 2023 +0100

    CAMEL-20141: Consolidate camel-joor and camel-java-joor-dsl
---
 .../apache/camel/language/joor/JoorScriptingCompiler.java |  5 ++++-
 .../java/org/apache/camel/language/joor/MultiCompile.java |  5 +++--
 .../camel/dsl/java/joor/JavaRoutesBuilderLoader.java      | 15 ++++++++++++++-
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorScriptingCompiler.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorScriptingCompiler.java
index 6a625340174..81c0f2d555b 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorScriptingCompiler.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorScriptingCompiler.java
@@ -84,10 +84,13 @@ public class JoorScriptingCompiler extends ServiceSupport implements StaticServi
         CamelContext context = getCamelContext();
         if (context != null) {
             // use existing class loader if available
-            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("CamelJoorClassLoader");
+            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("JavaJoorClassLoader");
             if (classLoader == null) {
                 classLoader = new JavaJoorClassLoader();
+                LOG.warn("Creating new JavaJoorClassLoader");
                 context.getClassResolver().addClassLoader(classLoader);
+            } else {
+                LOG.warn("Using existing JavaJoorClassLoader");
             }
             // use work dir for classloader as it writes compiled classes to disk
             CompileStrategy cs = context.getCamelContextExtension().getContextPlugin(CompileStrategy.class);
diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/MultiCompile.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/MultiCompile.java
index 9ef05add484..1f880647838 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/MultiCompile.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/MultiCompile.java
@@ -90,13 +90,14 @@ public final class MultiCompile {
 
         Lookup lookup = MethodHandles.lookup();
         ClassLoader cl = unit.getClassLoader() != null ? unit.getClassLoader() : lookup.lookupClass().getClassLoader();
+        LOG.warn("Using classloader: {}", System.identityHashCode(cl));
         unit.getInput().forEach((cn, code) -> {
             try {
                 Class<?> clazz = cl.loadClass(cn);
                 result.addResult(cn, clazz, null);
-                LOG.debug("Class already compiled: {}", cn);
+                LOG.warn("Class already compiled: {}", cn);
             } catch (ClassNotFoundException ignore) {
-                LOG.debug("Class must be compiled: {}", cn);
+                LOG.warn("Class must be compiled: {}", cn);
                 files.add(new CharSequenceJavaFileObject(cn, code));
             }
         });
diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
index 2e428364d2f..32c5b1f4ca2 100644
--- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
+++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
@@ -18,7 +18,9 @@ package org.apache.camel.dsl.java.joor;
 
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Modifier;
+import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -34,6 +36,7 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.dsl.support.ExtendedRouteBuilderLoaderSupport;
+import org.apache.camel.language.joor.CamelJoorClassLoader;
 import org.apache.camel.language.joor.CompilationUnit;
 import org.apache.camel.language.joor.JavaJoorClassLoader;
 import org.apache.camel.language.joor.MultiCompile;
@@ -74,10 +77,13 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport {
         CamelContext context = getCamelContext();
         if (context != null) {
             // use existing class loader if available
-            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("CamelJoorClassLoader");
+            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("JavaJoorClassLoader");
             if (classLoader == null) {
                 classLoader = new JavaJoorClassLoader();
+                LOG.warn("Creating new JavaJoorClassLoader");
                 context.getClassResolver().addClassLoader(classLoader);
+            } else {
+                LOG.warn("Using existing JavaJoorClassLoader");
             }
             // use work dir for classloader as it writes compiled classes to disk
             CompileStrategy cs = context.getCamelContextExtension().getContextPlugin(CompileStrategy.class);
@@ -189,6 +195,13 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport {
             }
         }
 
+        // include classloader from Camel, so we can load any already compiled and loaded classes
+        ClassLoader parent = MethodHandles.lookup().lookupClass().getClassLoader();
+        if (parent instanceof URLClassLoader ucl) {
+            ClassLoader cl = new CamelJoorClassLoader(ucl, getCamelContext());
+            unit.withClassLoader(cl);
+        }
+
         if (LOG.isDebugEnabled()) {
             String names = String.join(", ", unit.getInput().keySet());
             LOG.debug("Compiling: {}", names);