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 <[email protected]>
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 {