This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch rcmd
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 6ef2a443dabcfefe5a065b3c06627dd2b5d2c9c4
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Oct 10 10:13:19 2024 +0200

    CAMEL-21193: camel-jbang - Add listen command
---
 .../camel/impl/console/ReceiveDevConsole.java      | 47 +++++++++++++++++-----
 .../java/org/apache/camel/util/ObjectHelper.java   | 19 +++++++++
 2 files changed, 55 insertions(+), 11 deletions(-)

diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
index 88d32b4e246..aed1721b1be 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
@@ -20,10 +20,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
+import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.Channel;
 import org.apache.camel.Consumer;
@@ -32,7 +36,6 @@ import org.apache.camel.EndpointAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Navigate;
 import org.apache.camel.Processor;
-import org.apache.camel.Route;
 import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.spi.Metadata;
@@ -41,6 +44,7 @@ import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 
@@ -206,9 +210,6 @@ public class ReceiveDevConsole extends AbstractDevConsole {
     }
 
     protected Endpoint findMatchingEndpoint(CamelContext camelContext, String 
endpoint) {
-        // TODO: Use ManagedProducerMBean as those are also toD (dynamic)
-
-
         Endpoint target = null;
         boolean scheme = endpoint.contains(":");
         boolean pattern = endpoint.endsWith("*");
@@ -216,13 +217,37 @@ public class ReceiveDevConsole extends AbstractDevConsole 
{
             if (!scheme && !endpoint.endsWith("*")) {
                 endpoint = endpoint + "*";
             }
-            List<EndpointAware> match = new ArrayList<>();
-            for (Route route : camelContext.getRoutes()) {
-                doFilter(endpoint, route.navigate(), match);
-            }
-            // grab last matched processor that sends to an endpoint
-            if (!match.isEmpty()) {
-                target = match.get(match.size() - 1).getEndpoint();
+            MBeanServer mbeanServer = 
getCamelContext().getManagementStrategy().getManagementAgent().getMBeanServer();
+            if (mbeanServer != null) {
+                try {
+                    // find all producers for this camel context mbean
+                    String jmxDomain
+                            = 
getCamelContext().getManagementStrategy().getManagementAgent().getMBeanObjectDomainName();
+                    String prefix
+                            = 
getCamelContext().getManagementStrategy().getManagementAgent().getIncludeHostName()
 ? "*/" : "";
+                    ObjectName query = ObjectName.getInstance(
+                            jmxDomain + ":context=" + prefix + 
getCamelContext().getManagementName() + ",type=producers,*");
+                    Set<ObjectName> set = mbeanServer.queryNames(query, null);
+                    for (ObjectName on : set) {
+                        String uri = (String) mbeanServer.getAttribute(on, 
"EndpointUri");
+                        if (PatternHelper.matchPattern(uri, endpoint)) {
+                            // is the endpoint able to create a consumer
+                            target = getCamelContext().getEndpoint(uri);
+                            // is the target able to create a consumer
+                            org.apache.camel.spi.UriEndpoint ann = 
ObjectHelper.getAnnotationDeep(target, org.apache.camel.spi.UriEndpoint.class);
+                            if (ann != null) {
+                                if (ann.producerOnly()) {
+                                    target = null;
+                                }
+                            }
+                            if (target != null) {
+                                break;
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    // ignore
+                }
             }
         } else {
             target = camelContext.getEndpoint(endpoint);
diff --git 
a/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java 
b/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
index e82dc4e21c1..941188187bc 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
@@ -1103,6 +1103,25 @@ public final class ObjectHelper {
         return instance.getClass().getAnnotation(type);
     }
 
+    /**
+     * Gets the annotation from the given instance (searching super classes 
also).
+     *
+     * @param  instance the instance
+     * @param  type     the annotation
+     * @return          the annotation, or <tt>null</tt> if the instance does 
not have the given annotation
+     */
+    public static <A extends java.lang.annotation.Annotation> A 
getAnnotationDeep(Object instance, Class<A> type) {
+        Class<?> clazz = instance.getClass();
+        while (clazz != Object.class) {
+            A ann = clazz.getAnnotation(type);
+            if (ann != null) {
+                return ann;
+            }
+            clazz = clazz.getSuperclass();
+        }
+        return null;
+    }
+
     /**
      * Converts the given value to the required type or throw a meaningful 
exception
      */

Reply via email to