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 */
