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:50 UTC

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

Branch: refs/heads/master
Commit: f3aed3eb1ea9fce9dff9adf70ba6a5e4fd08986e
Parents: d975acd
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Sep 23 11:17:41 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Sep 23 11:17:41 2015 +0200

----------------------------------------------------------------------
 .../camel/component/rest/RestApiEndpoint.java   | 17 +++++++--
 .../model/rest/RestConfigurationDefinition.java | 37 ++++++++++++++++++++
 .../apache/camel/model/rest/RestDefinition.java |  3 ++
 .../camel/spi/RestApiProcessorFactory.java      | 10 +++---
 .../org/apache/camel/spi/RestConfiguration.java | 17 +++++++++
 .../rest/DummyRestProcessorFactory.java         |  3 +-
 .../camel/swagger/RestSwaggerProcessor.java     | 26 +++++++++++---
 .../camel/swagger/RestSwaggerSupport.java       | 15 +++++++-
 .../swagger/SwaggerRestApiProcessorFactory.java |  4 +--
 .../swagger/servlet/RestSwaggerServlet.java     |  2 +-
 .../camel/example/cdi/UserRouteBuilder.java     |  6 ++--
 11 files changed, 120 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
index e6df668..a5e7276 100644
--- a/camel-core/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
@@ -33,7 +33,7 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 
-@UriEndpoint(scheme = "rest-api", title = "REST API", syntax = "rest-api:path", consumerOnly = true, label = "core,rest")
+@UriEndpoint(scheme = "rest-api", title = "REST API", syntax = "rest-api:path/contextId", consumerOnly = true, label = "core,rest")
 public class RestApiEndpoint extends DefaultEndpoint {
 
     public static final String DEFAULT_API_COMPONENT_NAME = "swagger";
@@ -41,6 +41,8 @@ public class RestApiEndpoint extends DefaultEndpoint {
 
     @UriPath @Metadata(required = "true")
     private String path;
+    @UriPath
+    private String contextIdPattern;
     @UriParam
     private String componentName;
     @UriParam
@@ -68,6 +70,17 @@ public class RestApiEndpoint extends DefaultEndpoint {
         this.path = path;
     }
 
+    public String getContextIdPattern() {
+        return contextIdPattern;
+    }
+
+    /**
+     * Optional CamelContext id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
+     */
+    public void setContextIdPattern(String contextIdPattern) {
+        this.contextIdPattern = contextIdPattern;
+    }
+
     public String getComponentName() {
         return componentName;
     }
@@ -134,7 +147,7 @@ public class RestApiEndpoint extends DefaultEndpoint {
                 path = "/" + path;
             }
 
-            Processor processor = factory.createApiProcessor(getCamelContext(), path, config, getParameters());
+            Processor processor = factory.createApiProcessor(getCamelContext(), path, getContextIdPattern(), config, getParameters());
             return new RestApiProducer(this, processor);
         } else {
             throw new IllegalStateException("Cannot find RestApiProcessorFactory in Registry or classpath");

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java b/camel-core/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
index 90a6138..0467f21 100644
--- a/camel-core/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
@@ -61,6 +61,9 @@ public class RestConfigurationDefinition {
     private String apiContextPath;
 
     @XmlAttribute
+    private String apiContextIdPattern;
+
+    @XmlAttribute
     private RestHostNameResolver hostNameResolver;
 
     @XmlAttribute @Metadata(defaultValue = "auto")
@@ -190,6 +193,22 @@ public class RestConfigurationDefinition {
         this.apiContextPath = contextPath;
     }
 
+    public String getApiContextIdPattern() {
+        return apiContextIdPattern;
+    }
+
+    /**
+     * Sets an CamelContext id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
+     * <p/>
+     * The pattern <tt>#name#</tt> refers to the CamelContext name, to match on the current CamelContext only.
+     * For any other value, the pattern uses the rules from {@link org.apache.camel.util.EndpointHelper#matchPattern(String, String)}
+     *
+     * @param apiContextIdPattern  the pattern
+     */
+    public void setApiContextIdPattern(String apiContextIdPattern) {
+        this.apiContextIdPattern = apiContextIdPattern;
+    }
+
     public RestHostNameResolver getHostNameResolver() {
         return hostNameResolver;
     }
@@ -406,6 +425,16 @@ public class RestConfigurationDefinition {
     }
 
     /**
+     * Sets an CamelContext id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
+     * <p/>
+     * The pattern uses the rules from {@link org.apache.camel.util.EndpointHelper#matchPattern(String, String)}
+     */
+    public RestConfigurationDefinition apiContextIdPattern(String pattern) {
+        setApiContextIdPattern(pattern);
+        return this;
+    }
+
+    /**
      * Sets a leading context-path the REST services will be using.
      * <p/>
      * This can be used when using components such as <tt>camel-servlet</tt> where the deployed web application
@@ -568,6 +597,14 @@ public class RestConfigurationDefinition {
         if (apiContextPath != null) {
             answer.setApiContextPath(CamelContextHelper.parseText(context, apiContextPath));
         }
+        if (apiContextIdPattern != null) {
+            // special to allow #name# to refer to itself
+            if ("#name#".equals(apiComponent)) {
+                answer.setApiContextIdPattern(context.getName());
+            } else {
+                answer.setApiContextIdPattern(CamelContextHelper.parseText(context, apiContextIdPattern));
+            }
+        }
         if (contextPath != null) {
             answer.setContextPath(CamelContextHelper.parseText(context, contextPath));
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java b/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
index c004af7..e2b1895 100644
--- a/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
@@ -554,6 +554,9 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
         if (configuration.getComponent() != null && !configuration.getComponent().isEmpty()) {
             options.put("componentName", configuration.getComponent());
         }
+        if (configuration.getApiContextIdPattern() != null) {
+            options.put("contextIdPattern", configuration.getApiContextIdPattern());
+        }
 
         if (!options.isEmpty()) {
             String query;

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/main/java/org/apache/camel/spi/RestApiProcessorFactory.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/spi/RestApiProcessorFactory.java b/camel-core/src/main/java/org/apache/camel/spi/RestApiProcessorFactory.java
index a721ec5..8f5210d 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RestApiProcessorFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RestApiProcessorFactory.java
@@ -28,14 +28,14 @@ public interface RestApiProcessorFactory {
      * href="http://camel.apache.org/processor.html">Processor
      * </a>, which provides API listing of the REST services
      *
-     * @param camelContext the camel context
-     * @param contextPath  the context-path
-     * @param parameters   additional parameters
-     *
+     * @param camelContext      the camel context
+     * @param contextPath       the context-path
+     * @param contextIdPattern  id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
+     * @param parameters        additional parameters
      * @return a newly created REST API provider
      * @throws Exception can be thrown
      */
-    Processor createApiProcessor(CamelContext camelContext, String contextPath,
+    Processor createApiProcessor(CamelContext camelContext, String contextPath, String contextIdPattern,
                                  RestConfiguration configuration, Map<String, Object> parameters) throws Exception;
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/main/java/org/apache/camel/spi/RestConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/spi/RestConfiguration.java b/camel-core/src/main/java/org/apache/camel/spi/RestConfiguration.java
index 55a45d6..c8cbcff 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RestConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RestConfiguration.java
@@ -44,6 +44,7 @@ public class RestConfiguration {
     private int port;
     private String contextPath;
     private String apiContextPath;
+    private String apiContextIdPattern;
     private RestHostNameResolver restHostNameResolver = RestHostNameResolver.localHostName;
     private RestBindingMode bindingMode = RestBindingMode.off;
     private boolean skipBindingOnErrorCode = true;
@@ -184,6 +185,22 @@ public class RestConfiguration {
         this.apiContextPath = contextPath;
     }
 
+    public String getApiContextIdPattern() {
+        return apiContextIdPattern;
+    }
+
+    /**
+     * Optional CamelContext id pattern to only allow Rest APIs from rest services within CamelContext's which name matches the pattern.
+     * <p/>
+     * The pattern <tt>#name#</tt> refers to the CamelContext name, to match on the current CamelContext only.
+     * For any other value, the pattern uses the rules from {@link org.apache.camel.util.EndpointHelper#matchPattern(String, String)}
+     *
+     * @param apiContextIdPattern  the pattern
+     */
+    public void setApiContextIdPattern(String apiContextIdPattern) {
+        this.apiContextIdPattern = apiContextIdPattern;
+    }
+
     /**
      * Gets the resolver to use for resolving hostname
      *

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/camel-core/src/test/java/org/apache/camel/component/rest/DummyRestProcessorFactory.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/rest/DummyRestProcessorFactory.java b/camel-core/src/test/java/org/apache/camel/component/rest/DummyRestProcessorFactory.java
index 1fbe87f..f2d2948 100644
--- a/camel-core/src/test/java/org/apache/camel/component/rest/DummyRestProcessorFactory.java
+++ b/camel-core/src/test/java/org/apache/camel/component/rest/DummyRestProcessorFactory.java
@@ -27,7 +27,8 @@ import org.apache.camel.spi.RestConfiguration;
 public class DummyRestProcessorFactory implements RestApiProcessorFactory {
 
     @Override
-    public Processor createApiProcessor(CamelContext camelContext, String contextPath, RestConfiguration configuration, Map<String, Object> parameters) throws Exception {
+    public Processor createApiProcessor(CamelContext camelContext, String contextPath, String contextIdPattern,
+                                        RestConfiguration configuration, Map<String, Object> parameters) throws Exception {
         return new Processor() {
             @Override
             public void process(Exchange exchange) throws Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/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 f2752a6..58d3205 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
@@ -22,6 +22,7 @@ import java.util.Map;
 import io.swagger.jaxrs.config.BeanConfig;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.util.EndpointHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,11 +31,14 @@ 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 contextIdPattern;
 
     @SuppressWarnings("unchecked")
-    public RestSwaggerProcessor(Map<String, Object> parameters) {
-        support = new RestSwaggerSupport();
-        swaggerConfig = new BeanConfig();
+    public RestSwaggerProcessor(String contextIdPattern, Map<String, Object> parameters) {
+        this.contextIdPattern = contextIdPattern;
+        this.support = new RestSwaggerSupport();
+        this.swaggerConfig = new BeanConfig();
+
         if (parameters == null) {
             parameters = Collections.EMPTY_MAP;
         }
@@ -52,7 +56,7 @@ public class RestSwaggerProcessor implements Processor {
         try {
             // render list of camel contexts as root
             if (route == null || route.equals("") || route.equals("/")) {
-                support.renderCamelContexts(adapter);
+                support.renderCamelContexts(adapter, contextIdPattern);
             } else {
                 // first part is the camel context
                 if (route.startsWith("/")) {
@@ -64,7 +68,19 @@ public class RestSwaggerProcessor implements Processor {
                     route = route.substring(contextId.length());
                 }
 
-                support.renderResourceListing(adapter, swaggerConfig, contextId, route);
+                boolean match = true;
+                if (contextIdPattern != null) {
+                    match = EndpointHelper.matchPattern(contextId, contextIdPattern);
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Match contextId: {} with pattern: {} -> {}", new Object[]{contextId, contextIdPattern, match});
+                    }
+                }
+
+                if (!match) {
+                    adapter.noContent();
+                } else {
+                    support.renderResourceListing(adapter, swaggerConfig, contextId, route);
+                }
             }
         } catch (Exception e) {
             LOG.warn("Error rendering Swagger API due " + e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/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 4e228a8..5e9513d 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
@@ -18,6 +18,7 @@ package org.apache.camel.swagger;
 
 import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -38,6 +39,7 @@ import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.util.CamelVersionHelper;
+import org.apache.camel.util.EndpointHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -196,7 +198,7 @@ public class RestSwaggerSupport {
     /**
      * Renders a list of available CamelContexts in the JVM
      */
-    public void renderCamelContexts(RestApiResponseAdapter response) throws Exception {
+    public void renderCamelContexts(RestApiResponseAdapter response, String contextIdPattern) throws Exception {
         LOG.trace("renderCamelContexts");
 
         if (cors) {
@@ -210,6 +212,17 @@ public class RestSwaggerSupport {
         StringBuffer sb = new StringBuffer();
 
         List<String> contexts = findCamelContexts();
+
+        // filter non matched CamelContext's
+        Iterator<String> it = contexts.iterator();
+        while (it.hasNext()) {
+            String name = it.next();
+            boolean match = EndpointHelper.matchPattern(name, contextIdPattern);
+            if (!match) {
+                it.remove();
+            }
+        }
+
         sb.append("[\n");
         for (int i = 0; i < contexts.size(); i++) {
             String name = contexts.get(i);

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/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 faba694..be70c60 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,8 +26,8 @@ import org.apache.camel.spi.RestConfiguration;
 public class SwaggerRestApiProcessorFactory implements RestApiProcessorFactory {
 
     @Override
-    public Processor createApiProcessor(CamelContext camelContext, String contextPath,
+    public Processor createApiProcessor(CamelContext camelContext, String contextPath, String contextIdPattern,
                                         RestConfiguration configuration, Map<String, Object> parameters) throws Exception {
-        return new RestSwaggerProcessor(configuration.getApiProperties());
+        return new RestSwaggerProcessor(contextIdPattern, configuration.getApiProperties());
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/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 a5ca00a..a1381ce 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
@@ -77,7 +77,7 @@ public class RestSwaggerServlet extends HttpServlet {
 
             // render list of camel contexts as root
             if (route == null || route.equals("") || route.equals("/")) {
-                swagger.renderCamelContexts(adapter);
+                swagger.renderCamelContexts(adapter, null);
             } else {
                 // first part is the camel context
                 if (route.startsWith("/")) {

http://git-wip-us.apache.org/repos/asf/camel/blob/f3aed3eb/examples/camel-example-swagger-cdi/src/main/java/org/apache/camel/example/cdi/UserRouteBuilder.java
----------------------------------------------------------------------
diff --git a/examples/camel-example-swagger-cdi/src/main/java/org/apache/camel/example/cdi/UserRouteBuilder.java b/examples/camel-example-swagger-cdi/src/main/java/org/apache/camel/example/cdi/UserRouteBuilder.java
index 6061ad0..c7657d9 100644
--- a/examples/camel-example-swagger-cdi/src/main/java/org/apache/camel/example/cdi/UserRouteBuilder.java
+++ b/examples/camel-example-swagger-cdi/src/main/java/org/apache/camel/example/cdi/UserRouteBuilder.java
@@ -26,7 +26,7 @@ import static org.apache.camel.model.rest.RestParamType.path;
 /**
  * Define REST services using the Camel REST DSL
  */
-@ContextName
+@ContextName("myCamel")
 public class UserRouteBuilder extends RouteBuilder {
 
     @Override
@@ -39,8 +39,8 @@ public class UserRouteBuilder extends RouteBuilder {
             .dataFormatProperty("prettyPrint", "true")
             // setup context path and port number that netty will use
             .contextPath("/rest").port(8080)
-            // add swagger api-doc out of the box
-            .apiContextPath("/api-doc")
+            // add swagger api-doc out of the box, and only allow to docs for this CamelContext
+            .apiContextPath("/api-doc").apiContextIdPattern("#name#")
                 .apiProperty("api.title", "User API").apiProperty("api.version", "1.2.3")
                 // and enable CORS
                 .apiProperty("cors", "true");