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 379d1ec2378199a638ca18e3c2fba06b8234ba82 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Mar 14 07:25:30 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. --- .../tools/apt/TypeConverterLoaderProcessor.java | 40 +++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) 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 321d904..1e2fbc3 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 @@ -52,11 +52,20 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess private final Map<String, Map<TypeMirror, ExecutableElement>> converters = new TreeMap<>(); private final List<ExecutableElement> fallbackConverters = new ArrayList<>(); private int size; + private boolean ignoreOnLoadError; ClassConverters(Comparator<TypeMirror> comparator) { this.comparator = comparator; } + boolean isIgnoreOnLoadError() { + return ignoreOnLoadError; + } + + void setIgnoreOnLoadError(boolean ignoreOnLoadError) { + this.ignoreOnLoadError = ignoreOnLoadError; + } + void addTypeConverter(TypeMirror to, TypeMirror from, ExecutableElement ee) { converters.computeIfAbsent(toString(to), c -> new TreeMap<>(comparator)).put(from, ee); size++; @@ -98,6 +107,7 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess TypeElement converterAnnotationType = this.processingEnv.getElementUtils().getTypeElement("org.apache.camel.Converter"); // the current class with type converters String currentClass = null; + boolean ignoreOnLoadError = false; for (Element element : roundEnv.getElementsAnnotatedWith(converterAnnotationType)) { // we need a top level class first if (element.getKind() == ElementKind.CLASS) { @@ -105,6 +115,7 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess if (!te.getNestingKind().isNested() && isLoaderEnabled(te)) { // we only accept top-level classes and if loader is enabled currentClass = te.getQualifiedName().toString(); + ignoreOnLoadError = isIgnoreOnLoadError(element); } } else if (currentClass != null && element.getKind() == ElementKind.METHOD) { ExecutableElement ee = (ExecutableElement) element; @@ -120,21 +131,29 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess } } converters.computeIfAbsent(currentClass, c -> new ClassConverters(comparator)).addTypeConverter(to, from, ee); + if (converters.containsKey(currentClass)) { + converters.get(currentClass).setIgnoreOnLoadError(ignoreOnLoadError); + } } } TypeElement fallbackAnnotationType = this.processingEnv.getElementUtils().getTypeElement("org.apache.camel.FallbackConverter"); currentClass = null; + ignoreOnLoadError = false; for (Element element : roundEnv.getElementsAnnotatedWith(fallbackAnnotationType)) { if (element.getKind() == ElementKind.CLASS) { TypeElement te = (TypeElement) element; if (!te.getNestingKind().isNested() && isLoaderEnabled(te)) { // we only accept top-level classes and if loader is enabled currentClass = te.getQualifiedName().toString(); + ignoreOnLoadError = isIgnoreOnLoadError(element); } } 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); + } } } @@ -160,6 +179,17 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess return false; } + private static boolean isIgnoreOnLoadError(Element element) { + for (AnnotationMirror ann : element.getAnnotationMirrors()) { + for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : ann.getElementValues().entrySet()) { + if ("ignoreOnLoadError".equals(entry.getKey().getSimpleName().toString())) { + return (Boolean) entry.getValue().getValue(); + } + } + } + return false; + } + private void writeConverterLoaderMetaInfo(Map<String, ClassConverters> converters) throws Exception { StringJoiner sj = new StringJoiner(","); for (Map.Entry<String, ClassConverters> entry : converters.entrySet()) { @@ -266,7 +296,15 @@ public class TypeConverterLoaderProcessor extends AbstractCamelAnnotationProcess writer.append("\n"); writer.append(" @Override\n"); writer.append(" public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {\n"); - writer.append(" converters.forEach((k, v, c) -> registry.addTypeConverter(k, v, c));\n"); + if (converters.isIgnoreOnLoadError()) { + writer.append(" try {\n"); + writer.append(" converters.forEach((k, v, c) -> registry.addTypeConverter(k, v, c));\n"); + writer.append(" } catch (Throwable e) {\n"); + writer.append(" // ignore on load error\n"); + writer.append(" }\n"); + } else { + writer.append(" converters.forEach((k, v, c) -> registry.addTypeConverter(k, v, c));\n"); + } for (ExecutableElement ee : converters.getFallbackConverters()) { boolean allowNull = false; boolean canPromote = false;