in spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/src/main/java/com/alibaba/cloud/ai/graph/DiagramGenerator.java [191:270]
protected final Context generate(StateGraph.Nodes nodes, StateGraph.Edges edges, Context ctx) {
appendHeader(ctx);
for (var n : nodes.elements) {
if (n instanceof SubGraphNode subGraphNode) {
@SuppressWarnings("unchecked")
var subGraph = (StateGraph) subGraphNode.subGraph();
Context subgraphCtx = generate(subGraph.nodes, subGraph.edges,
Context.builder()
.title(n.id())
.printConditionalEdge(ctx.printConditionalEdge)
.isSubGraph(true)
.build());
ctx.sb().append(subgraphCtx);
}
else {
declareNode(ctx, n.id());
}
}
final int[] conditionalEdgeCount = { 0 };
edges.elements.stream()
.filter(e -> !Objects.equals(e.sourceId(), START))
.filter(e -> !e.isParallel())
.forEach(e -> {
if (e.target().value() != null) {
conditionalEdgeCount[0] += 1;
commentLine(ctx, !ctx.printConditionalEdge());
declareConditionalEdge(ctx, conditionalEdgeCount[0]);
}
});
var edgeStart = edges.elements.stream()
.filter(e -> Objects.equals(e.sourceId(), START))
.findFirst()
.orElseThrow();
if (edgeStart.isParallel()) {
edgeStart.targets().forEach(target -> {
call(ctx, START, target.id(), CallStyle.START);
});
}
else if (edgeStart.target().id() != null) {
call(ctx, START, edgeStart.target().id(), CallStyle.START);
}
else if (edgeStart.target().value() != null) {
String conditionName = "startcondition";
commentLine(ctx, !ctx.printConditionalEdge());
declareConditionalStart(ctx, conditionName);
edgeCondition(ctx, edgeStart.target().value(), START, conditionName);
}
conditionalEdgeCount[0] = 0; // reset
edges.elements.stream().filter(e -> !Objects.equals(e.sourceId(), START)).forEach(v -> {
if (v.isParallel()) {
v.targets().forEach(target -> {
call(ctx, v.sourceId(), target.id(), CallStyle.PARALLEL);
});
}
else if (v.target().id() != null) {
call(ctx, v.sourceId(), v.target().id(), CallStyle.DEFAULT);
}
else if (v.target().value() != null) {
conditionalEdgeCount[0] += 1;
String conditionName = format("condition%d", conditionalEdgeCount[0]);
edgeCondition(ctx, v.targets().get(0).value(), v.sourceId(), conditionName);
}
});
appendFooter(ctx);
return ctx;
}