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 {

Reply via email to