Repository: camel Updated Branches: refs/heads/master 6ca72e1d8 -> 55d675b94
CAMEL-9156: Adding Camel commands for rest api docs Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/da022e78 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/da022e78 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/da022e78 Branch: refs/heads/master Commit: da022e7861a21cf4800fad3c98473090dc762db2 Parents: 6ca72e1 Author: Claus Ibsen <[email protected]> Authored: Thu Sep 24 15:10:22 2015 +0200 Committer: Claus Ibsen <[email protected]> Committed: Thu Sep 24 15:11:00 2015 +0200 ---------------------------------------------------------------------- .../apache/camel/impl/DefaultRestRegistry.java | 62 ++++++++++++++++++++ .../management/mbean/ManagedRestRegistry.java | 58 +----------------- .../java/org/apache/camel/spi/RestRegistry.java | 7 +++ .../commands/AbstractLocalCamelController.java | 9 +++ .../apache/camel/commands/CamelController.java | 9 +++ .../camel/commands/RestApiDocCommand.java | 42 +++++++++++++ .../jolokia/DefaultJolokiaCamelController.java | 21 +++++++ .../commands/jolokia/JolokiaRemoteTest.java | 9 +++ 8 files changed, 160 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/camel-core/src/main/java/org/apache/camel/impl/DefaultRestRegistry.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultRestRegistry.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultRestRegistry.java index f36d505..250566d 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/DefaultRestRegistry.java +++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultRestRegistry.java @@ -24,11 +24,17 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.Consumer; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Producer; import org.apache.camel.Route; import org.apache.camel.Service; import org.apache.camel.ServiceStatus; import org.apache.camel.StatefulService; import org.apache.camel.StaticService; +import org.apache.camel.component.rest.RestApiEndpoint; +import org.apache.camel.component.rest.RestEndpoint; +import org.apache.camel.spi.RestConfiguration; import org.apache.camel.spi.RestRegistry; import org.apache.camel.support.LifecycleStrategySupport; import org.apache.camel.support.ServiceSupport; @@ -38,6 +44,7 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService private CamelContext camelContext; private final Map<Consumer, RestService> registry = new LinkedHashMap<Consumer, RestService>(); + private transient Producer apiProducer; public void addRestService(Consumer consumer, String url, String baseUrl, String basePath, String uriTemplate, String method, String consumes, String produces, String inType, String outType, String routeId, String description) { @@ -59,6 +66,61 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService return registry.size(); } + @Override + public String apiDocAsJson() { + // see if there is a rest-api endpoint which would be the case if rest api-doc has been explicit enabled + if (apiProducer == null) { + Endpoint restApiEndpoint = null; + Endpoint restEndpoint = null; + for (Map.Entry<String, Endpoint> entry : camelContext.getEndpointMap().entrySet()) { + String uri = entry.getKey(); + if (uri.startsWith("rest-api:")) { + restApiEndpoint = entry.getValue(); + break; + } else if (restEndpoint == null && uri.startsWith("rest:")) { + restEndpoint = entry.getValue(); + } + } + + if (restApiEndpoint == null && restEndpoint != null) { + // no rest-api has been explicit enabled, then we need to create it first + RestEndpoint rest = (RestEndpoint) restEndpoint; + String componentName = rest.getComponentName(); + + if (componentName != null) { + RestConfiguration config = camelContext.getRestConfiguration(componentName, true); + String apiComponent = config.getApiComponent() != null ? config.getApiComponent() : RestApiEndpoint.DEFAULT_API_COMPONENT_NAME; + String path = config.getApiContextPath() != null ? config.getApiContextPath() : "api-doc"; + restApiEndpoint = camelContext.getEndpoint(String.format("rest-api:%s/%s?componentName=%s&apiComponentName=%s&contextIdPattern=#name#", path, camelContext.getName(), componentName, apiComponent)); + } + } + + if (restApiEndpoint != null) { + // reuse the producer to avoid creating it + try { + apiProducer = restApiEndpoint.createProducer(); + camelContext.addService(apiProducer, true); + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + } + } + + if (apiProducer != null) { + try { + Exchange dummy = apiProducer.getEndpoint().createExchange(); + apiProducer.process(dummy); + + String json = dummy.hasOut() ? dummy.getOut().getBody(String.class) : dummy.getIn().getBody(String.class); + return json; + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + } + + return null; + } + public CamelContext getCamelContext() { return camelContext; } http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java index 3299b02..c057436 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java @@ -17,7 +17,6 @@ package org.apache.camel.management.mbean; import java.util.List; -import java.util.Map; import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeType; @@ -25,15 +24,10 @@ import javax.management.openmbean.TabularData; import javax.management.openmbean.TabularDataSupport; import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; import org.apache.camel.Producer; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes; import org.apache.camel.api.management.mbean.ManagedRestRegistryMBean; -import org.apache.camel.component.rest.RestApiEndpoint; -import org.apache.camel.component.rest.RestEndpoint; -import org.apache.camel.spi.RestConfiguration; import org.apache.camel.spi.RestRegistry; import org.apache.camel.util.ObjectHelper; @@ -93,57 +87,7 @@ public class ManagedRestRegistry extends ManagedService implements ManagedRestRe @Override public String apiDocAsJson() { - // see if there is a rest-api endpoint which would be the case if rest api-doc has been explicit enabled - if (apiProducer == null) { - Endpoint restApiEndpoint = null; - Endpoint restEndpoint = null; - for (Map.Entry<String, Endpoint> entry : getContext().getEndpointMap().entrySet()) { - String uri = entry.getKey(); - if (uri.startsWith("rest-api:")) { - restApiEndpoint = entry.getValue(); - break; - } else if (restEndpoint == null && uri.startsWith("rest:")) { - restEndpoint = entry.getValue(); - } - } - - if (restApiEndpoint == null && restEndpoint != null) { - // no rest-api has been explicit enabled, then we need to create it first - RestEndpoint rest = (RestEndpoint) restEndpoint; - String componentName = rest.getComponentName(); - - if (componentName != null) { - RestConfiguration config = getContext().getRestConfiguration(componentName, true); - String apiComponent = config.getApiComponent() != null ? config.getApiComponent() : RestApiEndpoint.DEFAULT_API_COMPONENT_NAME; - String path = config.getApiContextPath() != null ? config.getApiContextPath() : "api-doc"; - restApiEndpoint = getContext().getEndpoint(String.format("rest-api:%s/%s?componentName=%s&apiComponentName=%s&contextIdPattern=#name#", path, getCamelId(), componentName, apiComponent)); - } - } - - if (restApiEndpoint != null) { - // reuse the producer to avoid creating it - try { - apiProducer = restApiEndpoint.createProducer(); - getContext().addService(apiProducer, true); - } catch (Exception e) { - throw ObjectHelper.wrapRuntimeCamelException(e); - } - } - } - - if (apiProducer != null) { - try { - Exchange dummy = apiProducer.getEndpoint().createExchange(); - apiProducer.process(dummy); - - String json = dummy.hasOut() ? dummy.getOut().getBody(String.class) : dummy.getIn().getBody(String.class); - return json; - } catch (Exception e) { - throw ObjectHelper.wrapRuntimeCamelException(e); - } - } - - return null; + return registry.apiDocAsJson(); } } http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/camel-core/src/main/java/org/apache/camel/spi/RestRegistry.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/spi/RestRegistry.java b/camel-core/src/main/java/org/apache/camel/spi/RestRegistry.java index c307383..fb8f547 100644 --- a/camel-core/src/main/java/org/apache/camel/spi/RestRegistry.java +++ b/camel-core/src/main/java/org/apache/camel/spi/RestRegistry.java @@ -143,4 +143,11 @@ public interface RestRegistry extends Service { */ int size(); + /** + * Outputs the Rest services API documentation in JSon (requires camel-swagger-java on classpath) + * + * @return the API docs in JSon, or <tt>null</tt> if camel-swagger-java is not on classpath + */ + String apiDocAsJson(); + } http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java ---------------------------------------------------------------------- diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java index ec1b997..2fd62f0 100644 --- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java +++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java @@ -404,6 +404,15 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll return ModelHelper.dumpModelAsXml(null, def); } + public String getRestApiDocAsJson(String camelContextName) throws Exception { + CamelContext context = this.getLocalCamelContext(camelContextName); + if (context == null) { + return null; + } + + return context.getRestRegistry().apiDocsAsJson(); + } + public List<Map<String, String>> getEndpoints(String camelContextName) throws Exception { List<Map<String, String>> answer = new ArrayList<Map<String, String>>(); http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java ---------------------------------------------------------------------- diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java index dd807b4..b9fbcd1 100644 --- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java +++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java @@ -218,6 +218,15 @@ public interface CamelController { String getRestModelAsXml(String camelContextName) throws Exception; /** + * Return the REST services API documentation as JSon (requires camel-swagger-java on classpath) + * + * @param camelContextName the Camel context. + * @return the REST API documentation as JSon + * @throws java.lang.Exception can be thrown + */ + String getRestApiDocAsJson(String camelContextName) throws Exception; + + /** * Return the REST services for the given Camel context. * * @param camelContextName the Camel context. http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RestApiDocCommand.java ---------------------------------------------------------------------- diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RestApiDocCommand.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RestApiDocCommand.java new file mode 100644 index 0000000..99bf16b --- /dev/null +++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RestApiDocCommand.java @@ -0,0 +1,42 @@ +/** + * 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.commands; + +import java.io.PrintStream; + +/** + * List the Camel REST services API documentation (requires camel-swagger-java on classpath) + */ +public class RestApiDocCommand extends AbstractContextCommand { + + public RestApiDocCommand(String context) { + super(context); + } + + @Override + protected Object performContextCommand(CamelController camelController, String contextName, PrintStream out, PrintStream err) throws Exception { + String json = camelController.getRestApiDocAsJson(contextName); + if (json != null) { + out.print(json); + } else { + out.print("There are no REST services"); + } + + return null; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java ---------------------------------------------------------------------- diff --git a/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java b/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java index 7608f6b..6404fa2 100644 --- a/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java +++ b/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java @@ -510,6 +510,27 @@ public class DefaultJolokiaCamelController extends AbstractCamelController imple } @Override + public String getRestApiDocAsJson(String camelContextName) throws Exception { + if (jolokia == null) { + throw new IllegalStateException("Need to connect to remote jolokia first"); + } + + ObjectName found = lookupCamelContext(camelContextName); + if (found != null) { + String pattern = String.format("%s:context=%s,type=services,name=DefaultRestRegistry", found.getDomain(), found.getKeyProperty("context")); + ObjectName on = ObjectName.getInstance(pattern); + + J4pExecResponse response = jolokia.execute(new J4pExecRequest(on, "apiDocAsJson()")); + if (response != null) { + String json = response.getValue(); + return json; + } + } + + return null; + } + + @Override public List<Map<String, String>> getEndpoints(String camelContextName) throws Exception { if (jolokia == null) { throw new IllegalStateException("Need to connect to remote jolokia first"); http://git-wip-us.apache.org/repos/asf/camel/blob/da022e78/platforms/commands/commands-jolokia/src/test/java/org/apache/camel/commands/jolokia/JolokiaRemoteTest.java ---------------------------------------------------------------------- diff --git a/platforms/commands/commands-jolokia/src/test/java/org/apache/camel/commands/jolokia/JolokiaRemoteTest.java b/platforms/commands/commands-jolokia/src/test/java/org/apache/camel/commands/jolokia/JolokiaRemoteTest.java index 5165008..2b41add 100644 --- a/platforms/commands/commands-jolokia/src/test/java/org/apache/camel/commands/jolokia/JolokiaRemoteTest.java +++ b/platforms/commands/commands-jolokia/src/test/java/org/apache/camel/commands/jolokia/JolokiaRemoteTest.java @@ -160,6 +160,15 @@ public class JolokiaRemoteTest { } @Test + public void testRestsApiDoc() throws Exception { + controller = new DefaultJolokiaCamelController(); + controller.connect(url, null, null); + + String data = controller.getRestApiDocAsJson("camel-1"); + System.out.println(data); + } + + @Test public void testGetEndpoints() throws Exception { controller = new DefaultJolokiaCamelController(); controller.connect(url, null, null);
