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/03/20 11:31:32 UTC

camel git commit: CAMEL-9726: camel-swagger-java now supports yaml as output format.

Repository: camel
Updated Branches:
  refs/heads/master 156f21f08 -> 8e11b7ace


CAMEL-9726: camel-swagger-java now supports yaml as output format.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8e11b7ac
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8e11b7ac
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8e11b7ac

Branch: refs/heads/master
Commit: 8e11b7ace433c3b368c0694c19186682de96f09a
Parents: 156f21f
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Mar 20 11:21:33 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Mar 20 11:30:09 2016 +0100

----------------------------------------------------------------------
 .../jetty/rest/RestApiJettyYamlTest.java        | 35 +++++++++
 components/camel-swagger-java/pom.xml           |  4 +-
 .../camel/swagger/RestSwaggerProcessor.java     | 24 +++++-
 .../camel/swagger/RestSwaggerSupport.java       | 79 ++++++++++++++------
 .../swagger/servlet/RestSwaggerServlet.java     | 25 ++++++-
 5 files changed, 139 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8e11b7ac/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/RestApiJettyYamlTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/RestApiJettyYamlTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/RestApiJettyYamlTest.java
new file mode 100644
index 0000000..907f3eb
--- /dev/null
+++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/rest/RestApiJettyYamlTest.java
@@ -0,0 +1,35 @@
+/**
+ * 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.component.jetty.rest;
+
+import org.junit.Test;
+
+public class RestApiJettyYamlTest extends RestApiJettyTest {
+
+    @Test
+    public void testApi() throws Exception {
+        String out = template.requestBody("jetty:http://localhost:{{port}}/api-doc/swagger.yaml", null, String.class);
+        assertNotNull(out);
+        assertTrue(out.contains("version: \"1.2.3\""));
+        assertTrue(out.contains("title: \"The hello rest thing"));
+        assertTrue(out.contains("/hello/bye:"));
+        assertTrue(out.contains("- \"hello\""));
+        assertTrue(out.contains("/hello/bye/{name}:"));
+        assertTrue(out.contains("- name: \"name\""));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8e11b7ac/components/camel-swagger-java/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/pom.xml b/components/camel-swagger-java/pom.xml
index a19a25c..f2afa26 100644
--- a/components/camel-swagger-java/pom.xml
+++ b/components/camel-swagger-java/pom.xml
@@ -15,7 +15,8 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
@@ -43,6 +44,7 @@
       <artifactId>camel-core</artifactId>
     </dependency>
 
+    <!-- json -->
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>

http://git-wip-us.apache.org/repos/asf/camel/blob/8e11b7ac/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
index 5a34355..51ffd12 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
@@ -53,13 +53,33 @@ public class RestSwaggerProcessor implements Processor {
 
         String contextId = exchange.getContext().getName();
         String route = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
+        String accept = exchange.getIn().getHeader(Exchange.ACCEPT_CONTENT_TYPE, String.class);
 
         RestApiResponseAdapter adapter = new ExchangeRestApiResponseAdapter(exchange);
 
+        // whether to use json or yaml
+        boolean json = false;
+        boolean yaml = false;
+        if (route != null && route.endsWith("/swagger.json")) {
+            json = true;
+            route = route.substring(0, route.length() - 13);
+        } else if (route != null && route.endsWith("/swagger.yaml")) {
+            yaml = true;
+            route = route.substring(0, route.length() - 13);
+        }
+        if (accept != null && !json && !yaml) {
+            json = accept.contains("json");
+            yaml = accept.contains("yaml");
+        }
+        if (!json && !yaml) {
+            // json is default
+            json = true;
+        }
+
         try {
             // render list of camel contexts as root
             if (contextIdListing && (ObjectHelper.isEmpty(route) || route.equals("/"))) {
-                support.renderCamelContexts(adapter, contextId, contextIdPattern);
+                support.renderCamelContexts(adapter, contextId, contextIdPattern, json, yaml);
             } else {
                 String name;
                 if (ObjectHelper.isNotEmpty(route)) {
@@ -92,7 +112,7 @@ public class RestSwaggerProcessor implements Processor {
                 if (!match) {
                     adapter.noContent();
                 } else {
-                    support.renderResourceListing(adapter, swaggerConfig, name, route, exchange.getContext().getClassResolver());
+                    support.renderResourceListing(adapter, swaggerConfig, name, route, json, yaml, exchange.getContext().getClassResolver());
                 }
             }
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/camel/blob/8e11b7ac/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
index 7b51ada..0cef5b5 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
@@ -28,6 +28,7 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import io.swagger.jaxrs.config.BeanConfig;
@@ -35,6 +36,7 @@ import io.swagger.models.Contact;
 import io.swagger.models.Info;
 import io.swagger.models.License;
 import io.swagger.models.Swagger;
+import io.swagger.util.Yaml;
 import org.apache.camel.Exchange;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
@@ -187,7 +189,8 @@ public class RestSwaggerSupport {
         return answer;
     }
 
-    public void renderResourceListing(RestApiResponseAdapter response, BeanConfig swaggerConfig, String contextId, String route, ClassResolver classResolver) throws Exception {
+    public void renderResourceListing(RestApiResponseAdapter response, BeanConfig swaggerConfig, String contextId, String route, boolean json, boolean yaml,
+                                      ClassResolver classResolver) throws Exception {
         LOG.trace("renderResourceListing");
 
         if (cors) {
@@ -198,20 +201,41 @@ public class RestSwaggerSupport {
 
         List<RestDefinition> rests = getRestDefinitions(contextId);
         if (rests != null) {
-            response.setHeader(Exchange.CONTENT_TYPE, "application/json");
+            if (json) {
+                response.setHeader(Exchange.CONTENT_TYPE, "text/json");
 
-            // read the rest-dsl into swagger model
-            Swagger swagger = reader.read(rests, route, swaggerConfig, contextId, classResolver);
+                // read the rest-dsl into swagger model
+                Swagger swagger = reader.read(rests, route, swaggerConfig, contextId, classResolver);
 
-            ObjectMapper mapper = new ObjectMapper();
-            mapper.enable(SerializationFeature.INDENT_OUTPUT);
-            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-            byte[] bytes = mapper.writeValueAsBytes(swagger);
+                ObjectMapper mapper = new ObjectMapper();
+                mapper.enable(SerializationFeature.INDENT_OUTPUT);
+                mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+                byte[] bytes = mapper.writeValueAsBytes(swagger);
 
-            int len = bytes.length;
-            response.setHeader(Exchange.CONTENT_LENGTH, "" + len);
+                int len = bytes.length;
+                response.setHeader(Exchange.CONTENT_LENGTH, "" + len);
 
-            response.writeBytes(bytes);
+                response.writeBytes(bytes);
+            } else {
+                response.setHeader(Exchange.CONTENT_TYPE, "text/yaml");
+
+                // read the rest-dsl into swagger model
+                Swagger swagger = reader.read(rests, route, swaggerConfig, contextId, classResolver);
+
+                ObjectMapper mapper = new ObjectMapper();
+                mapper.enable(SerializationFeature.INDENT_OUTPUT);
+                mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+                byte[] jsonData = mapper.writeValueAsBytes(swagger);
+
+                // json to yaml
+                JsonNode node = mapper.readTree(jsonData);
+                byte[] bytes = Yaml.mapper().writerWithDefaultPrettyPrinter().writeValueAsBytes(node);
+
+                int len = bytes.length;
+                response.setHeader(Exchange.CONTENT_LENGTH, "" + len);
+
+                response.writeBytes(bytes);
+            }
         } else {
             response.noContent();
         }
@@ -220,7 +244,7 @@ public class RestSwaggerSupport {
     /**
      * Renders a list of available CamelContexts in the JVM
      */
-    public void renderCamelContexts(RestApiResponseAdapter response, String contextId, String contextIdPattern) throws Exception {
+    public void renderCamelContexts(RestApiResponseAdapter response, String contextId, String contextIdPattern, boolean json, boolean yaml) throws Exception {
         LOG.trace("renderCamelContexts");
 
         if (cors) {
@@ -229,10 +253,6 @@ public class RestSwaggerSupport {
             response.setHeader("Access-Control-Allow-Origin", "*");
         }
 
-        response.setHeader(Exchange.CONTENT_TYPE, "application/json");
-
-        StringBuffer sb = new StringBuffer();
-
         List<String> contexts = findCamelContexts();
 
         // filter non matched CamelContext's
@@ -253,15 +273,28 @@ public class RestSwaggerSupport {
             }
         }
 
-        sb.append("[\n");
-        for (int i = 0; i < contexts.size(); i++) {
-            String name = contexts.get(i);
-            sb.append("{\"name\": \"").append(name).append("\"}");
-            if (i < contexts.size() - 1) {
-                sb.append(",\n");
+        StringBuffer sb = new StringBuffer();
+
+        if (json) {
+            response.setHeader(Exchange.CONTENT_TYPE, "text/json");
+
+            sb.append("[\n");
+            for (int i = 0; i < contexts.size(); i++) {
+                String name = contexts.get(i);
+                sb.append("{\"name\": \"").append(name).append("\"}");
+                if (i < contexts.size() - 1) {
+                    sb.append(",\n");
+                }
+            }
+            sb.append("\n]");
+        } else {
+            response.setHeader(Exchange.CONTENT_TYPE, "text/yaml");
+
+            for (int i = 0; i < contexts.size(); i++) {
+                String name = contexts.get(i);
+                sb.append("- \"").append(name).append("\"\n");
             }
         }
-        sb.append("\n]");
 
         int len = sb.length();
         response.setHeader(Exchange.CONTENT_LENGTH, "" + len);

http://git-wip-us.apache.org/repos/asf/camel/blob/8e11b7ac/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
index 48b7ee5..cfa8539 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import io.swagger.jaxrs.config.BeanConfig;
+import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultClassResolver;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.swagger.RestApiResponseAdapter;
@@ -116,13 +117,33 @@ public class RestSwaggerServlet extends HttpServlet {
 
         String contextId = null;
         String route = request.getPathInfo();
+        String accept = request.getHeader(Exchange.ACCEPT_CONTENT_TYPE);
+
+        // whether to use json or yaml
+        boolean json = false;
+        boolean yaml = false;
+        if (route != null && route.endsWith("/swagger.json")) {
+            json = true;
+            route = route.substring(0, route.length() - 13);
+        } else if (route != null && route.endsWith("/swagger.yaml")) {
+            yaml = true;
+            route = route.substring(0, route.length() - 13);
+        }
+        if (accept != null && !json && !yaml) {
+            json = accept.contains("json");
+            yaml = accept.contains("yaml");
+        }
+        if (!json && !yaml) {
+            // json is default
+            json = true;
+        }
 
         RestApiResponseAdapter adapter = new ServletRestApiResponseAdapter(response);
 
         try {
             // render list of camel contexts as root
             if (apiContextIdListing && (ObjectHelper.isEmpty(route) || route.equals("/"))) {
-                support.renderCamelContexts(adapter, contextId, apiContextIdPattern);
+                support.renderCamelContexts(adapter, contextId, apiContextIdPattern, json, yaml);
             } else {
                 String name = null;
                 if (ObjectHelper.isNotEmpty(route)) {
@@ -162,7 +183,7 @@ public class RestSwaggerServlet extends HttpServlet {
                 if (!match) {
                     adapter.noContent();
                 } else {
-                    support.renderResourceListing(adapter, swaggerConfig, name, route, classResolver);
+                    support.renderResourceListing(adapter, swaggerConfig, name, route, json, yaml, classResolver);
                 }
             }
         } catch (Exception e) {