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