You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sj...@apache.org on 2025/08/10 13:08:27 UTC

(maven-dependency-plugin) branch master updated: Fix [MDEP-931] Replace PrintWriter with Writer in AbstractSerializing Visitor and subclasses (#530)

This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new bed92902 Fix [MDEP-931] Replace PrintWriter with Writer in AbstractSerializing Visitor and subclasses (#530)
bed92902 is described below

commit bed92902d2f51f1931ec44d4357e1f56e90da700
Author: Noah Tayebwa <nd...@gmail.com>
AuthorDate: Sun Aug 10 16:08:23 2025 +0300

    Fix [MDEP-931] Replace PrintWriter with Writer in AbstractSerializing Visitor and subclasses (#530)
---
 .../verify.bsh                                     |  4 +-
 .../dependency/analyze/AnalyzeDuplicateMojo.java   |  4 +-
 .../tree/AbstractSerializingVisitor.java           |  9 +---
 .../dependency/tree/DOTDependencyNodeVisitor.java  | 32 +++++++++----
 .../tree/GraphmlDependencyNodeVisitor.java         | 53 ++++++++++++++--------
 .../dependency/tree/JsonDependencyNodeVisitor.java | 32 ++++++++-----
 .../dependency/tree/TGFDependencyNodeVisitor.java  | 45 +++++++++++-------
 .../plugins/dependency/tree/TestTreeMojo.java      |  2 +-
 8 files changed, 112 insertions(+), 69 deletions(-)

diff --git a/src/it/projects/mdep-779-analyze-only-verbose-shows-class-names/verify.bsh b/src/it/projects/mdep-779-analyze-only-verbose-shows-class-names/verify.bsh
index 97e83753..7632bd75 100644
--- a/src/it/projects/mdep-779-analyze-only-verbose-shows-class-names/verify.bsh
+++ b/src/it/projects/mdep-779-analyze-only-verbose-shows-class-names/verify.bsh
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
diff --git a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
index 9ad7de2c..1d59ff8d 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
@@ -122,7 +122,7 @@ public class AnalyzeDuplicateMojo extends AbstractMojo {
             Set<String> duplicateDependencies, StringBuilder sb, String messageDuplicateDepInDependencies) {
         if (!duplicateDependencies.isEmpty()) {
             if (sb.length() > 0) {
-                sb.append("\n");
+                sb.append(System.lineSeparator());
             }
             sb.append(messageDuplicateDepInDependencies);
             for (Iterator<String> it = duplicateDependencies.iterator(); it.hasNext(); ) {
@@ -130,7 +130,7 @@ public class AnalyzeDuplicateMojo extends AbstractMojo {
 
                 sb.append("\to ").append(dup);
                 if (it.hasNext()) {
-                    sb.append("\n");
+                    sb.append(System.lineSeparator());
                 }
             }
         }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/AbstractSerializingVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/AbstractSerializingVisitor.java
index 8f8f40ed..32ec0883 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/AbstractSerializingVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/AbstractSerializingVisitor.java
@@ -18,7 +18,6 @@
  */
 package org.apache.maven.plugins.dependency.tree;
 
-import java.io.PrintWriter;
 import java.io.Writer;
 
 /**
@@ -31,7 +30,7 @@ public abstract class AbstractSerializingVisitor {
     /**
      * The writer to serialize to.
      */
-    protected final PrintWriter writer;
+    protected final Writer writer;
 
     /**
      * Constructor.
@@ -42,10 +41,6 @@ public abstract class AbstractSerializingVisitor {
      * @param writer the writer to serialize to.
      */
     public AbstractSerializingVisitor(Writer writer) {
-        if (writer instanceof PrintWriter) {
-            this.writer = (PrintWriter) writer;
-        } else {
-            this.writer = new PrintWriter(writer, true);
-        }
+        this.writer = writer;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/DOTDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/DOTDependencyNodeVisitor.java
index 238a62ae..5cc8f86c 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/DOTDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/DOTDependencyNodeVisitor.java
@@ -18,6 +18,8 @@
  */
 package org.apache.maven.plugins.dependency.tree;
 
+import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.Writer;
 import java.util.List;
 
@@ -47,16 +49,23 @@ public class DOTDependencyNodeVisitor extends AbstractSerializingVisitor impleme
      */
     @Override
     public boolean visit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            writer.write("digraph \"" + node.toNodeString() + "\" { " + System.lineSeparator());
-        }
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                writer.write("digraph \"" + node.toNodeString() + "\" { " + System.lineSeparator());
+                writer.flush();
+            }
 
-        // Generate "currentNode -> Child" lines
+            // Generate "currentNode -> Child" lines
 
-        List<DependencyNode> children = node.getChildren();
+            List<DependencyNode> children = node.getChildren();
 
-        for (DependencyNode child : children) {
-            writer.println("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; ");
+            for (DependencyNode child : children) {
+                writer.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; "
+                        + System.lineSeparator());
+            }
+            writer.flush();
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write DOT format output", e);
         }
 
         return true;
@@ -67,8 +76,13 @@ public class DOTDependencyNodeVisitor extends AbstractSerializingVisitor impleme
      */
     @Override
     public boolean endVisit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            writer.write(" } ");
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                writer.write(" } " + System.lineSeparator());
+                writer.flush();
+            }
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write DOT format output", e);
         }
         return true;
     }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/GraphmlDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/GraphmlDependencyNodeVisitor.java
index 77c55c41..c6c600fa 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/GraphmlDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/GraphmlDependencyNodeVisitor.java
@@ -18,6 +18,8 @@
  */
 package org.apache.maven.plugins.dependency.tree;
 
+import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.Writer;
 
 import org.apache.maven.shared.dependency.graph.DependencyNode;
@@ -64,19 +66,24 @@ public class GraphmlDependencyNodeVisitor extends AbstractSerializingVisitor imp
      */
     @Override
     public boolean endVisit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            writer.write(GRAPHML_FOOTER);
-        } else {
-            DependencyNode p = node.getParent();
-            writer.print("<edge source=\"" + generateId(p) + "\" target=\"" + generateId(node) + "\">");
-            if (node.getArtifact().getScope() != null) {
-                // add Edge label
-                writer.print("<data key=\"d1\"><y:PolyLineEdge><y:EdgeLabel>"
-                        + node.getArtifact().getScope() + "</y:EdgeLabel></y:PolyLineEdge></data>");
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                writer.write(GRAPHML_FOOTER);
+            } else {
+                DependencyNode p = node.getParent();
+                writer.write("<edge source=\"" + generateId(p) + "\" target=\"" + generateId(node) + "\">");
+                if (node.getArtifact().getScope() != null) {
+                    // add Edge label
+                    writer.write("<data key=\"d1\"><y:PolyLineEdge><y:EdgeLabel>"
+                            + node.getArtifact().getScope() + "</y:EdgeLabel></y:PolyLineEdge></data>");
+                }
+                writer.write("</edge>" + System.lineSeparator());
             }
-            writer.println("</edge>");
+            writer.flush();
+            return true;
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write GraphML format output", e);
         }
-        return true;
     }
 
     /**
@@ -84,16 +91,22 @@ public class GraphmlDependencyNodeVisitor extends AbstractSerializingVisitor imp
      */
     @Override
     public boolean visit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            writer.write(GRAPHML_HEADER);
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                writer.write(GRAPHML_HEADER);
+                writer.flush();
+            }
+            // write node
+            writer.write("<node id=\"" + generateId(node) + "\">");
+            // add node label
+            writer.write("<data key=\"d0\"><y:ShapeNode><y:NodeLabel>" + node.toNodeString()
+                    + "</y:NodeLabel></y:ShapeNode></data>");
+            writer.write("</node>" + System.lineSeparator());
+            writer.flush();
+            return true;
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write GraphML format output", e);
         }
-        // write node
-        writer.print("<node id=\"" + generateId(node) + "\">");
-        // add node label
-        writer.print("<data key=\"d0\"><y:ShapeNode><y:NodeLabel>" + node.toNodeString()
-                + "</y:NodeLabel></y:ShapeNode></data>");
-        writer.println("</node>");
-        return true;
     }
 
     /**
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/JsonDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/JsonDependencyNodeVisitor.java
index 33392821..5faefbf1 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/JsonDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/JsonDependencyNodeVisitor.java
@@ -18,6 +18,8 @@
  */
 package org.apache.maven.plugins.dependency.tree;
 
+import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.Writer;
 import java.util.HashSet;
 import java.util.Set;
@@ -44,25 +46,31 @@ public class JsonDependencyNodeVisitor extends AbstractSerializingVisitor implem
 
     @Override
     public boolean visit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            writeRootNode(node);
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                writeRootNode(node);
+            }
+            return true;
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write JSON format output", e);
         }
-        return true;
     }
 
     /**
      * Writes the node to the writer. This method is recursive and will write all children nodes.
      *
      * @param node  the node to write
+     * @throws IOException if an I/O error occurs while writing
      */
-    private void writeRootNode(DependencyNode node) {
+    private void writeRootNode(DependencyNode node) throws IOException {
         Set<DependencyNode> visited = new HashSet<>();
         int indent = 2;
         StringBuilder sb = new StringBuilder();
-        sb.append("{").append("\n");
+        sb.append("{").append(System.lineSeparator());
         writeNode(indent, node, sb, visited);
-        sb.append("}").append("\n");
+        sb.append("}").append(System.lineSeparator());
         writer.write(sb.toString());
+        writer.flush();
     }
     /**
      * Appends the node and its children to the string builder.
@@ -91,21 +99,21 @@ public class JsonDependencyNodeVisitor extends AbstractSerializingVisitor implem
      * @param sb  the string builder to append to
      */
     private void writeChildren(int indent, DependencyNode node, StringBuilder sb, Set<DependencyNode> visited) {
-        sb.append(indent(indent)).append("\"children\": [").append("\n");
+        sb.append(indent(indent)).append("\"children\": [").append(System.lineSeparator());
         indent += 2;
         for (int i = 0; i < node.getChildren().size(); i++) {
             DependencyNode child = node.getChildren().get(i);
             sb.append(indent(indent));
-            sb.append("{").append("\n");
+            sb.append("{").append(System.lineSeparator());
             writeNode(indent + 2, child, sb, visited);
             sb.append(indent(indent)).append("}");
             // we skip the comma for the last child
             if (i != node.getChildren().size() - 1) {
                 sb.append(",");
             }
-            sb.append("\n");
+            sb.append(System.lineSeparator());
         }
-        sb.append(indent(indent)).append("]").append("\n");
+        sb.append(indent(indent)).append("]").append(System.lineSeparator());
     }
 
     @Override
@@ -156,7 +164,7 @@ public class JsonDependencyNodeVisitor extends AbstractSerializingVisitor implem
                 .append(value)
                 .append("\"")
                 .append(",")
-                .append("\n");
+                .append(System.lineSeparator());
     }
     /**
      * Appends a key value pair to the string builder without a comma at the end. This is used for the last children of a node.
@@ -180,7 +188,7 @@ public class JsonDependencyNodeVisitor extends AbstractSerializingVisitor implem
                 .append("\"")
                 .append(value)
                 .append("\"")
-                .append("\n");
+                .append(System.lineSeparator());
     }
 
     /**
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
index 48ebfb0e..c2fb62fd 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
@@ -18,6 +18,8 @@
  */
 package org.apache.maven.plugins.dependency.tree;
 
+import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.List;
@@ -35,7 +37,7 @@ import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
 public class TGFDependencyNodeVisitor extends AbstractSerializingVisitor implements DependencyNodeVisitor {
 
     /**
-     * Utiity class to write an Edge.
+     * Utility class to write an Edge.
      *
      * @author <a href="mailto:jerome.creignou@gmail.com">Jerome Creignou</a>
      */
@@ -102,18 +104,23 @@ public class TGFDependencyNodeVisitor extends AbstractSerializingVisitor impleme
      */
     @Override
     public boolean endVisit(DependencyNode node) {
-        if (node.getParent() == null || node.getParent() == node) {
-            // dump edges on last node endVisit
-            writer.println("#");
-            for (EdgeAppender edge : edges) {
-                writer.println(edge.toString());
+        try {
+            if (node.getParent() == null || node.getParent() == node) {
+                // dump edges on last node endVisit
+                writer.write("#" + System.lineSeparator());
+                for (EdgeAppender edge : edges) {
+                    writer.write(edge.toString() + System.lineSeparator());
+                }
+                writer.flush();
+            } else {
+                DependencyNode parent = node.getParent();
+                // using scope as edge label.
+                edges.add(new EdgeAppender(parent, node, node.getArtifact().getScope()));
             }
-        } else {
-            DependencyNode p = node.getParent();
-            // using scope as edge label.
-            edges.add(new EdgeAppender(p, node, node.getArtifact().getScope()));
+            return true;
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write TGF format output", e);
         }
-        return true;
     }
 
     /**
@@ -121,11 +128,17 @@ public class TGFDependencyNodeVisitor extends AbstractSerializingVisitor impleme
      */
     @Override
     public boolean visit(DependencyNode node) {
-        // write node
-        writer.write(generateId(node));
-        writer.write(" ");
-        writer.println(node.toNodeString());
-        return true;
+        try {
+            // Write node
+            writer.write(generateId(node));
+            writer.write(" ");
+            writer.write(node.toNodeString());
+            writer.write(System.lineSeparator());
+            writer.flush();
+            return true;
+        } catch (IOException e) {
+            throw new UncheckedIOException("Failed to write TGF format output", e);
+        }
     }
 
     /**
diff --git a/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java b/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
index b336afd2..6cfa0ef9 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
@@ -190,7 +190,7 @@ public class TestTreeMojo extends AbstractDependencyMojoTestCase {
         List<String> contents = runTreeMojo("tree2.json", "json");
 
         System.setProperty("jakarta.json.provider", "org.glassfish.json.JsonProviderImpl");
-        try (JsonReader reader = Json.createReader(new StringReader(String.join("\n", contents)))) {
+        try (JsonReader reader = Json.createReader(new StringReader(String.join(System.lineSeparator(), contents)))) {
             JsonObject root = reader.readObject();
 
             assertEquals(root.getString("groupId"), "testGroupId");