This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch tc-loader
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/tc-loader by this push:
     new 2af2111  CAMEL-13313: Add support for generating type converter loader 
source code to be able to load component type converters in a faster way
2af2111 is described below

commit 2af21110e9027f30ea6be0886c388e3af6eee188
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Mar 14 13:58:06 2019 +0100

    CAMEL-13313: Add support for generating type converter loader source code 
to be able to load component type converters in a faster way
---
 .../apache/camel/component/bean/BeanConverter.java | 11 +++-
 ...cessor.java => CoreTypeConverterProcessor.java} | 17 +++--
 .../tools/apt/TypeConverterLoaderProcessor.java    | 73 +++++++++++++++-------
 .../services/javax.annotation.processing.Processor |  2 +-
 4 files changed, 73 insertions(+), 30 deletions(-)

diff --git 
a/core/camel-core/src/main/java/org/apache/camel/component/bean/BeanConverter.java
 
b/core/camel-core/src/main/java/org/apache/camel/component/bean/BeanConverter.java
index fc85841..ed96fe9 100644
--- 
a/core/camel-core/src/main/java/org/apache/camel/component/bean/BeanConverter.java
+++ 
b/core/camel-core/src/main/java/org/apache/camel/component/bean/BeanConverter.java
@@ -27,13 +27,22 @@ import static org.apache.camel.TypeConverter.MISS_VALUE;
 /**
  * A set of converter methods for working with beans
  */
-@Converter
+@Converter(loader = true)
 public final class BeanConverter {
 
     private BeanConverter() {
         // Helper Class
     }
 
+    @Converter
+    public static int toDummy(String s) {
+        return 1;
+    }
+
+    public String hello(String w) {
+        return null;
+    }
+
     @FallbackConverter
     public static Object convertTo(Class<?> type, Exchange exchange, Object 
value, TypeConverterRegistry registry) {
         // use a fallback type converter so we can convert the embedded body 
if the value is BeanInvocation
diff --git 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreConverterProcessor.java
 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreTypeConverterProcessor.java
similarity index 94%
rename from 
tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreConverterProcessor.java
rename to 
tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreTypeConverterProcessor.java
index dfa0c29..6e8ebb4 100644
--- 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreConverterProcessor.java
+++ 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreTypeConverterProcessor.java
@@ -38,11 +38,16 @@ import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
 import javax.tools.JavaFileObject;
 
-@SupportedAnnotationTypes({"org.apache.camel.Converter"})
-public class CoreConverterProcessor extends AbstractCamelAnnotationProcessor {
+@SupportedAnnotationTypes({"org.apache.camel.Converter", 
"org.apache.camel.FallbackConverter"})
+public class CoreTypeConverterProcessor extends 
AbstractCamelAnnotationProcessor {
 
     @Override
     protected void doProcess(Set<? extends TypeElement> annotations, 
RoundEnvironment roundEnv) throws Exception {
+
+        // TODO: fallback does not work
+        // TODO: generate so you dont need to pass in CamelContext but 
register into a java set/thingy
+        // so you can init this via static initializer block { ... } and then 
register on CamelContext later
+
         if 
(this.processingEnv.getElementUtils().getTypeElement("org.apache.camel.impl.converter.CoreStaticTypeConverterLoader")
 != null) {
             return;
         }
@@ -105,10 +110,10 @@ public class CoreConverterProcessor extends 
AbstractCamelAnnotationProcessor {
             writer.append("\n");
             writer.append("    public static final 
CoreStaticTypeConverterLoader INSTANCE = new 
CoreStaticTypeConverterLoader();\n");
             writer.append("\n");
-            writer.append("    static abstract class SimpleTypeConverter 
extends TypeConverterSupport {\n");
+            writer.append("    static abstract class BaseTypeConverter extends 
TypeConverterSupport {\n");
             writer.append("        private final boolean allowNull;\n");
             writer.append("\n");
-            writer.append("        public SimpleTypeConverter(boolean 
allowNull) {\n");
+            writer.append("        public BaseTypeConverter(boolean allowNull) 
{\n");
             writer.append("            this.allowNull = allowNull;\n");
             writer.append("        }\n");
             writer.append("\n");
@@ -130,7 +135,7 @@ public class CoreConverterProcessor extends 
AbstractCamelAnnotationProcessor {
             writer.append("        protected abstract Object 
doConvert(Exchange exchange, Object value) throws Exception;\n");
             writer.append("    };\n");
             writer.append("\n");
-            writer.append("    private DoubleMap<Class<?>, Class<?>, 
SimpleTypeConverter> converters = new DoubleMap<>(256);\n");
+            writer.append("    private final DoubleMap<Class<?>, Class<?>, 
BaseTypeConverter> converters = new DoubleMap<>(256);\n");
             writer.append("\n");
             writer.append("    private ").append(c).append("() {\n");
 
@@ -151,7 +156,7 @@ public class CoreConverterProcessor extends 
AbstractCamelAnnotationProcessor {
                         }
                     }
                     writer.append("        
converters.put(").append(to.getKey()).append(".class").append(", 
").append(toString(from.getKey()))
-                        .append(".class, new 
SimpleTypeConverter(").append(Boolean.toString(allowNull)).append(") {\n");
+                        .append(".class, new 
BaseTypeConverter(").append(Boolean.toString(allowNull)).append(") {\n");
                     writer.append("            @Override\n");
                     writer.append("            public Object 
doConvert(Exchange exchange, Object value) throws Exception {\n");
                     writer.append("                return 
").append(toJava(from.getValue(), converterClasses)).append(";\n");
diff --git 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
index 1e2fbc3..54d1244 100644
--- 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
+++ 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
@@ -43,9 +43,15 @@ import javax.tools.JavaFileManager;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardLocation;
 
-@SupportedAnnotationTypes({"org.apache.camel.Converter"})
+import static 
org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
+
+@SupportedAnnotationTypes({"org.apache.camel.Converter", 
"org.apache.camel.FallbackConverter"})
 public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcessor {
 
+    // TODO: fallback does not work
+    // TODO: generate so you dont need to pass in CamelContext but register 
into a java set/thingy
+    // so you can init this via static initializer block { ... } and then 
register on CamelContext later
+
     private static final class ClassConverters {
 
         private final Comparator<TypeMirror> comparator;
@@ -118,21 +124,24 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
                     ignoreOnLoadError = isIgnoreOnLoadError(element);
                 }
             } else if (currentClass != null && element.getKind() == 
ElementKind.METHOD) {
+                // is the method annotated with @Converter
                 ExecutableElement ee = (ExecutableElement) element;
-                TypeMirror to = ee.getReturnType();
-                TypeMirror from = ee.getParameters().get(0).asType();
-                String fromStr = toString(from);
-                if (!fromStr.endsWith("[]")) {
-                    TypeElement e = 
this.processingEnv.getElementUtils().getTypeElement(fromStr);
-                    if (e != null) {
-                        from = e.asType();
-                    } else {
-                        
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Could not 
retrieve type element for " + fromStr);
+                if (isConverterMethod(ee)) {
+                    TypeMirror to = ee.getReturnType();
+                    TypeMirror from = ee.getParameters().get(0).asType();
+                    String fromStr = toString(from);
+                    if (!fromStr.endsWith("[]")) {
+                        TypeElement e = 
this.processingEnv.getElementUtils().getTypeElement(fromStr);
+                        if (e != null) {
+                            from = e.asType();
+                        } else {
+                            
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Could not 
retrieve type element for " + fromStr);
+                        }
+                    }
+                    converters.computeIfAbsent(currentClass, c -> new 
ClassConverters(comparator)).addTypeConverter(to, from, ee);
+                    if (converters.containsKey(currentClass)) {
+                        
converters.get(currentClass).setIgnoreOnLoadError(ignoreOnLoadError);
                     }
-                }
-                converters.computeIfAbsent(currentClass, c -> new 
ClassConverters(comparator)).addTypeConverter(to, from, ee);
-                if (converters.containsKey(currentClass)) {
-                    
converters.get(currentClass).setIgnoreOnLoadError(ignoreOnLoadError);
                 }
             }
         }
@@ -140,7 +149,7 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
         TypeElement fallbackAnnotationType = 
this.processingEnv.getElementUtils().getTypeElement("org.apache.camel.FallbackConverter");
         currentClass = null;
         ignoreOnLoadError = false;
-        for (Element element : 
roundEnv.getElementsAnnotatedWith(fallbackAnnotationType)) {
+        for (Element element : 
roundEnv.getElementsAnnotatedWith(converterAnnotationType)) {
             if (element.getKind() == ElementKind.CLASS) {
                 TypeElement te = (TypeElement) element;
                 if (!te.getNestingKind().isNested() && isLoaderEnabled(te)) {
@@ -150,9 +159,11 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
                 }
             } else if (currentClass != null && element.getKind() == 
ElementKind.METHOD) {
                 ExecutableElement ee = (ExecutableElement) element;
-                converters.computeIfAbsent(currentClass, c -> new 
ClassConverters(comparator)).addFallbackTypeConverter(ee);
-                if (converters.containsKey(currentClass)) {
-                    
converters.get(currentClass).setIgnoreOnLoadError(ignoreOnLoadError);
+                if (isFallbackConverterMethod(ee)) {
+                    converters.computeIfAbsent(currentClass, c -> new 
ClassConverters(comparator)).addFallbackTypeConverter(ee);
+                    if (converters.containsKey(currentClass)) {
+                        
converters.get(currentClass).setIgnoreOnLoadError(ignoreOnLoadError);
+                    }
                 }
             }
         }
@@ -161,9 +172,7 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
         for (Map.Entry<String, ClassConverters> entry : converters.entrySet()) 
{
             String key = entry.getKey();
             ClassConverters value = entry.getValue();
-            if (!value.isEmpty()) {
-                writeConverterLoader(key, value, converterAnnotationType, 
fallbackAnnotationType);
-            }
+            writeConverterLoader(key, value, converterAnnotationType, 
fallbackAnnotationType);
         }
         writeConverterLoaderMetaInfo(converters);
     }
@@ -190,6 +199,26 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
         return false;
     }
 
+    private static boolean isConverterMethod(ExecutableElement element) {
+        for (AnnotationMirror ann : element.getAnnotationMirrors()) {
+            String name = 
ann.getAnnotationType().asElement().getSimpleName().toString();
+            if ("Converter".equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean isFallbackConverterMethod(ExecutableElement 
element) {
+        for (AnnotationMirror ann : element.getAnnotationMirrors()) {
+            String name = 
ann.getAnnotationType().asElement().getSimpleName().toString();
+            if ("FallbackConverter".equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void writeConverterLoaderMetaInfo(Map<String, ClassConverters> 
converters) throws Exception {
         StringJoiner sj = new StringJoiner(",");
         for (Map.Entry<String, ClassConverters> entry : converters.entrySet()) 
{
@@ -263,7 +292,7 @@ public class TypeConverterLoaderProcessor extends 
AbstractCamelAnnotationProcess
             writer.append("        protected abstract Object 
doConvert(Exchange exchange, Object value) throws Exception;\n");
             writer.append("    };\n");
             writer.append("\n");
-            writer.append("    private DoubleMap<Class<?>, Class<?>, 
BaseTypeConverter> converters = new DoubleMap<>(" + converters.size() + ");\n");
+            writer.append("    private final DoubleMap<Class<?>, Class<?>, 
BaseTypeConverter> converters = new DoubleMap<>(" + converters.size() + ");\n");
             writer.append("\n");
             writer.append("    private ").append(c).append("() {\n");
 
diff --git 
a/tooling/apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
 
b/tooling/apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
index 065f185..ce52a1c 100644
--- 
a/tooling/apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ 
b/tooling/apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -19,7 +19,7 @@
 org.apache.camel.tools.apt.ModelAnnotationProcessor
 org.apache.camel.tools.apt.EndpointAnnotationProcessor
 org.apache.camel.tools.apt.SpiProcessor
+org.apache.camel.tools.apt.CoreTypeConverterProcessor
 org.apache.camel.tools.apt.TypeConverterProcessor
-org.apache.camel.tools.apt.CoreConverterProcessor
 org.apache.camel.tools.apt.TypeConverterLoaderProcessor
 

Reply via email to