CAMEL-8025: Added JMX api to provide component details.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6c37f22c Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6c37f22c Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6c37f22c Branch: refs/heads/master Commit: 6c37f22c0d87601868dc1f7fcac40c8b35f5d521 Parents: 1a205e4 Author: Claus Ibsen <davscl...@apache.org> Authored: Mon Nov 10 12:04:02 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon Nov 10 14:51:12 2014 +0100 ---------------------------------------------------------------------- .../management/mbean/CamelOpenMBeanTypes.java | 12 ++++ .../mbean/ManagedCamelContextMBean.java | 11 ++++ .../management/mbean/ManagedCamelContext.java | 58 +++++++++++++++++ .../management/ManagedListComponentsTest.java | 65 ++++++++++++++++++++ 4 files changed, 146 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/6c37f22c/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java index da19b08..d076c1c 100644 --- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java @@ -75,4 +75,16 @@ public final class CamelOpenMBeanTypes { new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}); } + public static TabularType listComponentsTabularType() throws OpenDataException { + CompositeType ct = listComponentsCompositeType(); + return new TabularType("listComponents", "Lists all the components in the registry", ct, new String[]{"name", "description", "state", "type", "groupId", "artifactId", "version"}); + } + + public static CompositeType listComponentsCompositeType() throws OpenDataException { + return new CompositeType("name", "Components", new String[]{"name", "description", "status", "type", "groupId", "artifactId", "version"}, + new String[]{"Name", "Description", "Status", "Type", "GroupId", "ArtifactId", "Version"}, + new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}); + } + + } http://git-wip-us.apache.org/repos/asf/camel/blob/6c37f22c/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java index f6fb6de..e82dcac 100644 --- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.Properties; import java.util.concurrent.TimeUnit; +import javax.management.openmbean.TabularData; + import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedOperation; @@ -222,6 +224,15 @@ public interface ManagedCamelContextMBean extends ManagedPerformanceCounterMBean List<String> findComponentNames() throws Exception; /** + * Find information about all the Camel components available in the classpath and {@link org.apache.camel.spi.Registry}. + * + * @return a list with the data + * @throws Exception is thrown if error occurred + */ + @ManagedOperation(description = "List all Camel components available in the classpath") + TabularData listComponents() throws Exception; + + /** * Returns the JSON schema representation of the endpoint parameters for the given component name * * @param componentName the name of the component to lookup http://git-wip-us.apache.org/repos/asf/camel/blob/6c37f22c/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java index a0fe26b..b9f0023 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java @@ -30,6 +30,11 @@ import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; import org.apache.camel.CamelContext; import org.apache.camel.Component; @@ -41,6 +46,7 @@ import org.apache.camel.ProducerTemplate; import org.apache.camel.Route; import org.apache.camel.TimerListener; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes; import org.apache.camel.api.management.mbean.ManagedCamelContextMBean; import org.apache.camel.api.management.mbean.ManagedProcessorMBean; import org.apache.camel.api.management.mbean.ManagedRouteMBean; @@ -50,6 +56,8 @@ import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.rest.RestsDefinition; +import org.apache.camel.util.JsonSchemaHelper; +import org.apache.camel.util.ObjectHelper; /** * @version @@ -474,6 +482,56 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti return new ArrayList<String>(map.keySet()); } + @Override + public TabularData listComponents() throws Exception { + try { + // find all components + Map<String, Properties> components = context.findComponents(); + + TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.listComponentsTabularType()); + + // gather component detail for each component + for (Map.Entry<String, Properties> entry : components.entrySet()) { + String name = entry.getKey(); + String description = null; + // the status can be: + // - loaded = in use + // - classpath = on the classpath + // - release = available from the Apache Camel release + String status = context.hasComponent(name) != null ? "loaded" : "classpath"; + String type = null; + String groupId = null; + String artifactId = null; + String version = null; + + // load component json data, and parse it to gather the component meta-data + String json = context.getComponentParameterJsonSchema(name); + List<Map<String, String>> rows = JsonSchemaHelper.parseJsonSchema("component", json, false); + for (Map<String, String> row : rows) { + if (row.containsKey("description")) { + description = row.get("description"); + } else if (row.containsKey("javaType")) { + type = row.get("javaType"); + } else if (row.containsKey("groupId")) { + groupId = row.get("groupId"); + } else if (row.containsKey("artifactId")) { + artifactId = row.get("artifactId"); + } else if (row.containsKey("version")) { + version = row.get("version"); + } + } + + CompositeType ct = CamelOpenMBeanTypes.listComponentsCompositeType(); + CompositeData data = new CompositeDataSupport(ct, new String[]{"name", "description", "status", "type", "groupId", "artifactId", "version"}, + new Object[]{name, description, status, type, groupId, artifactId, version}); + answer.put(data); + } + return answer; + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + } + public List<String> completeEndpointPath(String componentName, Map<String, Object> endpointParameters, String completionText) throws Exception { if (completionText == null) { http://git-wip-us.apache.org/repos/asf/camel/blob/6c37f22c/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java new file mode 100644 index 0000000..babd326 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java @@ -0,0 +1,65 @@ +/** + * 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.management; + +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.openmbean.TabularData; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; + +/** + * @version + */ +public class ManagedListComponentsTest extends ManagementTestSupport { + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + // to force a different management name than the camel id + context.getManagementNameStrategy().setNamePattern("20-#name#"); + return context; + } + + public void testListComponents() throws Exception { + // JMX tests dont work well on AIX CI servers (hangs them) + if (isPlatform("aix")) { + return; + } + + MBeanServer mbeanServer = getMBeanServer(); + ObjectName on = ObjectName.getInstance("org.apache.camel:context=20-camel-1,type=context,name=\"camel-1\""); + + // list all components found in classpath + TabularData data = (TabularData) mbeanServer.invoke(on, "listComponents", null, null); + assertEquals(23, data.size()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .to("log:foo") + .to("mock:result"); + } + }; + } + +} \ No newline at end of file