diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java index c8ca65e4..4c6bd085 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java @@ -295,19 +295,20 @@ public class ElkDiagramRenderer implements DiagramRenderer { // Create ELK edges — skip edges that cross between different ELK root graphs if (graph.getEdges() != null) { for (RouteEdge re : graph.getEdges()) { - // Skip all edges originating from DO_TRY nodes — these are entry/handler - // edges that don't need layout (try body has its own internal flow, - // handler edges are like route-level ON_EXCEPTION edges) - if (doTryNodeIds.contains(re.getSource())) { - continue; - } - ElkNode sourceElk = elkNodeMap.get(re.getSource()); ElkNode targetElk = elkNodeMap.get(re.getTarget()); if (sourceElk == null || targetElk == null) { continue; } + // Skip edges from DO_TRY to its own children (entry + handler edges). + // Keep edges from DO_TRY to nodes OUTSIDE it (continuation edges). + if (doTryNodeIds.contains(re.getSource())) { + if (isDescendantOf(targetElk, sourceElk)) { + continue; + } + } + // Skip edges that cross ELK root boundaries ElkNode sourceRoot = getElkRoot(sourceElk); ElkNode targetRoot = getElkRoot(targetElk); @@ -717,6 +718,16 @@ public class ElkDiagramRenderer implements DiagramRenderer { // ---------------------------------------------------------------- /** Walk up to the top-level root of an ELK node's hierarchy. */ + /** Check if 'child' is a descendant of 'ancestor' in the ELK node hierarchy. */ + private boolean isDescendantOf(ElkNode child, ElkNode ancestor) { + ElkNode current = child.getParent(); + while (current != null) { + if (current == ancestor) return true; + current = current.getParent(); + } + return false; + } + private ElkNode getElkRoot(ElkNode node) { ElkNode current = node; while (current.getParent() != null) {