From fee9b4bd834920bdd31da8a3ddb34a6399a69623 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Fri, 27 Mar 2026 20:11:25 +0100 Subject: [PATCH] fix: skip edges that cross ELK root graph boundaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Edges connecting main flow nodes to handler section nodes (ON_EXCEPTION, ON_COMPLETION) now span different ELK root graphs. ELK throws UnsupportedGraphException when an edge connects nodes in different layout hierarchies. Skip these cross-root edges — the frontend doesn't render them anyway (handler sections are separated visually). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../app/diagram/ElkDiagramRenderer.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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 1d2d9722..506a81ab 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 @@ -250,7 +250,8 @@ public class ElkDiagramRenderer implements DiagramRenderer { handlerRoots.add(handlerRoot); } - // Create ELK edges + // Create ELK edges — skip edges that cross between different ELK root graphs + // (e.g., main flow → handler section). These cannot be laid out by ELK. if (graph.getEdges() != null) { for (RouteEdge re : graph.getEdges()) { ElkNode sourceElk = elkNodeMap.get(re.getSource()); @@ -259,6 +260,13 @@ public class ElkDiagramRenderer implements DiagramRenderer { continue; } + // Skip edges that cross ELK root boundaries + ElkNode sourceRoot = getElkRoot(sourceElk); + ElkNode targetRoot = getElkRoot(targetElk); + if (sourceRoot != targetRoot) { + continue; + } + // Determine the containing node for the edge ElkNode containingNode = findCommonParent(sourceElk, targetElk); @@ -542,6 +550,15 @@ public class ElkDiagramRenderer implements DiagramRenderer { // ELK graph helpers // ---------------------------------------------------------------- + /** Walk up to the top-level root of an ELK node's hierarchy. */ + private ElkNode getElkRoot(ElkNode node) { + ElkNode current = node; + while (current.getParent() != null) { + current = current.getParent(); + } + return current; + } + private ElkNode findCommonParent(ElkNode a, ElkNode b) { if (a.getParent() == b.getParent()) { return a.getParent();