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 2015/09/23 11:35:38 UTC

[02/16] camel git commit: CAMEL-8545: camel-swagger-java to run outside servlet - work in progress

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

Branch: refs/heads/master
Commit: 646c9bcb2067070b9b88116dd3139af8ce3eaf00
Parents: b88093c
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Sep 22 16:48:17 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Sep 23 07:51:03 2015 +0200

----------------------------------------------------------------------
 .../camel/spi/RestApiResponseAdapter.java       |  3 +-
 .../spi/RestApiResponseAdapterFactory.java      | 34 +++++++++++
 .../netty4/http/NettyHttpComponent.java         | 14 ++++-
 .../http/NettyRestApiResponseAdapter.java       | 48 +++++++++++++++
 .../camel/swagger/RestSwaggerProcessor.java     | 62 +++++++++++++++++++-
 .../camel/swagger/RestSwaggerSupport.java       | 11 ++--
 .../swagger/SwaggerRestApiProcessorFactory.java |  3 +-
 .../servlet/ServletRestApiResponseAdapter.java  |  5 +-
 8 files changed, 165 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/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
index 3575d8d..01b1e4f 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapter.java
@@ -17,7 +17,6 @@
 package org.apache.camel.spi;
 
 import java.io.IOException;
-import java.io.OutputStream;
 
 /**
  * An adapter to allow Camel rest-api to use Camel components to render the api response.
@@ -26,7 +25,7 @@ public interface RestApiResponseAdapter {
 
     void addHeader(String name, String value);
 
-    OutputStream getOutputStream() throws IOException;
+    void writeBytes(byte[] bytes) throws IOException;
 
     void noContent();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/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
new file mode 100644
index 0000000..71bffd8
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/spi/RestApiResponseAdapterFactory.java
@@ -0,0 +1,34 @@
+/**
+ * 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/646c9bcb/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 0a4502c..d036cff 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,6 +24,7 @@ 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;
@@ -31,6 +32,8 @@ 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.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.util.FileUtil;
@@ -46,7 +49,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Netty HTTP based component.
  */
-public class NettyHttpComponent extends NettyComponent implements HeaderFilterStrategyAware, RestConsumerFactory {
+public class NettyHttpComponent extends NettyComponent implements HeaderFilterStrategyAware, RestConsumerFactory, RestApiResponseAdapterFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(NettyHttpComponent.class);
 
@@ -297,6 +300,15 @@ 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());
+        }
+        return null;
+    }
+
+    @Override
     protected void doStop() throws Exception {
         super.doStop();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/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
new file mode 100644
index 0000000..263f1e3
--- /dev/null
+++ b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyRestApiResponseAdapter.java
@@ -0,0 +1,48 @@
+/**
+ * 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/646c9bcb/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 d8b34db..4b3b9cd 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,11 +17,16 @@
 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;
@@ -31,11 +36,13 @@ public class RestSwaggerProcessor extends ServiceSupport 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
@@ -44,9 +51,8 @@ public class RestSwaggerProcessor extends ServiceSupport implements Processor {
         String contextId;
         String route = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
 
-        RestApiResponseAdapter adapter = null;
-
         try {
+            RestApiResponseAdapter adapter = lookupAdapter(exchange);
 
             // render list of camel contexts as root
             if (route == null || route.equals("") || route.equals("/")) {
@@ -69,6 +75,58 @@ 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

http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/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 ebff12f..e558ee3 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
@@ -182,7 +182,8 @@ public class RestSwaggerSupport {
             ObjectMapper mapper = new ObjectMapper();
             mapper.enable(SerializationFeature.INDENT_OUTPUT);
             mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-            mapper.writeValue(response.getOutputStream(), swagger);
+            byte[] bytes = mapper.writeValueAsBytes(swagger);
+            response.writeBytes(bytes);
         } else {
             response.noContent();
         }
@@ -201,15 +202,15 @@ public class RestSwaggerSupport {
         }
 
         List<String> contexts = findCamelContexts();
-        response.getOutputStream().write("[\n".getBytes());
+        response.writeBytes("[\n".getBytes());
         for (int i = 0; i < contexts.size(); i++) {
             String name = contexts.get(i);
-            response.getOutputStream().write(("{\"name\": \"" + name + "\"}").getBytes());
+            response.writeBytes(("{\"name\": \"" + name + "\"}").getBytes());
             if (i < contexts.size() - 1) {
-                response.getOutputStream().write(",\n".getBytes());
+                response.writeBytes(",\n".getBytes());
             }
         }
-        response.getOutputStream().write("\n]".getBytes());
+        response.writeBytes("\n]".getBytes());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/SwaggerRestApiProcessorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/SwaggerRestApiProcessorFactory.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/SwaggerRestApiProcessorFactory.java
index 436ae45..19cd1a7 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/SwaggerRestApiProcessorFactory.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/SwaggerRestApiProcessorFactory.java
@@ -26,7 +26,6 @@ public class SwaggerRestApiProcessorFactory implements RestApiProcessorFactory {
 
     @Override
     public Processor createApiProcessor(CamelContext camelContext, String contextPath, Map<String, Object> parameters) throws Exception {
-        RestSwaggerProcessor processor = new RestSwaggerProcessor(parameters);
-        return null;
+        return new RestSwaggerProcessor(parameters);
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/646c9bcb/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 499b07d..bae3aec 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
@@ -17,7 +17,6 @@
 package org.apache.camel.swagger.servlet;
 
 import java.io.IOException;
-import java.io.OutputStream;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.camel.spi.RestApiResponseAdapter;
@@ -36,8 +35,8 @@ public class ServletRestApiResponseAdapter implements RestApiResponseAdapter {
     }
 
     @Override
-    public OutputStream getOutputStream() throws IOException {
-        return response.getOutputStream();
+    public void writeBytes(byte[] bytes) throws IOException {
+        response.getOutputStream().write(bytes);
     }
 
     @Override