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/12/26 14:59:30 UTC
(camel) 02/04: CAMEL-21568: camel-jbang - Debug should support step into/over
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.8.x
in repository https://gitbox.apache.org/repos/asf/camel.git
commit b27cd1005214130bba2fae7651882cccc4d5bb71
Author: Claus Ibsen <cl...@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 | 8 +++++--
6 files changed, 47 insertions(+), 7 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 3528ed19044..853ee393162 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
@@ -186,7 +186,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
@@ -197,6 +197,10 @@ public class Debug extends Run {
logUpdated.set(true);
}
}
+ String cmd = "step";
+ if (line.equalsIgnoreCase("o") || line.equalsIgnoreCase("over")) {
+ cmd = "stepover";
+ }
sendDebugCommand(spawnPid, "step", null);
}
// user have pressed ENTER so continue
@@ -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 {