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 <claus.ib...@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) {