CAMEL-7999: Component list to cater for components not using their default name, but be able to lookup the component information regardless.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ad67944b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ad67944b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ad67944b Branch: refs/heads/master Commit: ad67944bdf90d6c7a63239a5af37606729fa5c5e Parents: 0b077e3 Author: Claus Ibsen <davscl...@apache.org> Authored: Mon Nov 10 18:46:30 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon Nov 10 19:21:48 2014 +0100 ---------------------------------------------------------------------- .../java/org/apache/camel/CamelContext.java | 12 ++++ .../management/mbean/ManagedComponentMBean.java | 3 - .../apache/camel/impl/DefaultCamelContext.java | 32 +++++++++ .../management/mbean/ManagedCamelContext.java | 9 ++- .../management/mbean/ManagedComponent.java | 27 ++------ .../apache/camel/util/CamelContextHelper.java | 1 + .../ManagedCustomComponentNameTest.java | 73 ++++++++++++++++++++ .../ManagedUnregisterComponentTest.java | 3 - 8 files changed, 130 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/camel-core/src/main/java/org/apache/camel/CamelContext.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/CamelContext.java b/camel-core/src/main/java/org/apache/camel/CamelContext.java index 1c33d3f..8fc03ad 100644 --- a/camel-core/src/main/java/org/apache/camel/CamelContext.java +++ b/camel-core/src/main/java/org/apache/camel/CamelContext.java @@ -1336,6 +1336,18 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration { */ void setUseBreadcrumb(Boolean useBreadcrumb); + + /** + * Resolves a component's default name from its java type. + * <p/> + * A component may be used with a non default name such as <tt>activemq</tt>, <tt>wmq</tt> for the JMS component. + * This method can resolve the default component name by its java type. + * + * @param javaType the FQN name of the java type + * @return the default component name. + */ + String resolveComponentDefaultName(String javaType); + /** * Find information about all the Camel components available in the classpath and {@link org.apache.camel.spi.Registry}. * http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/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 b4e2365..8bd42ff 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 @@ -24,9 +24,6 @@ public interface ManagedComponentMBean { @ManagedAttribute(description = "Component Name") String getComponentName(); - @ManagedAttribute(description = "Component Description") - String getComponentDescription(); - @ManagedAttribute(description = "Component State") String getState(); http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/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 8fcd291..32da83f 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 @@ -1083,6 +1083,38 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon } } + public String resolveComponentDefaultName(String javaType) { + // special for some components + if ("org.apache.activemq.camel.component.ActiveMQComponent".equals(javaType)) { + return "jms"; + } + + // try to find the component by its java type from the in-use components + if (javaType != null) { + // find all the components which will include the default component name + try { + Map<String, Properties> all = CamelContextHelper.findComponents(this); + for (Map.Entry<String, Properties> entry : all.entrySet()) { + String fqn = (String) entry.getValue().get("class"); + if (javaType.equals(fqn)) { + // is there component docs for that name? + String name = entry.getKey(); + String json = getComponentParameterJsonSchema(name); + if (json != null) { + return name; + } + } + } + } catch (Exception e) { + // ignore + return null; + } + } + + // could not find a component with that name + return null; + } + public Map<String, Properties> findComponents() throws LoadPropertiesException, IOException { return CamelContextHelper.findComponents(this); } http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/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 2cd0aa4..6a9cefa 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 @@ -500,13 +500,18 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti // - release = available from the Apache Camel release // TODO: gather list of components in the Camel release String status = context.hasComponent(name) != null ? "in use" : "on classpath"; - String type = null; + String type = (String) entry.getValue().get("class"); String groupId = null; String artifactId = null; String version = null; + // a component may have been given a different name, so resolve its default name by its java type + // as we can find the component json information from the default component name + String defaultName = context.resolveComponentDefaultName(type); + String target = defaultName != null ? defaultName : name; + // load component json data, and parse it to gather the component meta-data - String json = context.getComponentParameterJsonSchema(name); + String json = context.getComponentParameterJsonSchema(target); List<Map<String, String>> rows = JsonSchemaHelper.parseJsonSchema("component", json, false); for (Map<String, String> row : rows) { if (row.containsKey("description")) { http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/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 6c7ee80..cadc021 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 @@ -17,8 +17,6 @@ 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; @@ -27,7 +25,6 @@ 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; /** @@ -37,24 +34,10 @@ import org.apache.camel.util.ObjectHelper; 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) { @@ -69,10 +52,6 @@ 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) { @@ -99,7 +78,11 @@ public class ManagedComponent implements ManagedInstance, ManagedComponentMBean @Override public String informationJson() { try { - return component.getCamelContext().getComponentParameterJsonSchema(name); + // a component may have been given a different name, so resolve its default name by its java type + // as we can find the component json information from the default component name + String defaultName = component.getCamelContext().resolveComponentDefaultName(component.getClass().getName()); + String target = defaultName != null ? defaultName : name; + return component.getCamelContext().getComponentParameterJsonSchema(target); } catch (IOException e) { throw ObjectHelper.wrapRuntimeCamelException(e); } http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java b/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java index 7708231..ab829f6 100644 --- a/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java +++ b/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java @@ -436,6 +436,7 @@ public final class CamelContextHelper { properties.put("component", component); properties.put("class", component.getClass().getName()); properties.put("name", name); + // override default component if name clash map.put(name, properties); } } http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomComponentNameTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCustomComponentNameTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomComponentNameTest.java new file mode 100644 index 0000000..12e81e4 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomComponentNameTest.java @@ -0,0 +1,73 @@ +/** + * 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 java.util.Set; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.camel.ServiceStatus; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockComponent; + +/** + * @version + */ +public class ManagedCustomComponentNameTest extends ManagementTestSupport { + + public void testCustomName() throws Exception { + // JMX tests dont work well on AIX CI servers (hangs them) + if (isPlatform("aix")) { + return; + } + + MBeanServer mbeanServer = getMBeanServer(); + + Set<ObjectName> set = mbeanServer.queryNames(new ObjectName("*:type=components,*"), null); + assertEquals(3, set.size()); + + ObjectName on = set.iterator().next(); + assertTrue("Should be registered", mbeanServer.isRegistered(on)); + + String state = (String) mbeanServer.getAttribute(on, "State"); + assertEquals(ServiceStatus.Started.name(), state); + + String id = (String) mbeanServer.getAttribute(on, "CamelId"); + assertEquals("camel-1", id); + + context.stop(); + + assertFalse("Should no longer be registered", mbeanServer.isRegistered(on)); + set = mbeanServer.queryNames(new ObjectName("*:type=components,*"), null); + assertEquals("Should no longer be registered", 0, set.size()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + context.addComponent("foo", new MockComponent()); + + from("direct:start") + .to("foo:foo") + .to("mock:result"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/ad67944b/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 aa4b133..6b0bedc 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,9 +48,6 @@ 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));