You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/08/26 16:02:37 UTC

[09/23] camel git commit: CAMEL-10164: swagger component for making rest calls with swagger schema validation and facade to actual HTTP client in use

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/2e39b2c2
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2e39b2c2
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2e39b2c2

Branch: refs/heads/master
Commit: 2e39b2c25c690e45ca5c0fa2827c99dc0b6e9c33
Parents: 56b3152
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Aug 24 16:00:39 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Aug 26 16:53:31 2016 +0200

----------------------------------------------------------------------
 .../component/jetty/JettyHttpComponent.java     |  8 ++-
 .../JettyRestProducerGetQueryParamTest.java     | 57 +++++++++++++++++++
 .../src/test/resources/hello-api.json           | 15 +++++
 .../swagger/component/SwaggerComponent.java     |  7 +++
 .../swagger/component/SwaggerEndpoint.java      | 18 ++++++
 .../swagger/component/SwaggerProducer.java      |  7 +++
 .../component/DummyRestProducerFactory.java     |  7 ++-
 .../component/SwaggerGetUriParamTest.java       | 59 ++++++++++++++++++++
 .../src/test/resources/hello-api.json           | 15 +++++
 9 files changed, 189 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
index 9ba3f04..6b9394f 100644
--- a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
+++ b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
@@ -1158,6 +1158,7 @@ public abstract class JettyHttpComponent extends HttpCommonComponent implements
         // avoid leading slash
         basePath = FileUtil.stripLeadingSeparator(basePath);
         uriTemplate = FileUtil.stripLeadingSeparator(uriTemplate);
+        resolvedUriTemplate = FileUtil.stripLeadingSeparator(resolvedUriTemplate);
 
         // does the uri template use path parameters?
         if (uriTemplate.contains("{") && resolvedUriTemplate != null) {
@@ -1165,13 +1166,14 @@ public abstract class JettyHttpComponent extends HttpCommonComponent implements
             String overrideUri = String.format("%s://%s/%s/%s", scheme, host, basePath, resolvedUriTemplate);
             exchange.getIn().setHeader(Exchange.HTTP_URI, overrideUri);
         }
+        if (queryParameters != null) {
+            // use a header for the query parameters
+            exchange.getIn().setHeader(Exchange.HTTP_QUERY, queryParameters);
+        }
 
         // get the endpoint
         String url = "jetty:%s://%s/%s/%s";
         url = String.format(url, scheme, host, basePath, uriTemplate);
-        if (queryParameters != null) {
-            url = url + "&" + queryParameters;
-        }
 
         JettyHttpEndpoint endpoint = camelContext.getEndpoint(url, JettyHttpEndpoint.class);
         if (parameters != null && !parameters.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/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
new file mode 100644
index 0000000..565d51d
--- /dev/null
+++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/producer/JettyRestProducerGetQueryParamTest.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jetty.rest.producer;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.swagger.component.SwaggerComponent;
+import org.junit.Test;
+
+public class JettyRestProducerGetQueryParamTest extends BaseJettyTest {
+
+    @Test
+    public void testSwaggerGet() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye Donald Duck");
+
+        template.sendBodyAndHeader("direct:start", null, "name", "Donald Duck");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                SwaggerComponent sc = new SwaggerComponent();
+                sc.setComponentName("jetty");
+                context.addComponent("swagger", sc);
+
+                String host = "localhost:" + getPort();
+
+                from("direct:start")
+                        .to("swagger:hello-api.json:get:bye?host=" + host)
+                        .to("mock:result");
+
+                from("jetty:http://localhost:{{port}}/api/bye/?matchOnUriPrefix=true")
+                    .transform().simple("Bye ${header.name}");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/components/camel-jetty9/src/test/resources/hello-api.json
----------------------------------------------------------------------
diff --git a/components/camel-jetty9/src/test/resources/hello-api.json b/components/camel-jetty9/src/test/resources/hello-api.json
index 82d61f8..6cc6a72 100644
--- a/components/camel-jetty9/src/test/resources/hello-api.json
+++ b/components/camel-jetty9/src/test/resources/hello-api.json
@@ -21,6 +21,21 @@
           "type" : "string"
         } ]
       }
+    },
+    "/bye" : {
+      "get" : {
+        "tags" : [ "bye" ],
+        "summary" : "Saying bye",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "name",
+          "in" : "query",
+          "description" : "Who is it",
+          "required" : true,
+          "type" : "string"
+        } ]
+      }
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/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 bf012f4..75eecec 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
@@ -20,6 +20,7 @@ import java.util.Map;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.impl.UriEndpointComponent;
+import org.apache.camel.util.URISupport;
 
 public class SwaggerComponent extends UriEndpointComponent {
 
@@ -60,6 +61,12 @@ public class SwaggerComponent extends UriEndpointComponent {
         }
         endpoint.setPath(path);
 
+        setProperties(endpoint, parameters);
+
+        // the rest is URI parameters on path
+        String query = URISupport.createQueryString(parameters);
+        endpoint.setQueryParameters(query);
+
         return endpoint;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/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 df1dc02..3ccfb74 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
@@ -54,6 +54,8 @@ public class SwaggerEndpoint extends DefaultEndpoint {
     private String componentName;
     @UriParam
     private String host;
+    @UriParam(multiValue = true)
+    private String queryParameters;
 
     public SwaggerEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
@@ -72,6 +74,11 @@ public class SwaggerEndpoint extends DefaultEndpoint {
     }
 
     @Override
+    public boolean isLenientProperties() {
+        return true;
+    }
+
+    @Override
     public boolean isSingleton() {
         return true;
     }
@@ -109,6 +116,17 @@ public class SwaggerEndpoint extends DefaultEndpoint {
         this.path = path;
     }
 
+    public String getQueryParameters() {
+        return queryParameters;
+    }
+
+    /**
+     * Query parameters for the HTTP service to call
+     */
+    public void setQueryParameters(String queryParameters) {
+        this.queryParameters = queryParameters;
+    }
+
     public String getComponentName() {
         return componentName;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerProducer.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerProducer.java
index e410e28..a5d0c18 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerProducer.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/component/SwaggerProducer.java
@@ -37,6 +37,7 @@ import org.apache.camel.impl.DefaultAsyncProducer;
 import org.apache.camel.spi.RestProducerFactory;
 import org.apache.camel.util.AsyncProcessorConverterHelper;
 import org.apache.camel.util.CollectionStringBuffer;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.URISupport;
@@ -209,6 +210,9 @@ public class SwaggerProducer extends DefaultAsyncProducer {
                     if (name != null) {
                         String value = exchange.getIn().getHeader(name, String.class);
                         if (value != null) {
+                            // we need to remove the header as they are sent as query instead
+                            // TODO: we could use a header filter strategy to skip these headers
+                            exchange.getIn().removeHeader(param.getName());
                             query.put(name, value);
                         } else if (param.getRequired()) {
                             throw new NoSuchHeaderException(exchange, name, String.class);
@@ -217,6 +221,9 @@ public class SwaggerProducer extends DefaultAsyncProducer {
                 } else if ("path".equals(param.getIn())) {
                     String value = exchange.getIn().getHeader(param.getName(), String.class);
                     if (value != null) {
+                        // we need to remove the header as they are sent as path instead
+                        // TODO: we could use a header filter strategy to skip these headers
+                        exchange.getIn().removeHeader(param.getName());
                         String token = "{" + param.getName() + "}";
                         resolvedUriTemplate = StringHelper.replaceAll(resolvedUriTemplate, token, value);
                     } else if (param.getRequired()) {

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/DummyRestProducerFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/DummyRestProducerFactory.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/DummyRestProducerFactory.java
index 096b440..4f1da5c 100644
--- a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/DummyRestProducerFactory.java
+++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/DummyRestProducerFactory.java
@@ -24,6 +24,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Producer;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.spi.RestProducerFactory;
+import org.apache.camel.util.ObjectHelper;
 
 public class DummyRestProducerFactory implements RestProducerFactory {
 
@@ -40,8 +41,12 @@ public class DummyRestProducerFactory implements RestProducerFactory {
             public void process(Exchange exchange) throws Exception {
                 // for testing purpose, check if we have {name} in template
                 if (uriTemplate.contains("{name}")) {
-                    String name = exchange.getIn().getHeader("name", String.class);
+                    int pos = resolvedUriTemplate.lastIndexOf('/');
+                    String name = resolvedUriTemplate.substring(pos + 1);
                     exchange.getIn().setBody("Hello " + name);
+                } else if (queryParameters.contains("name=")) {
+                    String name = ObjectHelper.after(queryParameters, "name=");
+                    exchange.getIn().setBody("Bye " + name);
                 }
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/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
new file mode 100644
index 0000000..04d8642
--- /dev/null
+++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/component/SwaggerGetUriParamTest.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.swagger.component;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class SwaggerGetUriParamTest extends CamelTestSupport {
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("dummy", new DummyRestProducerFactory());
+        return jndi;
+    }
+
+    @Test
+    public void testSwaggerGet() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye Donald+Duck");
+
+        template.sendBodyAndHeader("direct:start", null, "name", "Donald Duck");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                SwaggerComponent sc = new SwaggerComponent();
+                sc.setComponentName("dummy");
+
+                context.addComponent("swagger", sc);
+
+                from("direct:start")
+                    .to("swagger:hello-api.json:get:bye?name={name}")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2e39b2c2/components/camel-swagger-java/src/test/resources/hello-api.json
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/test/resources/hello-api.json b/components/camel-swagger-java/src/test/resources/hello-api.json
index 82d61f8..6cc6a72 100644
--- a/components/camel-swagger-java/src/test/resources/hello-api.json
+++ b/components/camel-swagger-java/src/test/resources/hello-api.json
@@ -21,6 +21,21 @@
           "type" : "string"
         } ]
       }
+    },
+    "/bye" : {
+      "get" : {
+        "tags" : [ "bye" ],
+        "summary" : "Saying bye",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "name",
+          "in" : "query",
+          "description" : "Who is it",
+          "required" : true,
+          "type" : "string"
+        } ]
+      }
     }
   }
 }