CAMEL-7800: camel-swagger-java - work in progress
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c76cbd14 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c76cbd14 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c76cbd14 Branch: refs/heads/master Commit: c76cbd1465e2c73f80e67dbd84993b35655de2fb Parents: 2a021a1 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Sep 18 13:46:59 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Sep 18 16:16:13 2015 +0200 ---------------------------------------------------------------------- .../RestOperationResponseMsgDefinition.java | 35 ++++++----- .../camel/component/rest/FromRestGetTest.java | 4 +- components/camel-swagger-java/pom.xml | 61 ++++++++++++++------ .../apache/camel/swagger/RestSwaggerReader.java | 11 +++- examples/camel-example-swagger-java/pom.xml | 4 -- .../src/main/resources/camel-config-xml.xml | 16 +++-- .../src/main/webapp/home.html | 14 ++--- 7 files changed, 91 insertions(+), 54 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java index ddd08bb..7705e96 100644 --- a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java @@ -28,8 +28,6 @@ import org.apache.camel.spi.Metadata; * To specify the rest operation response messages using Swagger. * <p/> * This maps to the Swagger Response Message Object. - * see com.wordnik.swagger.model.ResponseMessage - * and https://github.com/swagger-api/swagger-spec/blob/master/versions/1.2.md#525-response-message-object. */ @Metadata(label = "rest") @XmlRootElement(name = "responseMessage") @@ -39,8 +37,9 @@ public class RestOperationResponseMsgDefinition { @XmlTransient private VerbDefinition verb; - @XmlAttribute(required = true) - private int code; + @XmlAttribute + @Metadata(defaultValue = "200") + private String code; @XmlAttribute(required = true) private String message; @@ -56,14 +55,11 @@ public class RestOperationResponseMsgDefinition { public RestOperationResponseMsgDefinition() { } - public int getCode() { - return code != 0 ? code : 200; + public String getCode() { + return code != null ? code : "200"; } - /** - * Sets the Swagger Operation's ResponseMessage code - */ - public void setCode(int code) { + public void setCode(String code) { this.code = code; } @@ -71,9 +67,6 @@ public class RestOperationResponseMsgDefinition { return responseModel != null ? responseModel : ""; } - /** - * Sets the Swagger Operation's ResponseMessage responseModel - */ public void setResponseModel(String responseModel) { this.responseModel = responseModel; } @@ -82,23 +75,29 @@ public class RestOperationResponseMsgDefinition { return message != null ? message : "success"; } - /** - * Sets the Swagger Operation's ResponseMessage message - */ public void setMessage(String message) { this.message = message; } /** - * The return code + * The response code such as a HTTP status code. */ public RestOperationResponseMsgDefinition code(int code) { + setCode("" + code); + return this; + } + + /** + * The response code such as a HTTP status code. Can use <tt>general</tt>, or other words + * to indicate general error responses that do not map to a specific HTTP status code. + */ + public RestOperationResponseMsgDefinition code(String code) { setCode(code); return this; } /** - * The return message + * The response message (description) */ public RestOperationResponseMsgDefinition message(String msg) { setMessage(msg); http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java index b82d9a0..3297ce0 100644 --- a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java +++ b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java @@ -79,7 +79,8 @@ public class FromRestGetTest extends ContextTestSupport { assertEquals("acc1", rest.getVerbs().get(0).getParams().get(0).getAccess()); assertEquals("acc2", rest.getVerbs().get(0).getParams().get(1).getAccess()); - assertEquals(300, rest.getVerbs().get(0).getResponseMsgs().get(0).getCode()); + assertEquals("300", rest.getVerbs().get(0).getResponseMsgs().get(0).getCode()); + assertEquals("error", rest.getVerbs().get(0).getResponseMsgs().get(1).getCode()); assertEquals("test msg", rest.getVerbs().get(0).getResponseMsgs().get(0).getMessage()); assertEquals(Integer.class.getCanonicalName(), rest.getVerbs().get(0).getResponseMsgs().get(0).getResponseModel()); @@ -115,6 +116,7 @@ public class FromRestGetTest extends ContextTestSupport { .defaultValue("b").allowMultiple(true).name("header_letter").required(false).access("acc2") .endParam() .responseMessage().code(300).message("test msg").responseModel(Integer.class).endResponseMessage() + .responseMessage().code("error").message("does not work").endResponseMessage() .to("direct:bye") .post().to("mock:update"); http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/components/camel-swagger-java/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/pom.xml b/components/camel-swagger-java/pom.xml index 5e0177a..742a9e5 100644 --- a/components/camel-swagger-java/pom.xml +++ b/components/camel-swagger-java/pom.xml @@ -40,24 +40,66 @@ <artifactId>camel-core</artifactId> </dependency> + <!-- align to use versions from Camel BOM --> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-joda</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-yaml</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-xml</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-json-provider</artifactId> + <version>${jackson2-version}</version> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>${google-guava-version}</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>${commons-lang3-version}</version> + </dependency> + + <!-- swagger --> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-core</artifactId> <version>${swagger-java-version}</version> </dependency> - <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>${swagger-java-version}</version> </dependency> - <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-jaxrs</artifactId> <version>${swagger-java-version}</version> </dependency> + <!-- servlet api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> @@ -72,21 +114,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-jetty8</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-http-common</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-jetty-common</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java index a83c03d..8f12dfe 100644 --- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java @@ -158,6 +158,7 @@ public class RestSwaggerReader { parameter.setDescription(param.getDescription()); parameter.setRequired(param.getRequired()); + // set type on parameter if (parameter instanceof SerializableParameter) { SerializableParameter sp = (SerializableParameter) parameter; @@ -166,6 +167,7 @@ public class RestSwaggerReader { } } + // set schema on body parameter if (parameter instanceof BodyParameter) { BodyParameter bp = (BodyParameter) parameter; @@ -181,6 +183,7 @@ public class RestSwaggerReader { } } + // if we have an out type then set that as response message if (verb.getOutType() != null) { Response response = new Response(); Property prop = modelTypeAsProperty(verb.getOutType(), swagger); @@ -189,13 +192,17 @@ public class RestSwaggerReader { op.addResponse("200", response); } + // enrich with configured response messages from the rest-dsl for (RestOperationResponseMsgDefinition msg : verb.getResponseMsgs()) { - Response response = op.getResponses().get("" + msg.getCode()); + Response response = null; + if (op.getResponses() != null) { + response = op.getResponses().get(msg.getCode()); + } if (response == null) { response = new Response(); } response.setDescription(msg.getMessage()); - op.addResponse("" + msg.getCode(), response); + op.addResponse(msg.getCode(), response); } // add path http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/examples/camel-example-swagger-java/pom.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-swagger-java/pom.xml b/examples/camel-example-swagger-java/pom.xml index 09b0ba7..7552a65 100755 --- a/examples/camel-example-swagger-java/pom.xml +++ b/examples/camel-example-swagger-java/pom.xml @@ -53,10 +53,6 @@ <groupId>org.apache.camel</groupId> <artifactId>camel-servlet</artifactId> </dependency> - <dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-metrics</artifactId> - </dependency> <!-- swagger api --> <dependency> http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/examples/camel-example-swagger-java/src/main/resources/camel-config-xml.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-swagger-java/src/main/resources/camel-config-xml.xml b/examples/camel-example-swagger-java/src/main/resources/camel-config-xml.xml index 8ec9b0b..be888b4 100755 --- a/examples/camel-example-swagger-java/src/main/resources/camel-config-xml.xml +++ b/examples/camel-example-swagger-java/src/main/resources/camel-config-xml.xml @@ -23,9 +23,6 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - <!-- use camel-metrics route policy to gather metrics for all routes --> - <bean id="metricsRoutePolicyFactory" class="org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory"/> - <!-- a bean for user services --> <bean id="userService" class="org.apache.camel.example.rest.UserService"/> @@ -50,7 +47,17 @@ <get uri="/{id}" outType="org.apache.camel.example.rest.User"> <description>Find user by id</description> <param name="id" type="path" description="The id of the user to get" dataType="integer"/> - <to uri="bean:userService?method=getUser(${header.id})"/> + <responseMessage message="The user that was found"/> + <responseMessage code="404" message="User not found"/> + <route> + <to uri="bean:userService?method=getUser(${header.id})"/> + <filter> + <simple>${body} == null</simple> + <setHeader headerName="Exchange.HTTP_RESPONSE_CODE"> + <constant>404</constant> + </setHeader> + </filter> + </route> </get> <!-- this is a rest PUT to create/update an user --> @@ -63,6 +70,7 @@ <!-- this is a rest GET to find all users --> <get uri="/findAll" outType="org.apache.camel.example.rest.User[]"> <description>Find all users</description> + <responseMessage message="All the users"/> <to uri="bean:userService?method=listUsers"/> </get> </rest> http://git-wip-us.apache.org/repos/asf/camel/blob/c76cbd14/examples/camel-example-swagger-java/src/main/webapp/home.html ---------------------------------------------------------------------- diff --git a/examples/camel-example-swagger-java/src/main/webapp/home.html b/examples/camel-example-swagger-java/src/main/webapp/home.html index b9c4e2a..71e50c8 100644 --- a/examples/camel-example-swagger-java/src/main/webapp/home.html +++ b/examples/camel-example-swagger-java/src/main/webapp/home.html @@ -18,7 +18,7 @@ <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> - <title>Apache Camel Servlet REST and Apache Tomcat example</title> + <title>Apache Camel Swagger Java Example</title> <link rel="stylesheet" href="css/foundation.min.css"/> <script src="js/vendor/modernizr.js"></script> </head> @@ -26,23 +26,21 @@ <body> <div class="row"> <div class="large-12 columns"> - <h2>Apache Camel Example using Servlet REST & Web Container</h2> + <h2>Apache Camel Example using Swagger Java</h2> </div> </div> <div class="row"> <div class="large-12 columns"> - This example shows how to use Servlet REST to define REST endpoints in Camel routes using the Rest DSL + This example shows how to use Servlet REST to define REST endpoints in Camel routes using the Rest DSL, + and using camel-swagger-java to expose the REST service APIs. <br/> - This example is implemented in both the Java and XML DSLs. By default the Java DSL is in use. - You can change this in the src/main/webapps/WEB-INF/web.xml file + This example is implemented in XML DSL. <br/> - For Java DSL the routes are defined in Java code, in the <tt>org.apache.camel.example.rest.UserRouteBuilder</tt> - class. - And for XML DSL the routes are define in XML code, in the <tt>src/main/resources/camel-config-xml.xml</tt> file. + The XML DSL the routes are define in XML code, in the <tt>src/main/resources/camel-config-xml.xml</tt> file. <p/> There is a <i>user</i> REST service that supports the following operations