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()); }