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 2018/12/28 11:04:08 UTC

[camel] branch master updated: CAMEL-13018: camel-swagger-java can now output swagger doc without JMX enabled for the current camel context.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new eccea3c  CAMEL-13018: camel-swagger-java can now output swagger doc without JMX enabled for the current camel context.
eccea3c is described below

commit eccea3cdb0d357dd655b10b8c220b3fc9f8afa0b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 28 12:03:55 2018 +0100

    CAMEL-13018: camel-swagger-java can now output swagger doc without JMX enabled for the current camel context.
---
 .../src/main/docs/swagger-java.adoc                |  1 +
 .../apache/camel/swagger/RestSwaggerProcessor.java |  3 +-
 .../apache/camel/swagger/RestSwaggerSupport.java   | 63 ++++++++++++++++++++--
 3 files changed, 63 insertions(+), 4 deletions(-)

diff --git a/components/camel-swagger-java/src/main/docs/swagger-java.adoc b/components/camel-swagger-java/src/main/docs/swagger-java.adoc
index 02dbe61..f2c9462 100644
--- a/components/camel-swagger-java/src/main/docs/swagger-java.adoc
+++ b/components/camel-swagger-java/src/main/docs/swagger-java.adoc
@@ -22,6 +22,7 @@ their `pom.xml` for this component:
 The camel-swagger-java module can be used from
 the REST components (without the need for servlet)
 
+NOTE: The camel-swagger-java component requires JMX enabled when using Camel 2.x.
 
 === Using Swagger in rest-dsl
 
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 988ec8f..f9c4e53 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
@@ -116,7 +116,8 @@ public class RestSwaggerProcessor implements Processor {
                 if (!match) {
                     adapter.noContent();
                 } else {
-                    support.renderResourceListing(adapter, swaggerConfig, name, route, json, yaml, exchange.getIn().getHeaders(), exchange.getContext().getClassResolver(), configuration);
+                    support.renderResourceListing(exchange.getContext(), adapter, swaggerConfig, name, route, json, yaml,
+                        exchange.getIn().getHeaders(), exchange.getContext().getClassResolver(), configuration);
                 }
             }
         } catch (Exception e) {
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 1996feb..1100e44 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
@@ -16,17 +16,23 @@
  */
 package org.apache.camel.swagger;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.lang.management.ManagementFactory;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import javax.management.AttributeNotFoundException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.w3c.dom.Document;
+
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -38,7 +44,9 @@ import io.swagger.models.License;
 import io.swagger.models.Scheme;
 import io.swagger.models.Swagger;
 import io.swagger.util.Yaml;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
@@ -48,6 +56,7 @@ import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.util.CamelVersionHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.URISupport;
+import org.apache.camel.util.XmlLineNumberParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -134,6 +143,48 @@ public class RestSwaggerSupport {
         swaggerConfig.setInfo(info);
     }
 
+    public List<RestDefinition> getRestDefinitions(CamelContext camelContext) throws Exception {
+        ModelCamelContext context = camelContext.adapt(ModelCamelContext.class);
+        List<RestDefinition> rests = context.getRestDefinitions();
+        if (rests.isEmpty()) {
+            return null;
+        }
+
+        // use a routes definition to dump the rests
+        RestsDefinition def = new RestsDefinition();
+        def.setRests(rests);
+        String xml = ModelHelper.dumpModelAsXml(context, def);
+
+        // if resolving placeholders we parse the xml, and resolve the property placeholders during parsing
+        final AtomicBoolean changed = new AtomicBoolean();
+        InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
+        Document dom = XmlLineNumberParser.parseXml(is, new XmlLineNumberParser.XmlTextTransformer() {
+            @Override
+            public String transform(String text) {
+                try {
+                    String after = context.resolvePropertyPlaceholders(text);
+                    if (!changed.get()) {
+                        changed.set(!text.equals(after));
+                    }
+                    return after;
+                } catch (Exception e) {
+                    // ignore
+                    return text;
+                }
+            }
+        });
+        // okay there were some property placeholder replaced so re-create the model
+        if (changed.get()) {
+            xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom);
+            RestsDefinition model = ModelHelper.createModelFromXml(context, xml, RestsDefinition.class);
+            if (model != null) {
+                return model.getRests();
+            }
+        }
+
+        return rests;
+    }
+
     public List<RestDefinition> getRestDefinitions(String camelId) throws Exception {
         ObjectName found = null;
         boolean supportResolvePlaceholder = false;
@@ -201,15 +252,21 @@ public class RestSwaggerSupport {
         return answer;
     }
 
-    public void renderResourceListing(RestApiResponseAdapter response, BeanConfig swaggerConfig, String contextId, String route, boolean json, boolean yaml,
-            Map<String, Object> headers, ClassResolver classResolver, RestConfiguration configuration) throws Exception {
+    public void renderResourceListing(CamelContext camelContext, RestApiResponseAdapter response, BeanConfig swaggerConfig, String contextId, String route, boolean json, boolean yaml,
+                                      Map<String, Object> headers, ClassResolver classResolver, RestConfiguration configuration) throws Exception {
         LOG.trace("renderResourceListing");
 
         if (cors) {
             setupCorsHeaders(response, configuration.getCorsHeaders());
         }
 
-        List<RestDefinition> rests = getRestDefinitions(contextId);
+        List<RestDefinition> rests = null;
+        if (camelContext != null && camelContext.getName().equals(contextId)) {
+            rests = getRestDefinitions(camelContext);
+        } else {
+            rests = getRestDefinitions(contextId);
+        }
+
         if (rests != null) {
             final Map<String, Object> apiProperties = configuration.getApiProperties() != null ? configuration.getApiProperties() : new HashMap<>();
             if (json) {