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