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