CAMEL-7999: apt plugin compiler should included options from parent component, if extending.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/25cfae1f Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/25cfae1f Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/25cfae1f Branch: refs/heads/master Commit: 25cfae1f397f5fa63dd75a3c98116940941a81ab Parents: c77199a Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Nov 12 12:07:07 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Nov 12 12:07:26 2014 +0100 ---------------------------------------------------------------------- .../tools/apt/EndpointAnnotationProcessor.java | 39 ++++++++++++++++++-- .../camel/tools/apt/JsonSchemaHelper.java | 5 ++- 2 files changed, 39 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/25cfae1f/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java index b14722c..222e913 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java @@ -38,6 +38,7 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.MirroredTypeException; @@ -157,7 +158,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { // get endpoint information which is divided into paths and options (though there should really only be one path) Set<EndpointPath> endpointPaths = new LinkedHashSet<>(); Set<EndpointOption> endpointOptions = new LinkedHashSet<>(); - findClassProperties(roundEnv, endpointPaths, endpointOptions, classElement, ""); + findClassProperties(writer, roundEnv, endpointPaths, endpointOptions, classElement, ""); String json = createParameterJsonSchema(componentModel, endpointPaths, endpointOptions); writer.println(json); @@ -225,7 +226,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { Set<EndpointPath> endpointPaths = new LinkedHashSet<>(); Set<EndpointOption> endpointOptions = new LinkedHashSet<>(); - findClassProperties(roundEnv, endpointPaths, endpointOptions, classElement, prefix); + findClassProperties(writer, roundEnv, endpointPaths, endpointOptions, classElement, prefix); if (!endpointOptions.isEmpty() || !endpointPaths.isEmpty()) { writer.println("<table class='table'>"); writer.println(" <tr>"); @@ -314,7 +315,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { return model; } - protected void findClassProperties(RoundEnvironment roundEnv, Set<EndpointPath> endpointPaths, Set<EndpointOption> endpointOptions, TypeElement classElement, String prefix) { + protected void findClassProperties(PrintWriter writer, RoundEnvironment roundEnv, Set<EndpointPath> endpointPaths, Set<EndpointOption> endpointOptions, TypeElement classElement, String prefix) { Elements elementUtils = processingEnv.getElementUtils(); while (true) { List<VariableElement> fieldElements = ElementFilter.fieldsIn(classElement.getEnclosedElements()); @@ -384,7 +385,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { if (!isNullOrEmpty(extraPrefix)) { nestedPrefix += extraPrefix; } - findClassProperties(roundEnv, endpointPaths, endpointOptions, fieldTypeElement, nestedPrefix); + findClassProperties(writer, roundEnv, endpointPaths, endpointOptions, fieldTypeElement, nestedPrefix); } else { String docComment = elementUtils.getDocComment(fieldElement); if (isNullOrEmpty(docComment)) { @@ -435,7 +436,21 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { TypeMirror superclass = classElement.getSuperclass(); if (superclass != null) { String superClassName = canonicalClassName(superclass.toString()); + // check the rounding env first baseTypeElement = findTypeElement(roundEnv, superClassName); + if (baseTypeElement == null) { + // okay not found in rounding env, that means this component extends another component from another JAR + // so we need to find it using the package name instead of in the rounding environment + int idx = superClassName.lastIndexOf('.'); + String name = superClassName.substring(0, idx); + // skip java.lang package + if (!"java.lang".equals(name)) { + PackageElement pe = elementUtils.getPackageElement(name); + if (pe != null) { + baseTypeElement = findTypeElement(pe, superClassName); + } + } + } } if (baseTypeElement != null) { classElement = baseTypeElement; @@ -461,6 +476,22 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { return null; } + protected TypeElement findTypeElement(PackageElement element, String className) { + if (!isNullOrEmpty(className) && !"java.lang.Object".equals(className)) { + List<? extends Element> rootElements = element.getEnclosedElements(); + for (Element rootElement : rootElements) { + if (rootElement instanceof TypeElement) { + TypeElement typeElement = (TypeElement) rootElement; + String aRootName = canonicalClassName(typeElement.getQualifiedName().toString()); + if (className.equals(aRootName)) { + return typeElement; + } + } + } + } + return null; + } + /** * Helper method to produce class output text file using the given handler */ http://git-wip-us.apache.org/repos/asf/camel/blob/25cfae1f/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java index 108c58a..96d029e 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java @@ -79,7 +79,10 @@ final class JsonSchemaHelper { public static String getType(String type, boolean enumType) { if (enumType) { return "enum"; - } if (type.equals(URI.class.getName()) || type.equals(URL.class.getName())) { + } else if (type == null) { + // return generic type for unknown type + return "object"; + } else if (type.equals(URI.class.getName()) || type.equals(URL.class.getName())) { return "sting"; }