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

Reply via email to