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 <claus.ib...@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