You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/10/10 12:49:21 UTC
(camel) 06/13: CAMEL-21193: camel-jbang - Add listen command
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 <cl...@gmail.com>
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
*/