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:24 UTC

(camel) 04/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 7f804e6f1a9d01838f53b054cec0a67e74b0469b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 12 13:29:06 2023 +0100

    CAMEL-20141: Consolidate camel-joor and camel-java-joor-dsl
---
 .../camel/language/joor/CamelJoorClassLoader.java  | 23 +++++++++-----
 .../apache/camel/language/joor/JavaLanguage.java   |  8 +++--
 .../camel/language/joor/JoorScriptingCompiler.java | 36 ++++++++++++++++++++--
 .../java/org/apache/camel/spi/ClassResolver.java   |  8 +++++
 .../camel/impl/engine/DefaultClassResolver.java    | 12 ++++++++
 .../dsl/java/joor/JavaRoutesBuilderLoader.java     |  9 ++++--
 6 files changed, 83 insertions(+), 13 deletions(-)

diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/CamelJoorClassLoader.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/CamelJoorClassLoader.java
index 8cad0472c06..6a45a9c3b6c 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/CamelJoorClassLoader.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/CamelJoorClassLoader.java
@@ -66,18 +66,25 @@ public class CamelJoorClassLoader extends URLClassLoader {
 
     @Override
     protected Class<?> findClass(String name) throws ClassNotFoundException {
-        for (ClassLoader cl : camelContext.getClassResolver().getClassLoaders()) {
+        return doLoadClass(name);
+    }
+
+    @Override
+    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        return doLoadClass(name);
+    }
+
+    public Class<?> doLoadClass(String name) throws ClassNotFoundException {
+        // first try CamelJoorClassLoader
+        ClassLoader joorClassLoader = camelContext.getClassResolver().getClassLoader("CamelJoorClassLoader");
+        if (joorClassLoader != null) {
             try {
-                return cl.loadClass(name);
+                return joorClassLoader.loadClass(name);
             } catch (ClassNotFoundException e) {
                 // ignore
             }
         }
-        return parent.loadClass(name);
-    }
-
-    @Override
-    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        // then try all of them
         for (ClassLoader cl : camelContext.getClassResolver().getClassLoaders()) {
             try {
                 return cl.loadClass(name);
@@ -85,6 +92,8 @@ public class CamelJoorClassLoader extends URLClassLoader {
                 // ignore
             }
         }
+        // and then parent last
         return parent.loadClass(name);
     }
+
 }
diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
index faca700f6db..9dd7b5b3d88 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
@@ -144,16 +145,19 @@ public class JavaLanguage extends TypedLanguageSupport implements ScriptingLangu
     public void init() {
         // attempt to load optional configuration from classpath
         loadConfiguration();
+
+        CamelContextAware.trySetCamelContext(compiler, getCamelContext());
+        CamelContextAware.trySetCamelContext(scriptingCompiler, getCamelContext());
     }
 
     @Override
     public void start() {
-        ServiceHelper.startService(compiler);
+        ServiceHelper.startService(compiler, scriptingCompiler);
     }
 
     @Override
     public void stop() {
-        ServiceHelper.stopService(compiler);
+        ServiceHelper.stopService(compiler, scriptingCompiler);
     }
 
     private void loadConfiguration() {
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 b3bef416b69..6a625340174 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
@@ -28,7 +28,9 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.StaticService;
+import org.apache.camel.spi.CompileStrategy;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.ScriptHelper;
 import org.apache.camel.support.service.ServiceSupport;
@@ -37,17 +39,29 @@ import org.apache.camel.util.StopWatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JoorScriptingCompiler extends ServiceSupport implements StaticService {
+public class JoorScriptingCompiler extends ServiceSupport implements StaticService, CamelContextAware {
 
     private static final Pattern BEAN_INJECTION_PATTERN = Pattern.compile("(#bean:)([A-Za-z0-9-_]*)");
 
     private static final Logger LOG = LoggerFactory.getLogger(JoorScriptingCompiler.class);
     private static final AtomicInteger UUID = new AtomicInteger();
+    private CamelContext camelContext;
+    private JavaJoorClassLoader classLoader;
     private Set<String> imports = new TreeSet<>();
     private Map<String, String> aliases;
     private int counter;
     private long taken;
 
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
     public Set<String> getImports() {
         return imports;
     }
@@ -64,9 +78,27 @@ public class JoorScriptingCompiler extends ServiceSupport implements StaticServi
         this.aliases = aliases;
     }
 
+    @Override
+    protected void doBuild() throws Exception {
+        // register jOOR classloader to camel, so we are able to load classes we have compiled
+        CamelContext context = getCamelContext();
+        if (context != null) {
+            // use existing class loader if available
+            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("CamelJoorClassLoader");
+            if (classLoader == null) {
+                classLoader = new JavaJoorClassLoader();
+                context.getClassResolver().addClassLoader(classLoader);
+            }
+            // use work dir for classloader as it writes compiled classes to disk
+            CompileStrategy cs = context.getCamelContextExtension().getContextPlugin(CompileStrategy.class);
+            if (cs != null && cs.getWorkDir() != null) {
+                classLoader.setCompileDirectory(cs.getWorkDir());
+            }
+        }
+    }
+
     @Override
     protected void doStop() throws Exception {
-        super.doStop();
         if (counter > 0) {
             LOG.info("jOOR scripting language compiled {} scripts in {} millis", counter, taken);
         }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java b/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
index 2bd504f96b7..6eefdf5a808 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
@@ -39,6 +39,14 @@ public interface ClassResolver {
      */
     Set<ClassLoader> getClassLoaders();
 
+    /**
+     * Gets a custom class loader by its name
+     *
+     * @param name the name of the custom classloader
+     * @return the class loader or <tt>null</tt> if not found
+     */
+    ClassLoader getClassLoader(String name);
+
     /**
      * Resolves the given class by its name
      *
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
index a047df98724..385294c5d23 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
@@ -71,6 +71,18 @@ public class DefaultClassResolver implements ClassResolver, CamelContextAware {
         return Collections.unmodifiableSet(classLoaders);
     }
 
+    @Override
+    public ClassLoader getClassLoader(String name) {
+        if (classLoaders != null) {
+            for (ClassLoader cl : classLoaders) {
+                if (name.equals(cl.getName())) {
+                    return cl;
+                }
+            }
+        }
+        return null;
+    }
+
     @Override
     public Class<?> resolveClass(String name) {
         Class<?> answer;
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 83188ac5e09..2e428364d2f 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
@@ -60,7 +60,7 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport {
 
     private final ConcurrentMap<Collection<Resource>, CompilationUnit.Result> compiled = new ConcurrentHashMap<>();
     private final Map<String, Resource> nameToResource = new HashMap<>();
-    private final JavaJoorClassLoader classLoader = new JavaJoorClassLoader();
+    private JavaJoorClassLoader classLoader;
 
     public JavaRoutesBuilderLoader() {
         super(EXTENSION);
@@ -73,7 +73,12 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport {
         // register jOOR classloader to camel, so we are able to load classes we have compiled
         CamelContext context = getCamelContext();
         if (context != null) {
-            context.getClassResolver().addClassLoader(classLoader);
+            // use existing class loader if available
+            classLoader = (JavaJoorClassLoader) context.getClassResolver().getClassLoader("CamelJoorClassLoader");
+            if (classLoader == null) {
+                classLoader = new JavaJoorClassLoader();
+                context.getClassResolver().addClassLoader(classLoader);
+            }
             // use work dir for classloader as it writes compiled classes to disk
             CompileStrategy cs = context.getCamelContextExtension().getContextPlugin(CompileStrategy.class);
             if (cs != null && cs.getWorkDir() != null) {