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

Reply via email to