This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 4efd30ea9ec CAMEL-18860: java-joor-dsl - Adapt the code for native compilation (#8978) 4efd30ea9ec is described below commit 4efd30ea9ec551da9bdae1ba17aa6278a75bb6b8 Author: Nicolas Filotto <essob...@users.noreply.github.com> AuthorDate: Thu Jan 5 08:49:10 2023 +0100 CAMEL-18860: java-joor-dsl - Adapt the code for native compilation (#8978) ## Motivation To ease the native compilation of routes written using the Java DSL, we need to adapt the code to be able to reuse some parts of the existing code. ## Modifications * Move the reusable methods `asClassName` and `determineName` to a helper class * Allow providing compilation options when compiling to give the ability to set the classpath * Fix some violations --- .../dsl/java/joor/ClassRoutesBuilderLoader.java | 16 +---- .../org/apache/camel/dsl/java/joor/Helper.java | 73 ++++++++++++++++++++++ .../camel/dsl/java/joor/JavaJoorClassLoader.java | 5 +- .../dsl/java/joor/JavaRoutesBuilderLoader.java | 24 +------ .../apache/camel/dsl/java/joor/MultiCompile.java | 21 +++++-- 5 files changed, 95 insertions(+), 44 deletions(-) diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ClassRoutesBuilderLoader.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ClassRoutesBuilderLoader.java index 7e783a0a3c7..eb8b17a0423 100644 --- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ClassRoutesBuilderLoader.java +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ClassRoutesBuilderLoader.java @@ -31,10 +31,11 @@ import org.apache.camel.spi.CompilePostProcessor; import org.apache.camel.spi.Resource; import org.apache.camel.spi.ResourceAware; import org.apache.camel.spi.annotations.RoutesLoader; -import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.camel.dsl.java.joor.Helper.asClassName; + @ManagedResource(description = "Managed ClassRoutesBuilderLoader") @RoutesLoader(ClassRoutesBuilderLoader.EXTENSION) public class ClassRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport { @@ -99,17 +100,4 @@ public class ClassRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport return answer; } - - private static String asClassName(Resource resource) { - String className = resource.getLocation(); - if (className.contains(":")) { - // remove scheme such as classpath:foo.class - className = StringHelper.after(className, ":"); - } - className = className.replace('/', '.'); - if (className.endsWith(".class")) { - className = className.substring(0, className.length() - 6); - } - return className; - } } diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/Helper.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/Helper.java new file mode 100644 index 00000000000..b2342c6e17c --- /dev/null +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/Helper.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.dsl.java.joor; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.camel.spi.Resource; +import org.apache.camel.support.ResourceHelper; +import org.apache.camel.util.FileUtil; +import org.apache.camel.util.StringHelper; + +/** + * A helper class allowing to reuse part of the code outside of Camel easily. + */ +public final class Helper { + + private static final Pattern PACKAGE_PATTERN = Pattern.compile( + "^\\s*package\\s+([a-zA-Z][.\\w]*)\\s*;.*$", Pattern.MULTILINE); + + private Helper() { + + } + + /** + * @return the name of the class according to its location. + */ + public static String asClassName(Resource resource) { + String className = resource.getLocation(); + if (className.contains(":")) { + // remove scheme such as classpath:foo.class + className = StringHelper.after(className, ":"); + } + assert className != null; + className = className.replace('/', '.'); + if (className.endsWith(".class")) { + className = className.substring(0, className.length() - 6); + } + return className; + } + + /** + * @return the name of the class according to its location and its source code. + */ + public static String determineName(Resource resource, String content) { + String loc = resource.getLocation(); + // strip scheme to compute the name + String scheme = ResourceHelper.getScheme(loc); + if (scheme != null) { + loc = loc.substring(scheme.length()); + } + final String name = FileUtil.onlyName(loc, true); + final Matcher matcher = PACKAGE_PATTERN.matcher(content); + + return matcher.find() + ? matcher.group(1) + "." + name + : name; + } +} diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaJoorClassLoader.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaJoorClassLoader.java index 7010ec22c03..0b3c08a26a8 100644 --- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaJoorClassLoader.java +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaJoorClassLoader.java @@ -31,13 +31,12 @@ public class JavaJoorClassLoader extends ClassLoader implements CompilePostProce } @Override - protected Class<?> findClass(String name) throws ClassNotFoundException { + protected Class<?> findClass(String name) { return classes.get(name); } @Override - public void postCompile(CamelContext camelContext, String name, Class<?> clazz, byte[] byteCode, Object instance) - throws Exception { + public void postCompile(CamelContext camelContext, String name, Class<?> clazz, byte[] byteCode, Object instance) { if (name != null && clazz != null) { classes.put(name, clazz); } 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 dda8b0a723e..bcd686b5f9a 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 @@ -27,8 +27,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; @@ -45,19 +43,18 @@ import org.apache.camel.spi.ResourceAware; import org.apache.camel.spi.annotations.RoutesLoader; import org.apache.camel.support.ResourceHelper; import org.apache.camel.support.RouteWatcherReloadStrategy; -import org.apache.camel.util.FileUtil; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.camel.dsl.java.joor.Helper.determineName; + @ManagedResource(description = "Managed JavaRoutesBuilderLoader") @RoutesLoader(JavaRoutesBuilderLoader.EXTENSION) public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport { public static final String EXTENSION = "java"; - public static final Pattern PACKAGE_PATTERN = Pattern.compile( - "^\\s*package\\s+([a-zA-Z][\\.\\w]*)\\s*;.*$", Pattern.MULTILINE); private static final Logger LOG = LoggerFactory.getLogger(JavaRoutesBuilderLoader.class); @@ -69,7 +66,7 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport { protected void doBuild() throws Exception { super.doBuild(); - // register joor classloader to camel so we are able to load classes we have compiled + // register jOOR classloader to camel, so we are able to load classes we have compiled CamelContext context = getCamelContext(); if (context != null) { JavaJoorClassLoader cl = new JavaJoorClassLoader(); @@ -222,19 +219,4 @@ public class JavaRoutesBuilderLoader extends ExtendedRouteBuilderLoaderSupport { } } - private static String determineName(Resource resource, String content) { - String loc = resource.getLocation(); - // strip scheme to compute the name - String scheme = ResourceHelper.getScheme(loc); - if (scheme != null) { - loc = loc.substring(scheme.length()); - } - final String name = FileUtil.onlyName(loc, true); - final Matcher matcher = PACKAGE_PATTERN.matcher(content); - - return matcher.find() - ? matcher.group(1) + "." + name - : name; - } - } diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java index a7f2a75f376..2d757d1c56a 100644 --- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java @@ -72,6 +72,17 @@ public final class MultiCompile { * @return the compilation result */ public static CompilationUnit.Result compileUnit(CompilationUnit unit) { + return compileUnit(unit, new ArrayList<>()); + } + + /** + * Compiles multiple files as one unit + * + * @param unit the files to compile in the same unit + * @param options the compilation options to use + * @return the compilation result + */ + public static CompilationUnit.Result compileUnit(CompilationUnit unit, List<String> options) { CompilationUnit.Result result = CompilationUnit.result(); // some classes may already be compiled so try to load them first @@ -91,10 +102,6 @@ public final class MultiCompile { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); try { - ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null)); - StringWriter out = new StringWriter(); - - List<String> options = new ArrayList<>(); if (!options.contains("-classpath")) { StringBuilder classpath = new StringBuilder(); String separator = System.getProperty("path.separator"); @@ -121,16 +128,18 @@ public final class MultiCompile { } if (LOG.isDebugEnabled()) { - LOG.debug("Java JooR Compile -classpath: {}", classpath); + LOG.debug("Java jOOR Compile -classpath: {}", classpath); } options.addAll(Arrays.asList("-classpath", classpath.toString())); } DiagnosticCollector<javax.tools.JavaFileObject> dc = new DiagnosticCollector<>(); + ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null)); + StringWriter out = new StringWriter(); CompilationTask task = compiler.getTask(out, fileManager, dc, options, null, files); boolean success = task.call(); - // after compilation then we need to cleanup some unexpected output + // after compilation then we need to clean up some unexpected output cleanupWaste(); if (!success || fileManager.isEmpty()) {