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) {