Repository: camel
Updated Branches:
  refs/heads/master 8ce5a2b2f -> e98a801b5


CAMEL-8545: camel-swagger-java to run outside servlet - 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/e82caac4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e82caac4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e82caac4

Branch: refs/heads/master
Commit: e82caac4605d8a7dc55a5cac2629f5a9b21b9c08
Parents: 646c9bc
Author: Claus Ibsen <davscl...@apache.org>
Authored: Tue Sep 22 17:33:34 2015 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Sep 23 07:51:03 2015 +0200

----------------------------------------------------------------------
 .../camel/spi/RestApiResponseAdapter.java       | 32 ---------
 .../spi/RestApiResponseAdapterFactory.java      | 34 ---------
 .../netty4/http/NettyHttpComponent.java         | 70 +++++++++++++++---
 .../http/NettyRestApiResponseAdapter.java       | 48 -------------
 .../http/handlers/HttpClientChannelHandler.java |  3 +-
 components/camel-swagger-java/pom.xml           |  5 ++
 .../swagger/ExchangeRestApiResponseAdapter.java | 45 ++++++++++++
 .../camel/swagger/RestApiResponseAdapter.java   | 28 ++++++++
 .../camel/swagger/RestSwaggerProcessor.java     | 76 +-------------------
 .../camel/swagger/RestSwaggerSupport.java       | 23 ++++--
 .../swagger/servlet/RestSwaggerServlet.java     |  6 +-
 .../servlet/ServletRestApiResponseAdapter.java  |  2 +-
 .../apache/camel/swagger/RestApiNettyTest.java  | 65 +++++++++++++++++
 13 files changed, 230 insertions(+), 207 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java 
b/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java
deleted file mode 100644
index 01b1e4f..0000000
--- a/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * 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.spi;
-
-import java.io.IOException;
-
-/**
- * An adapter to allow Camel rest-api to use Camel components to render the 
api response.
- */
-public interface RestApiResponseAdapter {
-
-    void addHeader(String name, String value);
-
-    void writeBytes(byte[] bytes) throws IOException;
-
-    void noContent();
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapterFactory.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapterFactory.java
 
b/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapterFactory.java
deleted file mode 100644
index 71bffd8..0000000
--- 
a/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapterFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * 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.spi;
-
-import org.apache.camel.Exchange;
-
-/**
- * Factory to create {@link RestApiResponseAdapter} which allows Camel 
components
- * to provide a response adapter to be used by the rest-dsl api support.
- */
-public interface RestApiResponseAdapterFactory {
-
-    /**
-     * Creates a new {@link RestApiResponseAdapter}
-     *
-     * @param exchange  the exchange
-     * @return the adapter
-     */
-    RestApiResponseAdapter newAdapter(Exchange exchange);
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
 
b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
index d036cff..9012d93 100644
--- 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
+++ 
b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.netty4.NettyComponent;
 import org.apache.camel.component.netty4.NettyConfiguration;
@@ -32,8 +31,7 @@ import 
org.apache.camel.component.netty4.NettyServerBootstrapConfiguration;
 import 
org.apache.camel.component.netty4.http.handlers.HttpServerMultiplexChannelHandler;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
-import org.apache.camel.spi.RestApiResponseAdapter;
-import org.apache.camel.spi.RestApiResponseAdapterFactory;
+import org.apache.camel.spi.RestApiConsumerFactory;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.util.FileUtil;
@@ -49,7 +47,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Netty HTTP based component.
  */
-public class NettyHttpComponent extends NettyComponent implements 
HeaderFilterStrategyAware, RestConsumerFactory, RestApiResponseAdapterFactory {
+public class NettyHttpComponent extends NettyComponent implements 
HeaderFilterStrategyAware, RestConsumerFactory, RestApiConsumerFactory {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(NettyHttpComponent.class);
 
@@ -300,12 +298,66 @@ public class NettyHttpComponent extends NettyComponent 
implements HeaderFilterSt
     }
 
     @Override
-    public RestApiResponseAdapter newAdapter(Exchange exchange) {
-        NettyHttpMessage http = exchange.getIn(NettyHttpMessage.class);
-        if (http != null) {
-            return new NettyRestApiResponseAdapter(http.getHttpResponse());
+    public Consumer createApiConsumer(CamelContext camelContext, Processor 
processor, String contextPath, Map<String, Object> parameters) throws Exception 
{
+        String path = FileUtil.stripLeadingSeparator(contextPath);
+
+        String scheme = "http";
+        String host = "";
+        int port = 0;
+
+        // if no explicit port/host configured, then use port from rest 
configuration
+        RestConfiguration config = 
getCamelContext().getRestConfiguration("netty4-http", true);
+        if (config.getScheme() != null) {
+            scheme = config.getScheme();
+        }
+        if (config.getHost() != null) {
+            host = config.getHost();
+        }
+        int num = config.getPort();
+        if (num > 0) {
+            port = num;
+        }
+
+        // if no explicit hostname set then resolve the hostname
+        if (ObjectHelper.isEmpty(host)) {
+            if (config.getRestHostNameResolver() == 
RestConfiguration.RestHostNameResolver.localHostName) {
+                host = HostUtils.getLocalHostName();
+            } else if (config.getRestHostNameResolver() == 
RestConfiguration.RestHostNameResolver.localIp) {
+                host = HostUtils.getLocalIp();
+            }
         }
-        return null;
+
+        Map<String, Object> map = new HashMap<String, Object>();
+        // build query string, and append any endpoint configuration properties
+        if (config != null && (config.getComponent() == null || 
config.getComponent().equals("netty4-http"))) {
+            // setup endpoint options
+            if (config.getEndpointProperties() != null && 
!config.getEndpointProperties().isEmpty()) {
+                map.putAll(config.getEndpointProperties());
+            }
+        }
+
+        String query = URISupport.createQueryString(map);
+
+        String url = 
"netty4-http:%s://%s:%s/%s?httpMethodRestrict=%s&matchOnUriPrefix=true";
+        // must use upper case for restrict
+        String restrict = "GET";
+        // get the endpoint
+        url = String.format(url, scheme, host, port, path, restrict);
+
+        if (!query.isEmpty()) {
+            url = url + "&" + query;
+        }
+
+        NettyHttpEndpoint endpoint = camelContext.getEndpoint(url, 
NettyHttpEndpoint.class);
+        setProperties(endpoint, parameters);
+
+        // configure consumer properties
+        Consumer consumer = endpoint.createConsumer(processor);
+        if (config != null && config.getConsumerProperties() != null && 
!config.getConsumerProperties().isEmpty()) {
+            setProperties(consumer, config.getConsumerProperties());
+        }
+
+        return consumer;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyRestApiResponseAdapter.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyRestApiResponseAdapter.java
 
b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyRestApiResponseAdapter.java
deleted file mode 100644
index 263f1e3..0000000
--- 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyRestApiResponseAdapter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * 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.netty4.http;
-
-import java.io.IOException;
-
-import io.netty.handler.codec.http.FullHttpResponse;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.camel.spi.RestApiResponseAdapter;
-
-public class NettyRestApiResponseAdapter implements RestApiResponseAdapter {
-
-    private final FullHttpResponse httpResponse;
-
-    public NettyRestApiResponseAdapter(FullHttpResponse httpResponse) {
-        this.httpResponse = httpResponse;
-    }
-
-    @Override
-    public void addHeader(String name, String value) {
-        httpResponse.headers().set(name, value);
-    }
-
-    @Override
-    public void writeBytes(byte[] bytes) throws IOException {
-        httpResponse.content().writeBytes(bytes);
-    }
-
-    @Override
-    public void noContent() {
-        httpResponse.setStatus(HttpResponseStatus.NO_CONTENT);
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/handlers/HttpClientChannelHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/handlers/HttpClientChannelHandler.java
 
b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/handlers/HttpClientChannelHandler.java
index 6657c24..1a9ab1e 100644
--- 
a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/handlers/HttpClientChannelHandler.java
+++ 
b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/handlers/HttpClientChannelHandler.java
@@ -26,9 +26,8 @@ import 
org.apache.camel.component.netty4.handlers.ClientChannelHandler;
 import org.apache.camel.component.netty4.http.NettyHttpProducer;
 
 /**
- * Netty HTTP {@link 
org.apache.camel.component.netty.handlers.ClientChannelHandler} that handles 
the response combing
+ * Netty HTTP {@link 
org.apache.camel.component.netty4.handlers.ClientChannelHandler} that handles 
the response combing
  * back from the HTTP server, called by this client.
- *
  */
 public class HttpClientChannelHandler extends ClientChannelHandler {
     private final NettyHttpProducer producer;

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-swagger-java/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/pom.xml 
b/components/camel-swagger-java/pom.xml
index 742a9e5..33072cf 100644
--- a/components/camel-swagger-java/pom.xml
+++ b/components/camel-swagger-java/pom.xml
@@ -114,6 +114,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-netty4-http</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/e82caac4/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/ExchangeRestApiResponseAdapter.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/ExchangeRestApiResponseAdapter.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/ExchangeRestApiResponseAdapter.java
new file mode 100644
index 0000000..e6e911b
--- /dev/null
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/ExchangeRestApiResponseAdapter.java
@@ -0,0 +1,45 @@
+/**
+ * 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;
+
+import java.io.IOException;
+
+import org.apache.camel.Exchange;
+
+public class ExchangeRestApiResponseAdapter implements RestApiResponseAdapter {
+
+    private final Exchange exchange;
+
+    public ExchangeRestApiResponseAdapter(Exchange exchange) {
+        this.exchange = exchange;
+    }
+
+    @Override
+    public void addHeader(String name, String value) {
+        exchange.getIn().setHeader(name, value);
+    }
+
+    @Override
+    public void writeBytes(byte[] bytes) throws IOException {
+        exchange.getIn().setBody(bytes);
+    }
+
+    @Override
+    public void noContent() {
+        exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 204);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestApiResponseAdapter.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestApiResponseAdapter.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestApiResponseAdapter.java
new file mode 100644
index 0000000..9a64140
--- /dev/null
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestApiResponseAdapter.java
@@ -0,0 +1,28 @@
+/**
+ * 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;
+
+import java.io.IOException;
+
+public interface RestApiResponseAdapter {
+
+    void addHeader(String name, String value);
+
+    void writeBytes(byte[] bytes) throws IOException;
+
+    void noContent();
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/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 4b3b9cd..9380d91 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
@@ -17,32 +17,23 @@
 package org.apache.camel.swagger;
 
 import java.util.Map;
-import java.util.Set;
 
 import io.swagger.jaxrs.config.BeanConfig;
-import org.apache.camel.CamelContext;
-import org.apache.camel.Component;
 import org.apache.camel.Exchange;
-import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Processor;
-import org.apache.camel.spi.RestApiResponseAdapter;
-import org.apache.camel.spi.RestApiResponseAdapterFactory;
-import org.apache.camel.support.ServiceSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class RestSwaggerProcessor extends ServiceSupport implements Processor {
+public class RestSwaggerProcessor implements Processor {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RestSwaggerProcessor.class);
     private final BeanConfig swaggerConfig;
     private final RestSwaggerSupport support;
-    private final String componentName;
 
     public RestSwaggerProcessor(Map<String, Object> parameters) {
         support = new RestSwaggerSupport();
         swaggerConfig = new BeanConfig();
         support.initSwagger(swaggerConfig, parameters);
-        componentName = (String) parameters.get("componentName");
     }
 
     @Override
@@ -51,9 +42,9 @@ public class RestSwaggerProcessor extends ServiceSupport 
implements Processor {
         String contextId;
         String route = exchange.getIn().getHeader(Exchange.HTTP_PATH, 
String.class);
 
-        try {
-            RestApiResponseAdapter adapter = lookupAdapter(exchange);
+        RestApiResponseAdapter adapter = new 
ExchangeRestApiResponseAdapter(exchange);
 
+        try {
             // render list of camel contexts as root
             if (route == null || route.equals("") || route.equals("/")) {
                 support.renderCamelContexts(adapter);
@@ -75,65 +66,4 @@ public class RestSwaggerProcessor extends ServiceSupport 
implements Processor {
         }
     }
 
-    protected RestApiResponseAdapter lookupAdapter(Exchange exchange) {
-        CamelContext camelContext = exchange.getContext();
-
-        RestApiResponseAdapterFactory factory = null;
-
-        if (componentName != null) {
-            Object comp = 
camelContext.getRegistry().lookupByName(componentName);
-            if (comp != null && comp instanceof RestApiResponseAdapterFactory) 
{
-                factory = (RestApiResponseAdapterFactory) comp;
-            } else {
-                comp = camelContext.getComponent(componentName);
-                if (comp != null && comp instanceof 
RestApiResponseAdapterFactory) {
-                    factory = (RestApiResponseAdapterFactory) comp;
-                }
-            }
-
-            if (factory == null) {
-                if (comp != null) {
-                    throw new IllegalArgumentException("Component " + 
componentName + " is not a RestApiResponseAdapterFactory");
-                } else {
-                    throw new NoSuchBeanException(componentName, 
RestApiResponseAdapterFactory.class.getName());
-                }
-            }
-        }
-
-        // try all components
-        if (factory == null) {
-            for (String name : camelContext.getComponentNames()) {
-                Component comp = camelContext.getComponent(name);
-                if (comp != null && comp instanceof 
RestApiResponseAdapterFactory) {
-                    factory = (RestApiResponseAdapterFactory) comp;
-                    break;
-                }
-            }
-        }
-
-        // lookup in registry
-        if (factory == null) {
-            Set<RestApiResponseAdapterFactory> factories = 
camelContext.getRegistry().findByType(RestApiResponseAdapterFactory.class);
-            if (factories != null && factories.size() == 1) {
-                factory = factories.iterator().next();
-            }
-        }
-
-        if (factory != null) {
-            return factory.newAdapter(exchange);
-        } else {
-            throw new IllegalStateException("Cannot find 
RestApiResponseAdapterFactory in Registry or as a Component to use");
-        }
-
-    }
-
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/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 e558ee3..5790651 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
@@ -32,11 +32,11 @@ import io.swagger.models.Contact;
 import io.swagger.models.Info;
 import io.swagger.models.License;
 import io.swagger.models.Swagger;
+import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultClassResolver;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.spi.RestApiResponseAdapter;
 import org.apache.camel.util.CamelVersionHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -183,6 +183,10 @@ public class RestSwaggerSupport {
             mapper.enable(SerializationFeature.INDENT_OUTPUT);
             mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
             byte[] bytes = mapper.writeValueAsBytes(swagger);
+
+            int len = bytes.length;
+            response.addHeader(Exchange.CONTENT_LENGTH, "" + len);
+
             response.writeBytes(bytes);
         } else {
             response.noContent();
@@ -201,16 +205,25 @@ public class RestSwaggerSupport {
             response.addHeader("Access-Control-Allow-Origin", "*");
         }
 
+        response.addHeader(Exchange.CONTENT_TYPE, "application/json");
+
+        StringBuffer sb = new StringBuffer();
+
         List<String> contexts = findCamelContexts();
-        response.writeBytes("[\n".getBytes());
+        sb.append("[\n");
         for (int i = 0; i < contexts.size(); i++) {
             String name = contexts.get(i);
-            response.writeBytes(("{\"name\": \"" + name + "\"}").getBytes());
+            sb.append("{\"name\": \"").append(name).append("\"}");
             if (i < contexts.size() - 1) {
-                response.writeBytes(",\n".getBytes());
+                sb.append(",\n");
             }
         }
-        response.writeBytes("\n]".getBytes());
+        sb.append("\n]");
+
+        int len = sb.length();
+        response.addHeader(Exchange.CONTENT_LENGTH, "" + len);
+
+        response.writeBytes(sb.toString().getBytes());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/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 3159776..a5ca00a 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
@@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import io.swagger.jaxrs.config.BeanConfig;
-import org.apache.camel.spi.RestApiResponseAdapter;
+import org.apache.camel.swagger.RestApiResponseAdapter;
 import org.apache.camel.swagger.RestSwaggerSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,11 +68,11 @@ public class RestSwaggerServlet extends HttpServlet {
             initBaseAndApiPaths(request);
         }
 
-        RestApiResponseAdapter adapter = new 
ServletRestApiResponseAdapter(response);
-
         String contextId;
         String route = request.getPathInfo();
 
+        RestApiResponseAdapter adapter = new 
ServletRestApiResponseAdapter(response);
+
         try {
 
             // render list of camel contexts as root

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/ServletRestApiResponseAdapter.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/ServletRestApiResponseAdapter.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/ServletRestApiResponseAdapter.java
index bae3aec..5c022c3 100644
--- 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/ServletRestApiResponseAdapter.java
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/ServletRestApiResponseAdapter.java
@@ -19,7 +19,7 @@ package org.apache.camel.swagger.servlet;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.camel.spi.RestApiResponseAdapter;
+import org.apache.camel.swagger.RestApiResponseAdapter;
 
 public class ServletRestApiResponseAdapter implements RestApiResponseAdapter {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/e82caac4/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestApiNettyTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestApiNettyTest.java
 
b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestApiNettyTest.java
new file mode 100644
index 0000000..6379515
--- /dev/null
+++ 
b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestApiNettyTest.java
@@ -0,0 +1,65 @@
+/**
+ * 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;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.model.rest.RestParamType;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class RestApiNettyTest extends CamelTestSupport {
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("SwaggerRestApiProcessorFactory", new 
SwaggerRestApiProcessorFactory());
+        return jndi;
+    }
+
+    @Override
+    protected boolean useJmx() {
+        return true;
+    }
+
+    @Test
+    public void testApi() throws Exception {
+        Thread.sleep(999999);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
restConfiguration().component("netty4-http").host("localhost").port(8080).apiContextPath("/api-doc");
+
+                
rest("/hello").consumes("application/json").produces("application/json")
+                    .get("/hi/{name}").description("Saying hi")
+                        
.param().name("name").type(RestParamType.path).dataType("string").description("Who
 is it").endParam()
+                        .to("log:hi")
+                    .get("/bye/{name}").description("Saying bye")
+                        
.param().name("name").type(RestParamType.path).dataType("string").description("Who
 is it").endParam()
+                        .responseMessage().code(200).message("A reply 
message").endResponseMessage()
+                        .to("log:bye")
+                    .post("/bye").description("To update the greeting 
message").consumes("application/xml").produces("application/xml")
+                        
.param().name("greeting").type(RestParamType.body).dataType("string").description("Message
 to use as greeting").endParam()
+                        .to("log:bye");
+            }
+        };
+    }
+}

Reply via email to