This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch rest-dsl-parser
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/rest-dsl-parser by this push:
     new 6a65a7c  CAMEL-12824: camel-route-parser - Add parser for rest-dsl
6a65a7c is described below

commit 6a65a7ce4beac9ada8aa58d75cf364ba6c8b26b6
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sun Sep 23 10:11:46 2018 +0200

    CAMEL-12824: camel-route-parser - Add parser for rest-dsl
---
 .../helper/CamelJavaRestDslParserHelper.java       | 82 +++++++++++++++++-----
 .../camel/parser/model/RestServiceDetails.java     |  9 +++
 .../apache/camel/parser/model/RestVerbDetails.java | 18 +++++
 .../camel/parser/java/MyRestDslRouteBuilder.java   |  6 +-
 .../camel/parser/java/RoasterJavaRestDslTest.java  |  7 ++
 5 files changed, 100 insertions(+), 22 deletions(-)

diff --git 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaRestDslParserHelper.java
 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaRestDslParserHelper.java
index e498248..4a0222a 100644
--- 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaRestDslParserHelper.java
+++ 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaRestDslParserHelper.java
@@ -138,7 +138,7 @@ public final class CamelJavaRestDslParserHelper {
                             node.setClassName(clazz.getQualifiedName());
                             node.setMethodName(configureMethod.getName());
 
-                            parseExpression(node, fullyQualifiedFileName, 
clazz, configureMethod, block, exp);
+                            parseExpression(node, null, 
fullyQualifiedFileName, clazz, configureMethod, block, exp);
 
                             // flip order of verbs as we parse bottom-up
                             if (node.getVerbs() != null) {
@@ -216,18 +216,28 @@ public final class CamelJavaRestDslParserHelper {
         }
     }
 
-    private void parseExpression(RestServiceDetails node, String 
fullyQualifiedFileName,
+    private void parseExpression(RestServiceDetails node, RestVerbDetails 
verb, String fullyQualifiedFileName,
                                  JavaClassSource clazz, 
MethodSource<JavaClassSource> configureMethod, Block block,
                                  Expression exp) {
         if (exp == null) {
+            // this rest service is not complete, if there is any details on 
verb then they are actually general
+            // for this rest service and we should pass the details to it
+            if (verb != null) {
+                node.setConsumes(verb.getConsumes());
+                node.setProduces(verb.getProduces());
+                
node.setSkipBindingOnErrorCode(verb.getSkipBindingOnErrorCode());
+                
node.setClientRequestValidation(verb.getClientRequestValidation());
+                node.setApiDocs(verb.getApiDocs());
+                node.setDescription(verb.getDescription());
+            }
             return;
         }
         if (exp instanceof MethodInvocation) {
             MethodInvocation mi = (MethodInvocation) exp;
-            doParseRestService(node, fullyQualifiedFileName, clazz, 
configureMethod, block, mi);
+            verb = doParseRestService(node, verb, fullyQualifiedFileName, 
clazz, configureMethod, block, mi);
             // if the method was called on another method, then recursive
             exp = mi.getExpression();
-            parseExpression(node, fullyQualifiedFileName, clazz, 
configureMethod, block, exp);
+            parseExpression(node, verb, fullyQualifiedFileName, clazz, 
configureMethod, block, exp);
         }
     }
 
@@ -314,9 +324,9 @@ public final class CamelJavaRestDslParserHelper {
         }
     }
 
-    private void doParseRestService(RestServiceDetails node, String 
fullyQualifiedFileName,
-                                    JavaClassSource clazz, 
MethodSource<JavaClassSource> configureMethod, Block block,
-                                    MethodInvocation mi) {
+    private RestVerbDetails doParseRestService(RestServiceDetails node, 
RestVerbDetails verb, String fullyQualifiedFileName,
+                                               JavaClassSource clazz, 
MethodSource<JavaClassSource> configureMethod, Block block,
+                                               MethodInvocation mi) {
 
         // end line number is the first node in the method chain we parse
         if (node.getLineNumberEnd() == null) {
@@ -330,42 +340,76 @@ public final class CamelJavaRestDslParserHelper {
         String name = mi.getName().getIdentifier();
         if ("rest".equals(name)) {
             node.setPath(extractValueFromFirstArgument(clazz, block, mi));
-        } else if ("delete".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
+        } else if (isParentMethod(mi, "rest")) {
+            verb = doParseRestVerb(node, verb, clazz, configureMethod, block, 
mi);
+        }
+        return verb;
+    }
+
+    private RestVerbDetails doParseRestVerb(RestServiceDetails node, 
RestVerbDetails verb,
+                                            JavaClassSource clazz, 
MethodSource<JavaClassSource> configureMethod, Block block,
+                                            MethodInvocation mi) {
+        if (verb == null) {
+            verb = new RestVerbDetails();
+        }
+
+        String name = mi.getName().getIdentifier();
+        if ("description".equals(name)) {
+            verb.setDescription(extractValueFromFirstArgument(clazz, block, 
mi));
+        } else  if ("bindingMode".equals(name)) {
+            verb.setBindingMode(extractValueFromFirstArgument(clazz, block, 
mi));
+        } else  if ("skipBindingOnErrorcode".equals(name)) {
+            
verb.setSkipBindingOnErrorCode(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("clientRequestValidation".equals(name)) {
+            
verb.setClientRequestValidation(extractValueFromFirstArgument(clazz, block, 
mi));
+        } else  if ("consumes".equals(name)) {
+            verb.setConsumes(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("produces".equals(name)) {
+            verb.setProduces(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("type".equals(name)) {
+            verb.setType(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("outType".equals(name)) {
+            verb.setOutType(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("apiDocs".equals(name)) {
+            verb.setApiDocs(extractValueFromFirstArgument(clazz, block, mi));
+        } else  if ("tag".equals(name)) {
+            // tag is only available on the node
+            node.setTag(extractValueFromFirstArgument(clazz, block, mi));
+        }
+
+        if ("delete".equals(name)) {
             node.addVerb(verb);
             verb.setMethod("delete");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
+            verb = null; // reset as this verb is not complete
         } else if ("get".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
             node.addVerb(verb);
             verb.setMethod("get");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
+            verb = null; // reset as this verb is not complete
         } else if ("head".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
             node.addVerb(verb);
             verb.setMethod("head");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
+            verb = null; // reset as this verb is not complete
         } else if ("patch".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
             node.addVerb(verb);
             verb.setMethod("patch");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
+            verb = null; // reset as this verb is not complete
         } else if ("post".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
             node.addVerb(verb);
             verb.setMethod("post");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
+            verb = null; // reset as this verb is not complete
         } else if ("put".equals(name)) {
-            RestVerbDetails verb = new RestVerbDetails();
             node.addVerb(verb);
             verb.setMethod("put");
             verb.setUri(extractValueFromFirstArgument(clazz, block, mi));
-        } else {
-            if (isParentMethod(mi, "rest")) {
-                // okay its within the rest block, so then find out if its 
within one of the verbs
-                // TODO: implement me
-            }
+            verb = null; // reset as this verb is not complete
         }
+
+        return verb;
     }
 
     private static boolean isParentMethod(MethodInvocation mi, String 
parentName) {
diff --git 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestServiceDetails.java
 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestServiceDetails.java
index 58d30bf..8e5d60d 100644
--- 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestServiceDetails.java
+++ 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestServiceDetails.java
@@ -41,6 +41,7 @@ public class RestServiceDetails {
     private String clientRequestValidation;
     private String enableCORS;
     private String apiDocs;
+    private String description;
     private List<RestVerbDetails> verbs;
 
     public String getFileName() {
@@ -163,6 +164,14 @@ public class RestServiceDetails {
         this.apiDocs = apiDocs;
     }
 
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
     public List<RestVerbDetails> getVerbs() {
         return verbs;
     }
diff --git 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestVerbDetails.java
 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestVerbDetails.java
index a3411f5..58c7a72 100644
--- 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestVerbDetails.java
+++ 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/RestVerbDetails.java
@@ -38,6 +38,8 @@ public class RestVerbDetails {
     private String clientRequestValidation;
     private String type;
     private String outType;
+    private String description;
+    private String apiDocs;
 
     public String getFileName() {
         return fileName;
@@ -158,4 +160,20 @@ public class RestVerbDetails {
     public void setOutType(String outType) {
         this.outType = outType;
     }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getApiDocs() {
+        return apiDocs;
+    }
+
+    public void setApiDocs(String apiDocs) {
+        this.apiDocs = apiDocs;
+    }
 }
diff --git 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyRestDslRouteBuilder.java
 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyRestDslRouteBuilder.java
index 7250232..a5b862c 100644
--- 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyRestDslRouteBuilder.java
+++ 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyRestDslRouteBuilder.java
@@ -40,11 +40,11 @@ public class MyRestDslRouteBuilder extends RouteBuilder {
             .corsHeaderProperty("key1", "value1")
             .corsHeaderProperty("key2", "value2");
 
-        rest("/foo")
-            .get("{id}")
+        rest("/foo").consumes("xml").produces("json").description("my foo 
service")
+            .get("{id}").apiDocs(false)
                 .description("get by id")
                 .to("log:id")
-            .post()
+            .post().bindingMode(RestBindingMode.xml)
                 .description("post something")
                 .to("log:post");
     }
diff --git 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaRestDslTest.java
 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaRestDslTest.java
index bf92949..2879f61 100644
--- 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaRestDslTest.java
+++ 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaRestDslTest.java
@@ -84,10 +84,17 @@ public class RoasterJavaRestDslTest extends 
CamelTestSupport {
         assertEquals("org.apache.camel.parser.java.MyRestDslRouteBuilder", 
details.getClassName());
 
         assertEquals("/foo", details.getPath());
+        assertEquals("my foo service", details.getDescription());
+        assertEquals("json", details.getProduces());
+        assertEquals("json", details.getProduces());
         assertEquals(2, details.getVerbs().size());
         assertEquals("get", details.getVerbs().get(0).getMethod());
         assertEquals("{id}", details.getVerbs().get(0).getUri());
+        assertEquals("get by id", details.getVerbs().get(0).getDescription());
+        assertEquals("false", details.getVerbs().get(0).getApiDocs());
         assertEquals("post", details.getVerbs().get(1).getMethod());
+        assertEquals("post something", 
details.getVerbs().get(1).getDescription());
+        assertEquals("xml", details.getVerbs().get(1).getBindingMode());
         assertNull(details.getVerbs().get(1).getUri());
     }
 

Reply via email to