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 181aae64b85 CAMEL-20078: camel-jbang - Debug command
181aae64b85 is described below
commit 181aae64b850301fe118de3fcade62c2f640ff93
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Nov 4 17:30:50 2023 +0100
CAMEL-20078: camel-jbang - Debug command
---
.../apache/camel/impl/engine/DefaultChannel.java | 79 ++++++++++++++++++----
.../main/DebuggerConfigurationProperties.java | 1 -
.../modules/ROOT/pages/camel-jbang.adoc | 34 ++++++++++
3 files changed, 98 insertions(+), 16 deletions(-)
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
index 2d4b23985d9..cd593716a05 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
@@ -41,8 +41,10 @@ import org.apache.camel.spi.MessageHistoryFactory;
import org.apache.camel.spi.Tracer;
import org.apache.camel.spi.WrapAwareProcessor;
import org.apache.camel.support.OrderedComparator;
+import org.apache.camel.support.PatternHelper;
import org.apache.camel.support.PluginHelper;
import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -184,21 +186,7 @@ public class DefaultChannel extends CamelInternalProcessor
implements Channel {
if (!camelContext.hasService(debugger)) {
camelContext.addService(debugger);
}
- // if starting breakpoint is BREAKPOINT_ALL_ROUTES then
automatic add first as a breakpoint
- if (first && debugger.getInitialBreakpoints() != null
- &&
debugger.getInitialBreakpoints().contains(BacklogDebugger.BREAKPOINT_ALL_ROUTES))
{
- if (debugger.isSingleStepIncludeStartEnd()) {
- // we want route to be breakpoint (use input)
- String id = routeDefinition.getInput().getId();
- debugger.addBreakpoint(id);
- LOG.debug("BacklogDebugger added breakpoint: {}", id);
- } else {
- // first output should also be breakpoint
- String id = targetOutputDef.getId();
- debugger.addBreakpoint(id);
- LOG.debug("BacklogDebugger added breakpoint: {}", id);
- }
- }
+ backlogDebuggerSetupInitialBreakpoints(definition,
routeDefinition, first, debugger, targetOutputDef);
if (first && debugger.isSingleStepIncludeStartEnd()) {
// add breakpoint on route input instead of first node
addAdvice(new BacklogDebuggerAdvice(debugger,
nextProcessor, routeDefinition.getInput()));
@@ -340,6 +328,67 @@ public class DefaultChannel extends CamelInternalProcessor
implements Channel {
return debugger;
}
+ private void backlogDebuggerSetupInitialBreakpoints(
+ NamedNode definition, NamedRoute routeDefinition, boolean first,
+ BacklogDebugger debugger, NamedNode targetOutputDef) {
+ // setup initial breakpoints
+ if (debugger.getInitialBreakpoints() != null) {
+ boolean match = false;
+ String id = definition.getId();
+ for (String pattern : debugger.getInitialBreakpoints().split(","))
{
+ pattern = pattern.trim();
+ match |= BacklogDebugger.BREAKPOINT_ALL_ROUTES.equals(pattern)
&& first;
+ if (!match) {
+ match = PatternHelper.matchPattern(id, pattern);
+ }
+ // eip kind so you can match with (setBody*)
+ if (!match) {
+ match =
PatternHelper.matchPattern(definition.getShortName(), pattern);
+ }
+ // location and line number
+ if (!match && pattern.contains(":")) {
+ // try with line number and location
+ String pnum = StringHelper.afterLast(pattern, ":");
+ if (pnum != null) {
+ String ploc = StringHelper.beforeLast(pattern, ":");
+ String loc = definition.getLocation();
+ // strip schema
+ if (loc != null && loc.contains(":")) {
+ loc = StringHelper.after(loc, ":");
+ }
+ String num = "" + definition.getLineNumber();
+ if (PatternHelper.matchPattern(loc, ploc) &&
pnum.equals(num)) {
+ match = true;
+ }
+ }
+ }
+ // line number only
+ if (!match) {
+ Integer pnum =
camelContext.getTypeConverter().tryConvertTo(Integer.class, pattern);
+ if (pnum != null) {
+ int num = definition.getLineNumber();
+ if (num == pnum) {
+ match = true;
+ }
+ }
+ }
+ }
+ if (match) {
+ if (first && debugger.isSingleStepIncludeStartEnd()) {
+ // we want route to be breakpoint (use input)
+ id = routeDefinition.getInput().getId();
+ debugger.addBreakpoint(id);
+ LOG.debug("BacklogDebugger added breakpoint: {}", id);
+ } else {
+ // first output should also be breakpoint
+ id = targetOutputDef.getId();
+ debugger.addBreakpoint(id);
+ LOG.debug("BacklogDebugger added breakpoint: {}", id);
+ }
+ }
+ }
+ }
+
@Override
public String toString() {
// just output the next processor as all the interceptors and error
handler is just too verbose
diff --git
a/core/camel-main/src/main/java/org/apache/camel/main/DebuggerConfigurationProperties.java
b/core/camel-main/src/main/java/org/apache/camel/main/DebuggerConfigurationProperties.java
index c06b602181e..de1113897e8 100644
---
a/core/camel-main/src/main/java/org/apache/camel/main/DebuggerConfigurationProperties.java
+++
b/core/camel-main/src/main/java/org/apache/camel/main/DebuggerConfigurationProperties.java
@@ -290,5 +290,4 @@ public class DebuggerConfigurationProperties implements
BootstrapCloseable {
return (DebuggerConfigurationProperties) this;
}
-
}
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index ceb90ad168a..33d49016bcb 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -1941,6 +1941,40 @@ This is _basic_ but yet powerful, as you have this
debugger always readily avail
TIP: The `camel debug` can debug almost all the DSLs (there is a problem with
groovy).
+===== Configuring breakpoints
+
+When using `camel debug` then breakpoints is by default added to every route.
However, you can specify which breakpoints to use instead with the
`--breakpoint` option.
+This parameter is able to match the Camel routes using a pattern style:
+
+1. Exact match by node ids
+2. Match node ids by pattern (wildcard and regular expression)
+3. Match by EIP kind (setHeader, setBody, choice, split, etc.)
+4. Match by source and line number
+5. Match by line number
+
+Multiple breakpoints can be separated by comma.
+
+For example to set a breakpoint at the setHeader EIP you do:
+
+[source,bash]
+----
+camel debug hello.yaml --breakpoint=setHeader
+----
+
+To set a breakpoint at line 18:
+
+[source,bash]
+----
+camel debug hello.yaml --breakpoint=18
+----
+
+To set a breakpoint at line 18 and 34
+
+[source,bash]
+----
+camel debug hello.yaml --breakpoint=18,34
+----
+
==== Camel route debugging using VSCode or IDEA editors