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 2022/05/30 04:25:37 UTC

[camel] branch main updated: camel-console - Source console to dump route sources.

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 00526e77bfa camel-console - Source console to dump route sources.
00526e77bfa is described below

commit 00526e77bfa88bc20bcde640487cf7d83629e49d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 30 06:24:17 2022 +0200

    camel-console - Source console to dump route sources.
---
 .../src/main/java/org/apache/camel/Route.java      |   5 +
 .../camel/impl/engine/AbstractCamelContext.java    |   4 +-
 .../org/apache/camel/impl/engine/DefaultRoute.java |   9 +-
 .../services/org/apache/camel/dev-console/source   |   2 +
 .../apache/camel/impl/console/RouteDevConsole.java |   2 +-
 ...{RouteDevConsole.java => SourceDevConsole.java} | 109 +++++++++++++++------
 .../apache/camel/impl/console/TopDevConsole.java   |   5 +-
 .../api/management/mbean/ManagedRouteMBean.java    |   3 +
 .../management/mbean/ManagedBacklogDebugger.java   |   2 +-
 .../camel/management/mbean/ManagedRoute.java       |   8 +-
 .../org/apache/camel/support/LoggerHelper.java     |  31 ++++++
 .../org/apache/camel/support/MessageHelper.java    |   2 +-
 .../camel/support/RouteWatcherReloadStrategy.java  |   2 +-
 13 files changed, 143 insertions(+), 41 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/Route.java b/core/camel-api/src/main/java/org/apache/camel/Route.java
index c5f46ec328c..500e407eb46 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Route.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Route.java
@@ -148,6 +148,11 @@ public interface Route extends RuntimeConfiguration {
      */
     String getSourceLocation();
 
+    /**
+     * The source:line-number in short format that can be used for logging or summary purposes.
+     */
+    String getSourceLocationShort();
+
     /**
      * Gets the camel context
      *
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 9ca2b73f3c3..6815fcd7168 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -3122,7 +3122,7 @@ public abstract class AbstractCamelContext extends BaseService
                 // use basic endpoint uri to not log verbose details or potential sensitive data
                 String uri = order.getRoute().getEndpoint().getEndpointBaseUri();
                 uri = URISupport.sanitizeUri(uri);
-                String loc = order.getRoute().getSourceLocation();
+                String loc = order.getRoute().getSourceLocationShort();
                 if (startupSummaryLevel == StartupSummaryLevel.Verbose && loc != null) {
                     lines.add(String.format("    %s %s (%s) (source: %s)", status, id, uri, loc));
                 } else {
@@ -3145,7 +3145,7 @@ public abstract class AbstractCamelContext extends BaseService
                     // use basic endpoint uri to not log verbose details or potential sensitive data
                     String uri = route.getEndpoint().getEndpointBaseUri();
                     uri = URISupport.sanitizeUri(uri);
-                    String loc = route.getSourceLocation();
+                    String loc = route.getSourceLocationShort();
                     if (startupSummaryLevel == StartupSummaryLevel.Verbose && loc != null) {
                         lines.add(String.format("    %s %s (%s) (source: %s)", status, id, uri, loc));
                     } else {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index c35da8960f3..3a9d4671088 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -74,6 +74,7 @@ public class DefaultRoute extends ServiceSupport implements Route {
     private final String routeDescription;
     private final Resource sourceResource;
     private final String sourceLocation;
+    private final String sourceLocationShort;
     private final List<Processor> eventDrivenProcessors = new ArrayList<>();
     private final List<InterceptStrategy> interceptStrategies = new ArrayList<>(0);
     private ManagementInterceptStrategy managementInterceptStrategy;
@@ -118,7 +119,8 @@ public class DefaultRoute extends ServiceSupport implements Route {
         this.routeDescription = routeDescription;
         this.endpoint = endpoint;
         this.sourceResource = resource;
-        this.sourceLocation = LoggerHelper.getLineNumberLoggerName(route);
+        this.sourceLocation = LoggerHelper.getSourceLocation(route);
+        this.sourceLocationShort = LoggerHelper.getLineNumberLoggerName(route);
     }
 
     @Override
@@ -190,6 +192,11 @@ public class DefaultRoute extends ServiceSupport implements Route {
         return sourceLocation;
     }
 
+    @Override
+    public String getSourceLocationShort() {
+        return sourceLocationShort;
+    }
+
     @Override
     public void initializeServices() throws Exception {
         // gather all the services for this route
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source
new file mode 100644
index 00000000000..bfe41e9fd45
--- /dev/null
+++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.console.SourceDevConsole
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
index 41a9b70e0f1..2bad41f3c15 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
@@ -134,7 +134,7 @@ public class RouteDevConsole extends AbstractDevConsole {
 
         return PatternHelper.matchPattern(mrb.getRouteId(), filter)
                 || PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
-                || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+                || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
     }
 
     private static int sort(ManagedRouteMBean o1, ManagedRouteMBean o2) {
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
similarity index 55%
copy from core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
copy to core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
index 41a9b70e0f1..c0c982a752c 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
@@ -16,23 +16,28 @@
  */
 package org.apache.camel.impl.console;
 
+import java.io.LineNumberReader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Route;
 import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.LoggerHelper;
 import org.apache.camel.support.PatternHelper;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
-import org.apache.camel.util.TimeUtils;
 import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
 
-@DevConsole("route")
-public class RouteDevConsole extends AbstractDevConsole {
+@DevConsole("source")
+public class SourceDevConsole extends AbstractDevConsole {
 
     /**
      * Filters the routes matching by route id, route uri, and source location
@@ -44,30 +49,49 @@ public class RouteDevConsole extends AbstractDevConsole {
      */
     public static final String LIMIT = "limit";
 
-    public RouteDevConsole() {
-        super("camel", "route", "Route", "Route information");
+    public SourceDevConsole() {
+        super("camel", "source", "Source", "Display route source code");
     }
 
     @Override
     protected String doCallText(Map<String, Object> options) {
         final StringBuilder sb = new StringBuilder();
         Function<ManagedRouteMBean, Object> task = mrb -> {
-            if (sb.length() > 0) {
-                sb.append("\n");
+            String loc = mrb.getSourceLocation();
+            if (loc != null) {
+                loc = LoggerHelper.stripSourceLocationLineNumber(loc);
+                StringBuilder code = new StringBuilder();
+                try {
+                    Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
+                            .resolveResource(loc);
+                    if (resource != null) {
+                        if (sb.length() > 0) {
+                            sb.append("\n");
+                        }
+
+                        LineNumberReader reader = new LineNumberReader(resource.getReader());
+                        int i = 0;
+                        String t;
+                        do {
+                            t = reader.readLine();
+                            if (t != null) {
+                                i++;
+                                code.append(String.format("\n    #%s %s", i, t));
+                            }
+                        } while (t != null);
+                        IOHelper.close(reader);
+                    }
+                } catch (Exception e) {
+                    // ignore
+                }
+                sb.append(String.format("    Id: %s", mrb.getRouteId()));
+                if (mrb.getSourceLocation() != null) {
+                    sb.append(String.format("\n    Source: %s", mrb.getSourceLocation()));
+                }
+                if (code.length() > 0) {
+                    sb.append(code);
+                }
             }
-            sb.append(String.format("    Id: %s", mrb.getRouteId()));
-            sb.append(String.format("\n    From: %s", mrb.getEndpointUri()));
-            if (mrb.getSourceLocation() != null) {
-                sb.append(String.format("\n    Source: %s", mrb.getSourceLocation()));
-            }
-            sb.append(String.format("\n    State: %s", mrb.getState()));
-            sb.append(String.format("\n    Uptime: %s", mrb.getUptime()));
-            sb.append(String.format("\n    Total: %s", mrb.getExchangesTotal()));
-            sb.append(String.format("\n    Failed: %s", mrb.getExchangesFailed()));
-            sb.append(String.format("\n    Inflight: %s", mrb.getExchangesInflight()));
-            sb.append(String.format("\n    Mean Time: %s", TimeUtils.printDuration(mrb.getMeanProcessingTime())));
-            sb.append(String.format("\n    Max Time: %s", TimeUtils.printDuration(mrb.getMaxProcessingTime())));
-            sb.append(String.format("\n    Min Time: %s", TimeUtils.printDuration(mrb.getMinProcessingTime())));
             sb.append("\n");
             return null;
         };
@@ -89,16 +113,37 @@ public class RouteDevConsole extends AbstractDevConsole {
             if (mrb.getSourceLocation() != null) {
                 jo.put("source", mrb.getSourceLocation());
             }
-            jo.put("state", mrb.getState());
-            jo.put("uptime", mrb.getUptime());
-            JsonObject stats = new JsonObject();
-            stats.put("exchangesTotal", mrb.getExchangesTotal());
-            stats.put("exchangesFailed", mrb.getExchangesFailed());
-            stats.put("exchangesInflight", mrb.getExchangesInflight());
-            stats.put("meanProcessingTime", mrb.getMeanProcessingTime());
-            stats.put("maxProcessingTime", mrb.getMaxProcessingTime());
-            stats.put("minProcessingTime", mrb.getMinProcessingTime());
-            jo.put("statistics", stats);
+
+            String loc = mrb.getSourceLocation();
+            if (loc != null) {
+                List<JsonObject> code = new ArrayList<>();
+                try {
+                    loc = LoggerHelper.stripSourceLocationLineNumber(loc);
+                    Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
+                            .resolveResource(loc);
+                    if (resource != null) {
+                        LineNumberReader reader = new LineNumberReader(resource.getReader());
+                        int i = 0;
+                        String t;
+                        do {
+                            t = reader.readLine();
+                            if (t != null) {
+                                i++;
+                                JsonObject c = new JsonObject();
+                                c.put("line", i);
+                                c.put("code", Jsoner.escape(t));
+                                code.add(c);
+                            }
+                        } while (t != null);
+                        IOHelper.close(reader);
+                    }
+                } catch (Exception e) {
+                    // ignore
+                }
+                if (!code.isEmpty()) {
+                    jo.put("code", code);
+                }
+            }
             return null;
         };
         doCall(options, task);
@@ -121,7 +166,7 @@ public class RouteDevConsole extends AbstractDevConsole {
                     .map(route -> mcc.getManagedRoute(route.getRouteId()))
                     .filter(r -> accept(r, filter))
                     .filter(r -> accept(r, subPath))
-                    .sorted(RouteDevConsole::sort)
+                    .sorted(SourceDevConsole::sort)
                     .limit(max)
                     .forEach(task::apply);
         }
@@ -134,7 +179,7 @@ public class RouteDevConsole extends AbstractDevConsole {
 
         return PatternHelper.matchPattern(mrb.getRouteId(), filter)
                 || PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
-                || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+                || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
     }
 
     private static int sort(ManagedRouteMBean o1, ManagedRouteMBean o2) {
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
index 1507072bb12..390898c70f6 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
@@ -32,6 +32,7 @@ import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.LoggerHelper;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
@@ -101,6 +102,7 @@ public class TopDevConsole extends AbstractDevConsole {
                     if (loc != null && mpb.getSourceLineNumber() != null) {
                         int line = mpb.getSourceLineNumber();
                         try {
+                            loc = LoggerHelper.stripSourceLocationLineNumber(loc);
                             Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
                                     .resolveResource(loc);
                             if (resource != null) {
@@ -198,6 +200,7 @@ public class TopDevConsole extends AbstractDevConsole {
                     if (loc != null && mpb.getSourceLineNumber() != null) {
                         int line = mpb.getSourceLineNumber();
                         try {
+                            loc = LoggerHelper.stripSourceLocationLineNumber(loc);
                             Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
                                     .resolveResource(loc);
                             if (resource != null) {
@@ -296,7 +299,7 @@ public class TopDevConsole extends AbstractDevConsole {
 
         return PatternHelper.matchPattern(mrb.getRouteId(), filter)
                 || PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
-                || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+                || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
     }
 
     private static boolean acceptProcessor(ManagedProcessorMBean mpb, String filter) {
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
index 4fcab632d83..83867af9540 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
@@ -40,6 +40,9 @@ public interface ManagedRouteMBean extends ManagedPerformanceCounterMBean {
     @ManagedAttribute(description = "Route Source Location")
     String getSourceLocation();
 
+    @ManagedAttribute(description = "Route Source Location (Short)")
+    String getSourceLocationShort();
+
     @ManagedAttribute(description = "Route Configuration ID")
     String getRouteConfigurationId();
 
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
index 9db605ac689..0f78390a6fc 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
@@ -387,7 +387,7 @@ public class ManagedBacklogDebugger implements ManagedBacklogDebuggerMBean {
                 // add incoming origin of message on the top
                 String routeId = suspendedExchange.getFromRouteId();
                 Route route = suspendedExchange.getContext().getRoute(routeId);
-                String loc = route != null ? route.getSourceLocation() : "";
+                String loc = route != null ? route.getSourceLocationShort() : "";
                 String id = routeId;
                 String label = "";
                 if (suspendedExchange.getFromEndpoint() != null) {
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index b4effeab2b6..ec490f49bb6 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -74,6 +74,7 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
     protected final String description;
     protected final String configurationId;
     protected final String sourceLocation;
+    protected final String sourceLocationShort;
     protected final CamelContext context;
     private final LoadTriplet load = new LoadTriplet();
     private final String jmxDomain;
@@ -84,6 +85,7 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
         this.description = route.getDescription();
         this.configurationId = route.getConfigurationId();
         this.sourceLocation = route.getSourceLocation();
+        this.sourceLocationShort = route.getSourceLocationShort();
         this.jmxDomain = context.getManagementStrategy().getManagementAgent().getMBeanObjectDomainName();
     }
 
@@ -152,6 +154,11 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
         return sourceLocation;
     }
 
+    @Override
+    public String getSourceLocationShort() {
+        return null;
+    }
+
     @Override
     public String getRouteConfigurationId() {
         return configurationId;
@@ -699,7 +706,6 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
         MBeanServer server = getContext().getManagementStrategy().getManagementAgent().getMBeanServer();
         if (server != null) {
             String prefix = getContext().getManagementStrategy().getManagementAgent().getIncludeHostName() ? "*/" : "";
-            List<ManagedProcessorMBean> processors = new ArrayList<>();
             // gather all the processors for this CamelContext, which requires JMX
             ObjectName query = ObjectName
                     .getInstance(jmxDomain + ":context=" + prefix + getContext().getManagementName() + ",type=processors,*");
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
index f475e300f1f..357cb858ca1 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
@@ -19,6 +19,7 @@ package org.apache.camel.support;
 import org.apache.camel.LineNumberAware;
 import org.apache.camel.NamedRoute;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.StringHelper;
 
 /**
  * Helper for logging purposes.
@@ -67,4 +68,34 @@ public final class LoggerHelper {
         return name;
     }
 
+    public static String getSourceLocation(Object node) {
+        String name = null;
+        if (node instanceof LineNumberAware) {
+            if (node instanceof NamedRoute) {
+                // we want the input from a route as it has the source location / line number
+                node = ((NamedRoute) node).getInput();
+            }
+            String loc = ((LineNumberAware) node).getLocation();
+            int line = ((LineNumberAware) node).getLineNumber();
+            if (loc != null) {
+                // is it a class or file?
+                name = loc;
+                if (line != -1) {
+                    name += ":" + line;
+                }
+            }
+        }
+        return name;
+    }
+
+    public static String stripSourceLocationLineNumber(String location) {
+        int cnt = StringHelper.countChar(location, ':');
+        if (cnt > 1) {
+            int pos = location.lastIndexOf(':');
+            return location.substring(0, pos);
+        } else {
+            return location;
+        }
+    }
+
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index a1d285a6784..4d24c6699e3 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -582,7 +582,7 @@ public final class MessageHelper {
         // add incoming origin of message on the top
         String routeId = exchange.getFromRouteId();
         Route route = exchange.getContext().getRoute(routeId);
-        String loc = route != null ? route.getSourceLocation() : null;
+        String loc = route != null ? route.getSourceLocationShort() : null;
         if (loc == null) {
             loc = "";
         }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
index 8fe7c04fd0f..ecf753715ac 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
@@ -241,7 +241,7 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg
                     // use basic endpoint uri to not log verbose details or potential sensitive data
                     String uri = route.getEndpoint().getEndpointBaseUri();
                     uri = URISupport.sanitizeUri(uri);
-                    String loc = route.getSourceLocation();
+                    String loc = route.getSourceLocationShort();
                     if (loc == null) {
                         loc = "";
                     }