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 6690a1de8fe CAMEL-21568: camel-jbang - Debug should support step 
into/over
6690a1de8fe is described below

commit 6690a1de8fee1bf053ad41e07f9d56c06302a871
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Dec 25 12:35:02 2024 +0100

    CAMEL-21568: camel-jbang - Debug should support step into/over
---
 .../java/org/apache/camel/spi/BacklogDebugger.java |  7 +++++-
 .../impl/debugger/DefaultBacklogDebugger.java      | 27 +++++++++++++++++++---
 .../apache/camel/impl/console/DebugDevConsole.java |  2 ++
 .../mbean/ManagedBacklogDebuggerMBean.java         |  5 +++-
 .../management/mbean/ManagedBacklogDebugger.java   |  5 ++++
 .../camel/dsl/jbang/core/commands/Debug.java       | 10 +++++---
 6 files changed, 48 insertions(+), 8 deletions(-)

diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogDebugger.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogDebugger.java
index 8515fc5e5db..24dd4846ba0 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogDebugger.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogDebugger.java
@@ -277,10 +277,15 @@ public interface BacklogDebugger extends StatefulService {
     void stepBreakpoint();
 
     /**
-     * To step to next node when in single step mode.
+     * To step (into) to next node when in single step mode.
      */
     void step();
 
+    /**
+     * To step over to next node when in single step mode.
+     */
+    void stepOver();
+
     /**
      * Gets node ids for all current suspended exchanges at breakpoints
      */
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
index c3714c06b96..2570b68423e 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
@@ -78,6 +78,7 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
 
     private final AtomicReference<CountDownLatch> suspend = new 
AtomicReference<>();
     private final Deque<String> singleStepExchangeId = new ArrayDeque<>();
+    private final AtomicBoolean stepOverMode = new AtomicBoolean();
 
     private boolean suspendMode;
     private String initialBreakpoints;
@@ -648,6 +649,12 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
         }
     }
 
+    @Override
+    public void stepOver() {
+        stepOverMode.set(true);
+        step();
+    }
+
     @Override
     public Set<String> getSuspendedBreakpointNodeIds() {
         return new LinkedHashSet<>(suspendedBreakpoints.keySet());
@@ -785,7 +792,7 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
 
     public StopWatch beforeProcess(Exchange exchange, Processor processor, 
NamedNode definition) {
         suspendIfNeeded();
-        if (isEnabled() && (hasBreakpoint(definition.getId()) || 
isSingleStepMode())) {
+        if (isEnabled() && !stepOverMode.get() && 
(hasBreakpoint(definition.getId()) || isSingleStepMode())) {
             StopWatch watch = new StopWatch();
             debugger.beforeProcess(exchange, processor, definition);
             return watch;
@@ -952,6 +959,11 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
 
         @Override
         public void beforeProcess(Exchange exchange, Processor processor, 
NamedNode definition) {
+            if (stepOverMode.get()) {
+                // we are stepping over this
+                return;
+            }
+
             // store a copy of the message so we can see that from the debugger
             long timestamp = System.currentTimeMillis();
             String toNode = definition.getId();
@@ -991,6 +1003,11 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
             }
         }
 
+        @Override
+        public void afterProcess(Exchange exchange, Processor processor, 
NamedNode definition, long timeTaken) {
+            stepOverMode.set(false);
+        }
+
         @Override
         public boolean matchProcess(Exchange exchange, Processor processor, 
NamedNode definition, boolean before) {
             // always match in step (both before and after)
@@ -1011,14 +1028,18 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
                 }
                 NamedRoute route = getOriginalRoute(exchange);
                 String completedId = event.getExchange().getExchangeId();
+                boolean completed = false;
                 try {
                     String tid = !singleStepExchangeId.isEmpty() ? 
singleStepExchangeId.peek() : null;
-                    if (isSingleStepIncludeStartEnd() && 
completedId.equals(tid)) {
+                    if (!stepOverMode.get() && isSingleStepIncludeStartEnd() 
&& completedId.equals(tid)) {
+                        completed = true;
                         doCompleted(exchange, definition, route, cause);
                     }
                 } finally {
                     singleStepExchangeId.remove(completedId);
-                    logger.log("ExchangeId: " + completedId + " is completed, 
so exiting single step mode.");
+                    if (completed) {
+                        logger.log("ExchangeId: " + completedId + " is 
completed, so exiting single step mode.");
+                    }
                 }
             }
         }
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
index 4e3dcfb774e..b17fd065bd6 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
@@ -124,6 +124,8 @@ public class DebugDevConsole extends AbstractDevConsole {
             } else {
                 backlog.stepBreakpoint();
             }
+        } else if ("stepover".equalsIgnoreCase(command)) {
+            backlog.stepOver();
         } else if ("add".equalsIgnoreCase(command) && 
ObjectHelper.isNotEmpty(breakpoint)) {
             backlog.addBreakpoint(breakpoint);
         } else if ("remove".equalsIgnoreCase(command)) {
diff --git 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java
 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java
index 318948326e1..3bdcceb26b2 100644
--- 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java
+++ 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java
@@ -92,9 +92,12 @@ public interface ManagedBacklogDebuggerMBean {
     @ManagedAttribute(description = "Whether currently in step mode")
     boolean isSingleStepMode();
 
-    @ManagedOperation(description = "Steps to next node in step mode")
+    @ManagedOperation(description = "Steps (into) to next node in step mode")
     void step();
 
+    @ManagedOperation(description = "Steps over the next node in step mode")
+    void stepOver();
+
     @ManagedOperation(description = "Return the node ids which has 
breakpoints")
     Set<String> breakpoints();
 
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 0babbbccfce..a80ac72bb0f 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
@@ -201,6 +201,11 @@ public class ManagedBacklogDebugger implements 
ManagedBacklogDebuggerMBean {
         backlogDebugger.step();
     }
 
+    @Override
+    public void stepOver() {
+        backlogDebugger.stepOver();
+    }
+
     @Override
     public Set<String> suspendedBreakpointNodeIds() {
         return backlogDebugger.getSuspendedBreakpointNodeIds();
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
index f6c2b4faa21..678977ecf48 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
@@ -208,7 +208,7 @@ public class Debug extends Run {
             String line = c.readLine();
             if (line != null) {
                 line = line.trim();
-                if ("quit".equalsIgnoreCase(line) || 
"exit".equalsIgnoreCase(line)) {
+                if ("q".equalsIgnoreCase(line) || 
"quit".equalsIgnoreCase(line) || "exit".equalsIgnoreCase(line)) {
                     quit.set(true);
                 } else {
                     // continue breakpoint
@@ -219,7 +219,11 @@ public class Debug extends Run {
                             logUpdated.set(true);
                         }
                     }
-                    sendDebugCommand(spawnPid, "step", null);
+                    String cmd = "step";
+                    if (line.equalsIgnoreCase("o") || 
line.equalsIgnoreCase("over")) {
+                        cmd = "stepover";
+                    }
+                    sendDebugCommand(spawnPid, cmd, null);
                 }
                 // user have pressed ENTER so continue
                 waitForUser.set(false);
@@ -471,7 +475,7 @@ public class Debug extends Run {
                     }
                 }
 
-                String msg = "    Breakpoint suspended. Press ENTER to 
continue.";
+                String msg = "    Breakpoint suspended (i = step into 
(default), o = step over). Press ENTER to continue.";
                 if (loggingColor) {
                     
AnsiConsole.out().println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(msg).reset());
                 } else {

Reply via email to