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";
         }
 

Reply via email to