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));

Reply via email to