Fixed the eip model a bit around choice eip and rest-dsl

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b6a3dfd7
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b6a3dfd7
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b6a3dfd7

Branch: refs/heads/camel-2.16.x
Commit: b6a3dfd7daefefa37e2166dde8fb8df724bedb05
Parents: f6eddd7
Author: Claus Ibsen <davscl...@apache.org>
Authored: Tue Oct 6 16:11:51 2015 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Oct 8 09:05:13 2015 +0200

----------------------------------------------------------------------
 .../camel/tools/apt/EipAnnotationProcessor.java | 71 +++++++++++++++++---
 1 file changed, 63 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/b6a3dfd7/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
----------------------------------------------------------------------
diff --git 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
index c02c7c5..8a7d01f 100644
--- 
a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
+++ 
b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
@@ -18,6 +18,7 @@ package org.apache.camel.tools.apt;
 
 import java.io.PrintWriter;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -75,6 +76,10 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
         "org.apache.camel.model.InterceptDefinition",
         "org.apache.camel.model.WhenDefinition",
     };
+    // special for verbs (these classes have sub classes, so we use this to 
find all classes)
+    private static final String[] ONE_OF_VERBS = new String[]{
+            "org.apache.camel.model.rest.VerbDefinition"
+    };
 
     private boolean skipUnwanted = true;
 
@@ -274,17 +279,21 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
                     // special for routes
                     processRoutes(roundEnv, originalClassType, elementRef, 
fieldElement, fieldName, eipOptions, prefix);
 
-                    // special for rests
-                    processRests(roundEnv, originalClassType, elementRef, 
fieldElement, fieldName, eipOptions, prefix);
-
                     // special for outputs
                     processOutputs(roundEnv, originalClassType, elementRef, 
fieldElement, fieldName, eipOptions, prefix);
 
+                    // special for when clauses (choice eip)
+                    processRefWhenClauses(roundEnv, originalClassType, 
elementRef, fieldElement, fieldName, eipOptions, prefix);
+
+                    // special for rests (rest-dsl)
+                    processRests(roundEnv, originalClassType, elementRef, 
fieldElement, fieldName, eipOptions, prefix);
+
+                    // special for verbs (rest-dsl)
+                    processVerbs(roundEnv, originalClassType, elementRef, 
fieldElement, fieldName, eipOptions, prefix);
+
                     // special for expression
                     processRefExpression(roundEnv, originalClassType, 
classElement, elementRef, fieldElement, fieldName, eipOptions, prefix);
 
-                    // special for when clauses
-                    processRefWhenClauses(roundEnv, originalClassType, 
elementRef, fieldElement, fieldName, eipOptions, prefix);
                 }
             }
 
@@ -446,6 +455,11 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
                     }
                 }
             }
+            // special for otherwise as we want to indicate that the element is
+            if ("otherwise".equals(name)) {
+                isOneOf = true;
+                oneOfTypes.add("otherwise");
+            }
 
             boolean deprecated = fieldElement.getAnnotation(Deprecated.class) 
!= null;
 
@@ -694,6 +708,43 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
     }
 
     /**
+     * Special for processing an @XmlElementRef verbs field (rest-dsl)
+     */
+    private void processVerbs(RoundEnvironment roundEnv, TypeElement 
originalClassType, XmlElementRef elementRef,
+                              VariableElement fieldElement, String fieldName, 
Set<EipOption> eipOptions, String prefix) {
+        if ("verbs".equals(fieldName) && supportOutputs(originalClassType)) {
+            String kind = "element";
+            String name = elementRef.name();
+            if (isNullOrEmpty(name) || "##default".equals(name)) {
+                name = fieldName;
+            }
+            name = prefix + name;
+            TypeMirror fieldType = fieldElement.asType();
+            String fieldTypeName = fieldType.toString();
+
+            // gather oneOf which extends any of the output base classes
+            Set<String> oneOfTypes = new TreeSet<String>();
+            // find all classes that has that superClassName
+            Set<TypeElement> children = new LinkedHashSet<TypeElement>();
+            for (String superclass : ONE_OF_VERBS) {
+                findTypeElementChildren(roundEnv, children, superclass);
+            }
+            for (TypeElement child : children) {
+                XmlRootElement rootElement = 
child.getAnnotation(XmlRootElement.class);
+                if (rootElement != null) {
+                    String childName = rootElement.name();
+                    if (childName != null) {
+                        oneOfTypes.add(childName);
+                    }
+                }
+            }
+
+            EipOption ep = new EipOption(name, kind, fieldTypeName, true, "", 
"", false, false, null, true, oneOfTypes);
+            eipOptions.add(ep);
+        }
+    }
+
+    /**
      * Special for processing an @XmlElementRef expression field
      */
     private void processRefExpression(RoundEnvironment roundEnv, TypeElement 
originalClassType, TypeElement classElement,
@@ -759,7 +810,11 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
             String docComment = findJavaDoc(elementUtils, fieldElement, 
fieldName, name, originalClassType, true);
             boolean deprecated = fieldElement.getAnnotation(Deprecated.class) 
!= null;
 
-            EipOption ep = new EipOption(name, kind, fieldTypeName, false, "", 
docComment, deprecated, false, null, false, null);
+            // indicate that this element is one of when
+            Set<String> oneOfTypes = new HashSet<String>();
+            oneOfTypes.add("when");
+
+            EipOption ep = new EipOption(name, kind, fieldTypeName, false, "", 
docComment, deprecated, false, null, true, oneOfTypes);
             eipOptions.add(ep);
         }
     }
@@ -835,8 +890,8 @@ public class EipAnnotationProcessor extends 
AbstractAnnotationProcessor {
     }
 
     private boolean hasOutput(EipModel model, Set<EipOption> options) {
-        // if we are from/rest then we accept output
-        if ("from".equals(model.getName()) || "rest".equals(model.getName())) {
+        // if we are route/rest then we accept output
+        if ("route".equals(model.getName()) || "rest".equals(model.getName())) 
{
             return true;
         }
 

Reply via email to