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/1a205e44
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1a205e44
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1a205e44

Branch: refs/heads/master
Commit: 1a205e444d3bbb47b34ee70044eaeb3cda5b3d42
Parents: 62151db
Author: Claus Ibsen <davscl...@apache.org>
Authored: Mon Nov 10 10:46:09 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Mon Nov 10 14:51:12 2014 +0100

----------------------------------------------------------------------
 .../management/mbean/ManagedComponentMBean.java |  7 +++++
 .../apache/camel/impl/DefaultCamelContext.java  |  2 +-
 .../management/mbean/ManagedComponent.java      | 33 ++++++++++++++++++++
 .../camel/management/mbean/ManagedEndpoint.java |  2 +-
 .../org/apache/camel/util/JsonSchemaHelper.java | 15 ++++++---
 .../ManagedUnregisterComponentTest.java         |  3 ++
 .../camel/karaf/commands/EndpointExplain.java   |  2 +-
 .../camel/karaf/commands/EndpointList.java      |  2 +-
 8 files changed, 58 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
index 0b1c9a7..b4e2365 100644
--- 
a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
+++ 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
@@ -17,12 +17,16 @@
 package org.apache.camel.api.management.mbean;
 
 import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
 
 public interface ManagedComponentMBean {
 
     @ManagedAttribute(description = "Component Name")
     String getComponentName();
 
+    @ManagedAttribute(description = "Component Description")
+    String getComponentDescription();
+
     @ManagedAttribute(description = "Component State")
     String getState();
 
@@ -32,4 +36,7 @@ public interface ManagedComponentMBean {
     @ManagedAttribute(description = "Camel ManagementName")
     String getCamelManagementName();
 
+    @ManagedOperation(description = "Component information as JSon")
+    String informationJson();
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index addcc63..ff70147 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -1151,7 +1151,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
                 return null;
             }
 
-            List<Map<String, String>> rows = 
JsonSchemaHelper.parseJsonSchema("properties", json);
+            List<Map<String, String>> rows = 
JsonSchemaHelper.parseJsonSchema("properties", json, true);
 
             // selected rows to use for answer
             Map<String, String[]> selected = new LinkedHashMap<String, 
String[]>();

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
index 1696391..6c7ee80 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.management.mbean;
 
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.camel.Component;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StatefulService;
@@ -23,6 +27,8 @@ import org.apache.camel.api.management.ManagedInstance;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.api.management.mbean.ManagedComponentMBean;
 import org.apache.camel.spi.ManagementStrategy;
+import org.apache.camel.util.JsonSchemaHelper;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * @version 
@@ -31,10 +37,24 @@ import org.apache.camel.spi.ManagementStrategy;
 public class ManagedComponent implements ManagedInstance, 
ManagedComponentMBean {
     private final Component component;
     private final String name;
+    private String description;
 
     public ManagedComponent(String name, Component component) {
         this.name = name;
         this.component = component;
+
+        try {
+            String json = 
component.getCamelContext().getComponentParameterJsonSchema(name);
+            List<Map<String, String>> rows = 
JsonSchemaHelper.parseJsonSchema("component", json, false);
+            for (Map<String, String> row : rows) {
+                if (row.containsKey("description")) {
+                    this.description = row.get("description");
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            // ignore
+        }
     }
 
     public void init(ManagementStrategy strategy) {
@@ -49,6 +69,10 @@ public class ManagedComponent implements ManagedInstance, 
ManagedComponentMBean
         return name;
     }
 
+    public String getComponentDescription() {
+        return description;
+    }
+
     public String getState() {
         // must use String type to be sure remote JMX can read the attribute 
without requiring Camel classes.
         if (component instanceof StatefulService) {
@@ -71,4 +95,13 @@ public class ManagedComponent implements ManagedInstance, 
ManagedComponentMBean
     public Object getInstance() {
         return component;
     }
+
+    @Override
+    public String informationJson() {
+        try {
+            return 
component.getCamelContext().getComponentParameterJsonSchema(name);
+        } catch (IOException e) {
+            throw ObjectHelper.wrapRuntimeCamelException(e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
index 7e55502..2f2d281 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
@@ -87,7 +87,7 @@ public class ManagedEndpoint implements ManagedInstance, 
ManagedEndpointMBean {
     public TabularData explain(boolean allOptions) {
         try {
             String json = 
endpoint.getCamelContext().explainEndpointJson(getEndpointUri(), allOptions);
-            List<Map<String, String>> rows = 
JsonSchemaHelper.parseJsonSchema("properties", json);
+            List<Map<String, String>> rows = 
JsonSchemaHelper.parseJsonSchema("properties", json, true);
 
             TabularData answer = new 
TabularDataSupport(CamelOpenMBeanTypes.explainEndpointTabularType());
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/main/java/org/apache/camel/util/JsonSchemaHelper.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/util/JsonSchemaHelper.java 
b/camel-core/src/main/java/org/apache/camel/util/JsonSchemaHelper.java
index 4233a14..e580ec7 100644
--- a/camel-core/src/main/java/org/apache/camel/util/JsonSchemaHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/JsonSchemaHelper.java
@@ -115,7 +115,7 @@ public final class JsonSchemaHelper {
      * @param json the json
      * @return a list of all the rows, where each row is a set of key value 
pairs with metadata
      */
-    public static List<Map<String, String>> parseJsonSchema(String group, 
String json) {
+    public static List<Map<String, String>> parseJsonSchema(String group, 
String json, boolean parseProperties) {
         List<Map<String, String>> answer = new ArrayList<Map<String, 
String>>();
         if (json == null) {
             return answer;
@@ -128,7 +128,8 @@ public final class JsonSchemaHelper {
         for (String line : lines) {
             // we need to find the group first
             if (!found) {
-                found = line.startsWith("  \"" + group + "\":");
+                String s = line.trim();
+                found = s.startsWith("\"" + group + "\":");
                 continue;
             }
 
@@ -139,8 +140,14 @@ public final class JsonSchemaHelper {
 
             Map<String, String> row = new LinkedHashMap<String, String>();
             Matcher matcher = PATTERN.matcher(line);
-            // the first key is the name of the option
-            String key = "name";
+
+            String key;
+            if (parseProperties) {
+                // when parsing properties the first key is given as name, so 
the first parsed token is the value of the name
+                key = "name";
+            } else {
+                key = null;
+            }
             while (matcher.find()) {
                 if (key == null) {
                     key = matcher.group(1);

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/camel-core/src/test/java/org/apache/camel/management/ManagedUnregisterComponentTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/management/ManagedUnregisterComponentTest.java
 
b/camel-core/src/test/java/org/apache/camel/management/ManagedUnregisterComponentTest.java
index 6b0bedc..aa4b133 100644
--- 
a/camel-core/src/test/java/org/apache/camel/management/ManagedUnregisterComponentTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/management/ManagedUnregisterComponentTest.java
@@ -48,6 +48,9 @@ public class ManagedUnregisterComponentTest extends 
ManagementTestSupport {
         String id = (String) mbeanServer.getAttribute(on, "CamelId");
         assertEquals("camel-1", id);
 
+        String desc = (String) mbeanServer.getAttribute(on, 
"ComponentDescription");
+        assertNotNull(desc);
+
         context.stop();
 
         assertFalse("Should no longer be registered", 
mbeanServer.isRegistered(on));

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java
----------------------------------------------------------------------
diff --git 
a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java
 
b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java
index 2113af8..02725d0 100644
--- 
a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java
+++ 
b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java
@@ -83,7 +83,7 @@ public class EndpointExplain extends CamelCommandSupport {
             out.println();
 
             // use a basic json parser
-            List<Map<String, String>> options = 
JsonSchemaHelper.parseJsonSchema("properties", json);
+            List<Map<String, String>> options = 
JsonSchemaHelper.parseJsonSchema("properties", json, true);
 
             // lets sort the options by name
             Collections.sort(options, new Comparator<Map<String, String>>() {

http://git-wip-us.apache.org/repos/asf/camel/blob/1a205e44/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java
----------------------------------------------------------------------
diff --git 
a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java
 
b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java
index eda29d4..89017e6 100644
--- 
a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java
+++ 
b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java
@@ -96,7 +96,7 @@ public class EndpointList extends CamelCommandSupport {
                     boolean first = true;
                     String json = 
camelController.explainEndpoint(endpoint.getCamelContext().getName(), 
endpoint.getEndpointUri(), verbose);
                     // use a basic json parser
-                    List<Map<String, String>> options = 
JsonSchemaHelper.parseJsonSchema("properties", json);
+                    List<Map<String, String>> options = 
JsonSchemaHelper.parseJsonSchema("properties", json, true);
 
                     // lets sort the options by name
                     Collections.sort(options, new Comparator<Map<String, 
String>>() {

Reply via email to