This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-23672-tui-diagram in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7876f67763629434563256f125effe83f1547bee Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jun 3 22:22:41 2026 +0200 CAMEL-23672: camel-tui - Fix diagram not shown on Enter and uri fallback Select first EIP node immediately on drill-down (index 0 instead of -1) so the diagram renders on the first frame. Also add code-field fallback when uri is null for compatibility with older Camel runtimes. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../jbang/core/commands/tui/DiagramSupport.java | 27 ++++++++++++++++++---- .../dsl/jbang/core/commands/tui/DiagramTab.java | 6 ++--- .../commands/tui/diagram/RouteDiagramWidget.java | 18 +++++++++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java index 8fd0464e085e..738553cf6ccd 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java @@ -594,7 +594,7 @@ class DiagramSupport { && !"from".equals(type)) { return null; } - String baseUri = stripQueryParams(box.layoutNode().treeNode.info.uri); + String baseUri = getBaseUri(box.layoutNode().treeNode.info); if (baseUri == null || baseUri.isBlank()) { return null; } @@ -627,7 +627,7 @@ class DiagramSupport { if (!lr.nodes.isEmpty()) { var firstNode = lr.nodes.get(0); if ("from".equals(firstNode.type) && firstNode.treeNode != null) { - String fromBaseUri = stripQueryParams(firstNode.treeNode.info.uri); + String fromBaseUri = getBaseUri(firstNode.treeNode.info); if (baseUri.equals(fromBaseUri)) { return entry.getKey(); } @@ -638,6 +638,23 @@ class DiagramSupport { return null; } + static String getBaseUri(RouteDiagramLayoutEngine.NodeInfo info) { + String uri = info.uri; + if (uri == null) { + uri = extractUriFromCode(info.code); + } + return stripQueryParams(uri); + } + + private static String extractUriFromCode(String code) { + if (code == null) { + return null; + } + int open = code.indexOf('['); + int close = code.lastIndexOf(']'); + return (open >= 0 && close > open) ? code.substring(open + 1, close) : code; + } + static String stripQueryParams(String uri) { if (uri == null) { return null; @@ -751,7 +768,7 @@ class DiagramSupport { if (currentLayout != null && !currentLayout.nodes.isEmpty()) { var fromNode = currentLayout.nodes.get(0); if ("from".equals(fromNode.type) && fromNode.treeNode != null) { - currentFromUri = stripQueryParams(fromNode.treeNode.info.uri); + currentFromUri = getBaseUri(fromNode.treeNode.info); } } @@ -764,7 +781,7 @@ class DiagramSupport { // Add "from" URIs of other routes (linkable from "to" nodes) var firstNode = lr.nodes.get(0); if ("from".equals(firstNode.type) && firstNode.treeNode != null) { - String uri = stripQueryParams(firstNode.treeNode.info.uri); + String uri = getBaseUri(firstNode.treeNode.info); if (uri != null) { endpoints.add(uri); } @@ -775,7 +792,7 @@ class DiagramSupport { String type = node.type; if (("to".equals(type) || "toD".equals(type) || "wireTap".equals(type)) && node.treeNode != null) { - String uri = stripQueryParams(node.treeNode.info.uri); + String uri = getBaseUri(node.treeNode.info); if (currentFromUri.equals(uri)) { endpoints.add(currentFromUri); } diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java index ecdc67961f43..d4b16b783468 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java @@ -141,7 +141,7 @@ class DiagramTab implements MonitorTab { if (linkedRouteId != null && diagram.getRouteLayout(linkedRouteId) != null) { routeNavigationStack.push(drillDownRouteId); drillDownRouteId = linkedRouteId; - diagram.setSelectedEipNodeIndex(-1); + diagram.setSelectedEipNodeIndex(0); diagram.resetScroll(); return true; } @@ -158,7 +158,7 @@ class DiagramTab implements MonitorTab { drillDownRouteId = selectedRouteId; topologyMode = false; diagram.setTopologyMode(false); - diagram.setSelectedEipNodeIndex(-1); + diagram.setSelectedEipNodeIndex(0); diagram.resetScroll(); diagram.endLoad(); // Use cached route layout if available (no IPC needed) @@ -180,7 +180,7 @@ class DiagramTab implements MonitorTab { if (!routeNavigationStack.isEmpty()) { // Go back to the previous route in the stack drillDownRouteId = routeNavigationStack.pop(); - diagram.setSelectedEipNodeIndex(-1); + diagram.setSelectedEipNodeIndex(0); diagram.resetScroll(); return true; } diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java index 8762935f9536..a2fae9e0de84 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java @@ -429,13 +429,23 @@ public class RouteDiagramWidget implements Widget { && !"from".equals(type)) { return false; } - String uri = node.treeNode.info.uri; + String baseUri = getBaseUri(node.treeNode.info); + return baseUri != null && linkableEndpoints.contains(baseUri); + } + + private static String getBaseUri(RouteDiagramLayoutEngine.NodeInfo info) { + String uri = info.uri; if (uri == null) { - return false; + String code = info.code; + if (code == null) { + return null; + } + int open = code.indexOf('['); + int close = code.lastIndexOf(']'); + uri = (open >= 0 && close > open) ? code.substring(open + 1, close) : code; } int q = uri.indexOf('?'); - String baseUri = q >= 0 ? uri.substring(0, q) : uri; - return linkableEndpoints.contains(baseUri); + return q >= 0 ? uri.substring(0, q) : uri; } private int toRow(int pixelY) {
