This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 941785beb342939fb404db1f0cbf7d2efdb7a0af Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Jun 4 12:33:01 2019 +0200 CAMEL-13594: camel apt - Avoid generating TypeConverter META-INF file when we generate TypeConverterLoader. This also speedup starting Camel as we avoid double scanning out of the box. --- .../converter/AnnotationTypeConverterLoader.java | 3 ++- .../impl/converter/BaseTypeConverterRegistry.java | 5 ++-- .../camel/impl/converter/DefaultTypeConverter.java | 2 +- .../apache/camel/core/osgi/OsgiTypeConverter.java | 2 +- .../camel/tools/apt/TypeConverterProcessor.java | 28 ++++++++++++++++++---- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java index f30359c..a985364 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java @@ -82,7 +82,8 @@ public class AnnotationTypeConverterLoader implements TypeConverterLoader { try { packageNames = findPackageNames(); if (packageNames == null || packageNames.length == 0) { - throw new TypeConverterLoaderException("Cannot find package names to be used for classpath scanning for annotated type converters."); + LOG.debug("No package names found to be used for classpath scanning for annotated type converters."); + return; } } catch (Exception e) { throw new TypeConverterLoaderException("Cannot find package names to be used for classpath scanning for annotated type converters.", e); diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java index 8f45f4d..958c4f2 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java @@ -526,9 +526,10 @@ public abstract class BaseTypeConverterRegistry extends ServiceSupport implement } /** - * Loads the core type converters which is mandatory to use Camel + * Loads the core type converters which is mandatory to use Camel, + * and also loads the fast type converters (generated via @Converter(loader = true). */ - public void loadCoreTypeConverters() throws Exception { + public void loadCoreAndFastTypeConverters() throws Exception { Collection<String> names = findTypeConverterLoaderClasses(); for (String name : names) { log.debug("Resolving TypeConverterLoader: {}", name); diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java index 3bcbd88..ae1b461 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java @@ -63,7 +63,7 @@ public class DefaultTypeConverter extends BaseTypeConverterRegistry { super.doStart(); // core type converters is always loaded which does not use any classpath scanning and therefore is fast - loadCoreTypeConverters(); + loadCoreAndFastTypeConverters(); // we are using backwards compatible legacy mode to detect additional converters if (loadTypeConverters) { diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java index d99b10b..8d620de 100644 --- a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java +++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java @@ -240,7 +240,7 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter, answer.init(); // only load the core type converters, as OSGi activator will keep track on bundles // being installed/uninstalled and load type converters as part of that process - answer.loadCoreTypeConverters(); + answer.loadCoreAndFastTypeConverters(); } catch (Exception e) { throw new RuntimeCamelException("Error loading CoreTypeConverter due: " + e.getMessage(), e); } diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java index 909551c..e78df8d 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java @@ -24,8 +24,10 @@ import java.util.TreeMap; import javax.annotation.processing.Filer; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; -import javax.lang.model.element.NestingKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.tools.FileObject; import javax.tools.StandardLocation; @@ -35,22 +37,29 @@ import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName; @SupportedAnnotationTypes({"org.apache.camel.Converter"}) public class TypeConverterProcessor extends AbstractCamelAnnotationProcessor { + boolean acceptClass(Element element) { + // we accept any class that is not using @Converter(loader = true) + return !isLoaderEnabled(element); + } + @Override protected void doProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) throws Exception { TypeElement converterAnnotationType = this.processingEnv.getElementUtils().getTypeElement("org.apache.camel.Converter"); Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(converterAnnotationType); + Map<String, Element> converterClasses = new TreeMap<>(); for (Element element : elements) { if (element instanceof TypeElement) { - TypeElement classElement = (TypeElement) element; + TypeElement te = (TypeElement) element; // we only support top-level classes (not inner classes) - if (classElement.getNestingKind() == NestingKind.TOP_LEVEL) { - final String javaTypeName = canonicalClassName(classElement.getQualifiedName().toString()); + if (!te.getNestingKind().isNested() && acceptClass(te)) { + final String javaTypeName = canonicalClassName(te.getQualifiedName().toString()); converterClasses.put(javaTypeName, element); } } } + // skip all converter classes from core as we just want to use the optimized TypeConverterLoader files if (!converterClasses.isEmpty() && !converterClasses.containsKey("org.apache.camel.converter.IOConverter") @@ -71,4 +80,15 @@ public class TypeConverterProcessor extends AbstractCamelAnnotationProcessor { } } + private static boolean isLoaderEnabled(Element element) { + for (AnnotationMirror ann : element.getAnnotationMirrors()) { + for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : ann.getElementValues().entrySet()) { + if ("loader".equals(entry.getKey().getSimpleName().toString())) { + return (Boolean) entry.getValue().getValue(); + } + } + } + return false; + } + } \ No newline at end of file