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 {