CAMEL-10164: swagger component for making rest calls with swagger schema validation and facade to actual HTTP client in use
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f894c7db Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f894c7db Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f894c7db Branch: refs/heads/master Commit: f894c7db8becc90198279c459e7ebe8bdb1fe0d0 Parents: 69c12a0 Author: Claus Ibsen <[email protected]> Authored: Thu Aug 25 08:57:43 2016 +0200 Committer: Claus Ibsen <[email protected]> Committed: Fri Aug 26 16:53:31 2016 +0200 ---------------------------------------------------------------------- .../SwaggerComponentConfiguration.java | 26 ++++++------ .../JettyRestProducerGetQueryParamTest.java | 2 +- .../rest/producer/JettyRestProducerGetTest.java | 8 ++-- .../swagger/component/SwaggerComponent.java | 42 ++++++++++---------- .../swagger/component/SwaggerEndpoint.java | 39 +++++++++--------- .../component/SwaggerComponentGetTest.java | 2 +- .../camel/swagger/component/SwaggerGetTest.java | 2 +- .../component/SwaggerGetUriParamTest.java | 2 +- components/readme.adoc | 3 ++ docs/user-manual/en/SUMMARY.md | 1 + 10 files changed, 67 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components-starter/camel-swagger-java-starter/src/main/java/org/apache/camel/swagger/component/springboot/SwaggerComponentConfiguration.java ---------------------------------------------------------------------- diff --git a/components-starter/camel-swagger-java-starter/src/main/java/org/apache/camel/swagger/component/springboot/SwaggerComponentConfiguration.java b/components-starter/camel-swagger-java-starter/src/main/java/org/apache/camel/swagger/component/springboot/SwaggerComponentConfiguration.java index b31b00d..7fdc34c 100644 --- a/components-starter/camel-swagger-java-starter/src/main/java/org/apache/camel/swagger/component/springboot/SwaggerComponentConfiguration.java +++ b/components-starter/camel-swagger-java-starter/src/main/java/org/apache/camel/swagger/component/springboot/SwaggerComponentConfiguration.java @@ -27,28 +27,20 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class SwaggerComponentConfiguration { /** - * The swagger schema to use in json format. The schema is loaded as a - * resource from the classpath or file system. - */ - private String schema; - /** * The camel component to use as HTTP client for calling the REST service. * The default value is: http */ private String componentName; /** + * The swagger api doc resource to use. The resource is loaded from + * classpath by default and must be in JSon format. + */ + private String apiDoc; + /** * Host and port of HTTP service to use (override host in swagger schema) */ private String host; - public String getSchema() { - return schema; - } - - public void setSchema(String schema) { - this.schema = schema; - } - public String getComponentName() { return componentName; } @@ -57,6 +49,14 @@ public class SwaggerComponentConfiguration { this.componentName = componentName; } + public String getApiDoc() { + return apiDoc; + } + + public void setApiDoc(String apiDoc) { + this.apiDoc = apiDoc; + } + public String getHost() { return host; } http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java index 565d51d..cfdc0f0 100644 --- a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java @@ -45,7 +45,7 @@ public class JettyRestProducerGetQueryParamTest extends BaseJettyTest { String host = "localhost:" + getPort(); from("direct:start") - .to("swagger:hello-api.json:get:bye?host=" + host) + .toF("swagger:get:bye?host=%s&apiDoc=%s", host, "hello-api.json") .to("mock:result"); from("jetty:http://localhost:{{port}}/api/bye/?matchOnUriPrefix=true") http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetTest.java index 69422d1..fda373c 100644 --- a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetTest.java +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetTest.java @@ -38,14 +38,16 @@ public class JettyRestProducerGetTest extends BaseJettyTest { return new RouteBuilder() { @Override public void configure() throws Exception { + String host = "localhost:" + getPort(); + SwaggerComponent sc = new SwaggerComponent(); sc.setComponentName("jetty"); + sc.setHost(host); + sc.setApiDoc("hello-api.json"); context.addComponent("swagger", sc); - String host = "localhost:" + getPort(); - from("direct:start") - .to("swagger:hello-api.json:get:hello/hi/{name}?host=" + host) + .to("swagger:get:hello/hi/{name}") .to("mock:result"); from("jetty:http://localhost:{{port}}/api/hello/hi/?matchOnUriPrefix=true") http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerComponent.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerComponent.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerComponent.java index 75eecec..d9c71fa 100644 --- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerComponent.java +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerComponent.java @@ -25,9 +25,13 @@ import org.apache.camel.util.URISupport; public class SwaggerComponent extends UriEndpointComponent { private String componentName = "http"; - private String schema; + private String apiDoc; private String host; + // TODO: we could move this to rest component in camel-core + // and have its producer support using a swagger schema and use a factory to lookup + // the code in this component that creates the producer + public SwaggerComponent() { super(SwaggerEndpoint.class); } @@ -36,24 +40,19 @@ public class SwaggerComponent extends UriEndpointComponent { protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { SwaggerEndpoint endpoint = new SwaggerEndpoint(uri, this); endpoint.setComponentName(componentName); + endpoint.setApiDoc(apiDoc); + endpoint.setHost(host); - String schema; String verb; String path; String[] parts = remaining.split(":"); if (parts.length == 2) { - schema = this.schema; verb = parts[0]; path = parts[1]; - } else if (parts.length == 3) { - schema = parts[0]; - verb = parts[1]; - path = parts[2]; } else { - throw new IllegalArgumentException("Invalid syntax. Expected swagger:schema:verb:path?options"); + throw new IllegalArgumentException("Invalid syntax. Expected swagger:verb:path?options"); } - endpoint.setSchema(schema); endpoint.setVerb(verb); // path must start with leading slash if (!path.startsWith("/")) { @@ -70,19 +69,6 @@ public class SwaggerComponent extends UriEndpointComponent { return endpoint; } - public String getSchema() { - return schema; - } - - /** - * The swagger schema to use in json format. - * <p/> - * The schema is loaded as a resource from the classpath or file system. - */ - public void setSchema(String schema) { - this.schema = schema; - } - public String getComponentName() { return componentName; } @@ -95,6 +81,18 @@ public class SwaggerComponent extends UriEndpointComponent { this.componentName = componentName; } + public String getApiDoc() { + return apiDoc; + } + + /** + * The swagger api doc resource to use. + * The resource is loaded from classpath by default and must be in JSon format. + */ + public void setApiDoc(String apiDoc) { + this.apiDoc = apiDoc; + } + public String getHost() { return host; } http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerEndpoint.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerEndpoint.java index 3ccfb74..0c7ccb9 100644 --- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerEndpoint.java +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerEndpoint.java @@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory; import static org.apache.camel.util.ResourceHelper.resolveMandatoryResourceAsInputStream; -@UriEndpoint(scheme = "swagger", title = "Swagger", syntax = "swagger:schema:verb:path", +@UriEndpoint(scheme = "swagger", title = "Swagger", syntax = "swagger:verb:path", producerOnly = true, label = "rest", lenientProperties = true) public class SwaggerEndpoint extends DefaultEndpoint { @@ -44,8 +44,6 @@ public class SwaggerEndpoint extends DefaultEndpoint { private transient Swagger swagger; - @UriPath(enums = "http,https") - private String schema; @UriPath(enums = "get,put,post,head,delete,patch,options") @Metadata(required = "true") private String verb; @UriPath @Metadata(required = "true") @@ -53,6 +51,8 @@ public class SwaggerEndpoint extends DefaultEndpoint { @UriParam private String componentName; @UriParam + private String apiDoc; + @UriParam private String host; @UriParam(multiValue = true) private String queryParameters; @@ -83,17 +83,6 @@ public class SwaggerEndpoint extends DefaultEndpoint { return true; } - public String getSchema() { - return schema; - } - - /** - * Scheme to use when calling the REST service such as http or https - */ - public void setSchema(String schema) { - this.schema = schema; - } - public String getVerb() { return verb; } @@ -139,12 +128,24 @@ public class SwaggerEndpoint extends DefaultEndpoint { this.componentName = componentName; } + public String getApiDoc() { + return apiDoc; + } + + /** + * The swagger api doc resource to use. + * The resource is loaded from classpath by default and must be in JSon format. + */ + public void setApiDoc(String apiDoc) { + this.apiDoc = apiDoc; + } + public String getHost() { return host; } /** - * Host and port of HTTP service to use (override host in swagger schema) + * Host and port of HTTP service to use (override host in swagger api-doc) */ public void setHost(String host) { this.host = host; @@ -155,13 +156,15 @@ public class SwaggerEndpoint extends DefaultEndpoint { super.doStart(); // load json model - ObjectHelper.notEmpty(schema, "schema"); + if (apiDoc == null) { + throw new IllegalArgumentException("The swagger api-doc must be configured using the apiDoc option"); + } - InputStream is = resolveMandatoryResourceAsInputStream(getCamelContext(), schema); + InputStream is = resolveMandatoryResourceAsInputStream(getCamelContext(), apiDoc); try { SwaggerParser parser = new SwaggerParser(); String json = getCamelContext().getTypeConverter().mandatoryConvertTo(String.class, is); - LOG.debug("Loaded swagger schema:\n{}", json); + LOG.debug("Loaded swagger api-doc:\n{}", json); swagger = parser.parse(json); } finally { IOHelper.close(is); http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerComponentGetTest.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerComponentGetTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerComponentGetTest.java index ffe80a3..92e62de 100644 --- a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerComponentGetTest.java +++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerComponentGetTest.java @@ -47,7 +47,7 @@ public class SwaggerComponentGetTest extends CamelTestSupport { public void configure() throws Exception { SwaggerComponent sc = new SwaggerComponent(); sc.setComponentName("dummy"); - sc.setSchema("hello-api.json"); + sc.setApiDoc("hello-api.json"); context.addComponent("swagger", sc); http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetTest.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetTest.java index f4b6937..1575d02 100644 --- a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetTest.java +++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetTest.java @@ -51,7 +51,7 @@ public class SwaggerGetTest extends CamelTestSupport { context.addComponent("swagger", sc); from("direct:start") - .to("swagger:hello-api.json:get:hello/hi/{name}") + .to("swagger:get:hello/hi/{name}?apiDoc=hello-api.json") .to("mock:result"); } }; http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java index 04d8642..0a76f01 100644 --- a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java +++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java @@ -51,7 +51,7 @@ public class SwaggerGetUriParamTest extends CamelTestSupport { context.addComponent("swagger", sc); from("direct:start") - .to("swagger:hello-api.json:get:bye?name={name}") + .to("swagger:get:bye?name={name}&apiDoc=hello-api.json") .to("mock:result"); } }; http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/components/readme.adoc ---------------------------------------------------------------------- diff --git a/components/readme.adoc b/components/readme.adoc index 6b5ec75..3534035 100644 --- a/components/readme.adoc +++ b/components/readme.adoc @@ -501,6 +501,9 @@ Components | link:camel-stringtemplate/src/main/docs/string-template-component.adoc[String Template] (camel-stringtemplate) + `string-template:resourceUri` | Transforms the message using a String template. +| link:camel-swagger-java/src/main/docs/swagger-component.adoc[Swagger] (camel-swagger-java) + +`swagger:verb:path` | Camel Swagger Java support + | link:camel-telegram/src/main/docs/telegram-component.adoc[Telegram] (camel-telegram) + `telegram:type/authorizationToken` | The Camel endpoint for a telegram bot. http://git-wip-us.apache.org/repos/asf/camel/blob/f894c7db/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index b3eda45..5dca599 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -289,6 +289,7 @@ * [Stomp](stomp-component.adoc) * [Stream](stream-component.adoc) * [String Template](string-template-component.adoc) + * [Swagger](swagger-component.adoc) * [Telegram](telegram-component.adoc) * [Twitter](twitter-component.adoc) * [Undertow](undertow-component.adoc)
