This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 50eef37fa00fe3d159300df4a7ac0d57091b792a Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br> AuthorDate: Tue Jul 11 23:54:17 2023 -0300 TAP5-2742: fixing ComponentDependencyGraphvizGeneratorImpl and some Graphviz's Javadoc --- .../tapestry5/corelib/components/Graphviz.java | 3 +- .../ComponentDependencyGraphvizGeneratorImpl.java | 70 +++++++++++++++------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java index 8fd74f4c8..f0647bab7 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java @@ -28,9 +28,10 @@ import org.apache.tapestry5.services.javascript.JavaScriptSupport; /** * Component that renders a <a href="http://graphviz.org">Graphviz</a> graph using * <a href="https://www.npmjs.com/package/@hpcc-js/wasm">@hpcc-js/wasm</a>. It's mostly - * intended to be used internally at Tapestry, hence the lack of options. + * intended to be used internally at Tapestry, hence the limited set of options. * * @tapestrydoc + * @since 5.8.3 */ public class Graphviz { diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java index 908633b9d..24671c003 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java @@ -13,8 +13,14 @@ // limitations under the License. package org.apache.tapestry5.internal.services; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.tapestry5.internal.services.ComponentDependencyRegistry.DependencyType; @@ -26,7 +32,6 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend final private ComponentDependencyRegistry componentDependencyRegistry; - public ComponentDependencyGraphvizGeneratorImpl(ComponentDependencyRegistry componentDependencyRegistry, ComponentClassResolver componentClassResolver) { @@ -48,30 +53,40 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend dotFile.append("\tnode [shape=rect];\n\n"); final Set<String> allClasses = new HashSet<>(); +// final Set<String> dependenciesAlreadyOutput = new HashSet<>(); + final Map<String, Node> nodeMap = new HashMap<>(); for (String className : classNames) { - final Node node = createNode(componentClassResolver.getLogicalName(className), className); - dotFile.append(getNodeDefinition(node)); + createNode(className, nodeMap); for (DependencyType dependencyType : DependencyType.values()) { - addDependencies(className, allClasses, dependencyType); + addDependencies(className, allClasses, dependencyType, nodeMap); } - final StringBuilder dependencySection = new StringBuilder(); - + + } + + final List<Node> nodes = new ArrayList<>(nodeMap.values()); + Collections.sort(nodes, Comparator.comparing(n -> n.id)); + + for (Node node : nodes) + { + dotFile.append(getNodeDefinition(node)); + } + + dotFile.append("\n"); + + for (Node node : nodes) + { for (Dependency dependency : node.dependencies) { - dependencySection.append(getNodeDependencyDefinition(node, dependency.className, dependency.type)); + dotFile.append(getNodeDependencyDefinition(node, dependency.className, dependency.type)); } - - dotFile.append("\n"); - dotFile.append(dependencySection); - dotFile.append("\n"); - } - + + dotFile.append("\n"); dotFile.append("}"); return dotFile.toString(); @@ -126,30 +141,34 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend return label.replace('.', '_').replace('/', '_'); } - private void addDependencies(String className, Set<String> allClasses, DependencyType type) + private void addDependencies(String className, Set<String> allClasses, DependencyType type, Map<String, Node> nodeMap) { if (!allClasses.contains(className)) { - allClasses.add(className); + createNode(className, nodeMap); for (String dependency : componentDependencyRegistry.getDependencies(className, type)) { - addDependencies(dependency, allClasses, type); + addDependencies(dependency, allClasses, type, nodeMap); } + allClasses.add(className); } } - private Node createNode(String logicalName, String className) + private void createNode(String className, Map<String, Node> nodeMap) { - Collection<Dependency> deps = new HashSet<>(); - for (DependencyType type : DependencyType.values()) + if (!nodeMap.containsKey(className)) { - final Set<String> dependencies = componentDependencyRegistry.getDependencies(className, type); - for (String dependency : dependencies) + Collection<Dependency> deps = new HashSet<>(); + for (DependencyType type : DependencyType.values()) { - deps.add(new Dependency(dependency, type)); + final Set<String> dependencies = componentDependencyRegistry.getDependencies(className, type); + for (String dependency : dependencies) + { + deps.add(new Dependency(dependency, type)); + } } + nodeMap.put(className, new Node(getNodeLabel(className), className, deps)); } - return new Node(logicalName, className, deps); } private static final class Dependency @@ -162,6 +181,11 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend this.className = className; this.type = type; } + @Override + public String toString() + { + return "Dependency [className=" + className + ", type=" + type + "]"; + } } private static final class Node {