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) {