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 2019/03/14 06:53:24 UTC

[camel] 02/06: CAMEL-13313: Add support for generating type converter loader source code to be able to load component type converters in a faster way.

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

commit 6ad60d2cdece7e15e2559e181caa32122f1e77da
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Mar 14 06:02:57 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.
---
 .../camel/component/dns/types/DnsConverter.java    |  2 +-
 .../component/dns/types/DnsRecordConverter.java    |  2 +-
 ...ssor.java => TypeConverterLoaderProcessor.java} | 54 +++++++++++++++++++---
 .../services/javax.annotation.processing.Processor |  2 +-
 4 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsConverter.java b/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsConverter.java
index 683ae80..6f848c2 100644
--- a/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsConverter.java
+++ b/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsConverter.java
@@ -29,7 +29,7 @@ import org.xbill.DNS.Record;
 /**
  * A converter for all the DNS objects used by the DNS component.
  */
-@Converter
+@Converter(loader = true)
 public final class DnsConverter {
 
     private DnsConverter() {
diff --git a/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsRecordConverter.java b/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsRecordConverter.java
index afc0d7c..75ad410 100644
--- a/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsRecordConverter.java
+++ b/components/camel-dns/src/main/java/org/apache/camel/component/dns/types/DnsRecordConverter.java
@@ -32,7 +32,7 @@ import org.xbill.DNS.Type;
 /**
  * More converters for all the DNS objects used by the DNS component.
  */
-@Converter
+@Converter(loader = true)
 public final class DnsRecordConverter {
 
     private DnsRecordConverter() {
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentConverterProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
similarity index 89%
rename from tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentConverterProcessor.java
rename to tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
index 19c9790..321d904 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentConverterProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterLoaderProcessor.java
@@ -23,7 +23,9 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringJoiner;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 import javax.annotation.processing.RoundEnvironment;
 import javax.annotation.processing.SupportedAnnotationTypes;
 import javax.lang.model.element.AnnotationMirror;
@@ -35,16 +37,21 @@ import javax.lang.model.element.Modifier;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
+import javax.tools.DocumentationTool;
+import javax.tools.FileObject;
+import javax.tools.JavaFileManager;
 import javax.tools.JavaFileObject;
+import javax.tools.StandardLocation;
 
 @SupportedAnnotationTypes({"org.apache.camel.Converter"})
-public class ComponentConverterProcessor extends AbstractCamelAnnotationProcessor {
+public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcessor {
 
     private static final class ClassConverters {
 
-        private final Map<String, Map<TypeMirror, ExecutableElement>> converters = new TreeMap<>();
         private final Comparator<TypeMirror> comparator;
+        private final Map<String, Map<TypeMirror, ExecutableElement>> converters = new TreeMap<>();
         private final List<ExecutableElement> fallbackConverters = new ArrayList<>();
+        private int size;
 
         ClassConverters(Comparator<TypeMirror> comparator) {
             this.comparator = comparator;
@@ -52,10 +59,12 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
 
         void addTypeConverter(TypeMirror to, TypeMirror from, ExecutableElement ee) {
             converters.computeIfAbsent(toString(to), c -> new TreeMap<>(comparator)).put(from, ee);
+            size++;
         }
 
         void addFallbackTypeConverter(ExecutableElement ee) {
             fallbackConverters.add(ee);
+            size++;
         }
 
         Map<String, Map<TypeMirror, ExecutableElement>> getConverters() {
@@ -70,6 +79,13 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
             return type.toString().replaceAll("<.*>", "");
         }
 
+        long size() {
+            return size;
+        }
+
+        boolean isEmpty() {
+            return size == 0;
+        }
     }
 
     @Override
@@ -126,8 +142,11 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
         for (Map.Entry<String, ClassConverters> entry : converters.entrySet()) {
             String key = entry.getKey();
             ClassConverters value = entry.getValue();
-            writeConverterLoader(key, value, converterAnnotationType, fallbackAnnotationType);
+            if (!value.isEmpty()) {
+                writeConverterLoader(key, value, converterAnnotationType, fallbackAnnotationType);
+            }
         }
+        writeConverterLoaderMetaInfo(converters);
     }
 
     private static boolean isLoaderEnabled(Element element) {
@@ -141,6 +160,27 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
         return false;
     }
 
+    private void writeConverterLoaderMetaInfo(Map<String, ClassConverters> converters) throws Exception {
+        StringJoiner sj = new StringJoiner(",");
+        for (Map.Entry<String, ClassConverters> entry : converters.entrySet()) {
+            String key = entry.getKey();
+            ClassConverters value = entry.getValue();
+            if (!value.isEmpty()) {
+                sj.add(key);
+            }
+        }
+
+        if (sj.length() > 0) {
+            FileObject fo = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/services/org/apache/camel/TypeConverterLoader");
+            try (Writer writer = fo.openWriter()) {
+                writer.append("# Generated by camel annotation processor\n");
+                for (String fqn : sj.toString().split(",")) {
+                    writer.append("class=").append(fqn).append("Loader\n");
+                }
+            }
+        }
+    }
+
     private void writeConverterLoader(String fqn, ClassConverters converters,
                                       TypeElement converterAnnotationType,
                                       TypeElement fallbackAnnotationType) throws Exception {
@@ -168,10 +208,10 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
             writer.append("\n");
             writer.append("    public static final ").append(c).append(" INSTANCE = new ").append(c).append("();\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");
@@ -193,7 +233,7 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
             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 DoubleMap<Class<?>, Class<?>, BaseTypeConverter> converters = new DoubleMap<>(" + converters.size() + ");\n");
             writer.append("\n");
             writer.append("    private ").append(c).append("() {\n");
 
@@ -214,7 +254,7 @@ public class ComponentConverterProcessor extends AbstractCamelAnnotationProcesso
                         }
                     }
                     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/resources/META-INF/services/javax.annotation.processing.Processor b/tooling/apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
index 790ceb0..065f185 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
@@ -21,5 +21,5 @@ org.apache.camel.tools.apt.EndpointAnnotationProcessor
 org.apache.camel.tools.apt.SpiProcessor
 org.apache.camel.tools.apt.TypeConverterProcessor
 org.apache.camel.tools.apt.CoreConverterProcessor
-org.apache.camel.tools.apt.ComponentConverterProcessor
+org.apache.camel.tools.apt.TypeConverterLoaderProcessor