From b304631a4080de213fdfe3ff031c8e8245076d7b Mon Sep 17 00:00:00 2001 From: Ndacyayisenga-droid Date: Tue, 20 May 2025 16:43:28 +0300 Subject: [PATCH 1/2] Fix [MDEP-931] Replace PrintWriter with Writer in AbstractSerializingVisitor and subclasses --- .../tree/AbstractSerializingVisitor.java | 9 +-- .../tree/DOTDependencyNodeVisitor.java | 36 +++++++----- .../tree/GraphmlDependencyNodeVisitor.java | 56 +++++++++++-------- .../tree/JsonDependencyNodeVisitor.java | 29 +++++++--- .../tree/TGFDependencyNodeVisitor.java | 49 ++++++++++------ 5 files changed, 111 insertions(+), 68 deletions(-) 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 8f8f40ed81..32ec088378 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 238a62ae6a..dec8115867 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,7 @@ */ package org.apache.maven.plugins.dependency.tree; +import java.io.IOException; import java.io.Writer; import java.util.List; @@ -47,19 +48,23 @@ public DOTDependencyNodeVisitor(Writer writer) { */ @Override public boolean visit(DependencyNode node) { - if (node.getParent() == null || node.getParent() == node) { - writer.write("digraph \"" + node.toNodeString() + "\" { " + System.lineSeparator()); - } - - // Generate "currentNode -> Child" lines + try { + if (node.getParent() == null || node.getParent() == node) { + writer.write("digraph \"" + node.toNodeString() + "\" { " + System.lineSeparator()); + } - List children = node.getChildren(); + // Generate "currentNode -> Child" lines - for (DependencyNode child : children) { - writer.println("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; "); + List children = node.getChildren(); + for (DependencyNode child : children) { + writer.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; " + + System.lineSeparator()); + } + writer.flush(); + return true; + } catch (IOException e) { + throw new RuntimeException("Failed to write to DOT output", e); } - - return true; } /** @@ -67,9 +72,14 @@ public boolean visit(DependencyNode node) { */ @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(" } "); + writer.flush(); + } + return true; + } catch (IOException e) { + throw new RuntimeException("Failed to write to DOT 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 77c55c4131..413b880407 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,7 @@ */ package org.apache.maven.plugins.dependency.tree; +import java.io.IOException; import java.io.Writer; import org.apache.maven.shared.dependency.graph.DependencyNode; @@ -63,37 +64,48 @@ public GraphmlDependencyNodeVisitor(Writer writer) { * {@inheritDoc} */ @Override - public boolean endVisit(DependencyNode node) { - if (node.getParent() == null || node.getParent() == node) { - writer.write(GRAPHML_FOOTER); - } else { - DependencyNode p = node.getParent(); - writer.print(""); - if (node.getArtifact().getScope() != null) { - // add Edge label - writer.print("" - + node.getArtifact().getScope() + ""); + public boolean visit(DependencyNode node) { + try { + if (node.getParent() == null || node.getParent() == node) { + writer.write(GRAPHML_HEADER); } - writer.println(""); + // write node + writer.write(""); + // add node label + writer.write("" + node.toNodeString() + + ""); + writer.write("" + System.lineSeparator()); + writer.flush(); + return true; + } catch (IOException e) { + throw new RuntimeException("Failed to write GraphML node", e); } - return true; } /** * {@inheritDoc} */ @Override - public boolean visit(DependencyNode node) { - if (node.getParent() == null || node.getParent() == node) { - writer.write(GRAPHML_HEADER); + public boolean endVisit(DependencyNode node) { + try { + if (node.getParent() == null || node.getParent() == node) { + writer.write(GRAPHML_FOOTER); + writer.flush(); + } else { + DependencyNode p = node.getParent(); + writer.write(""); + if (node.getArtifact().getScope() != null) { + // add Edge label + writer.write("" + + node.getArtifact().getScope() + ""); + } + writer.write("" + System.lineSeparator()); + writer.flush(); + } + return true; + } catch (IOException e) { + throw new RuntimeException("Failed to write GraphML edge or footer", e); } - // write node - writer.print(""); - // add node label - writer.print("" + node.toNodeString() - + ""); - writer.println(""); - 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 015ce1b2d4..ff97024abd 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,7 @@ */ package org.apache.maven.plugins.dependency.tree; +import java.io.IOException; import java.io.Writer; import java.util.HashSet; import java.util.Set; @@ -56,13 +57,18 @@ public boolean visit(DependencyNode node) { * @param node the node to write */ private void writeRootNode(DependencyNode node) { - Set visited = new HashSet<>(); - int indent = 2; - StringBuilder sb = new StringBuilder(); - sb.append("{").append("\n"); - writeNode(indent, node, sb, visited); - sb.append("}").append("\n"); - writer.write(sb.toString()); + try { + Set visited = new HashSet<>(); + int indent = 2; + StringBuilder sb = new StringBuilder(); + sb.append("{").append("\n"); + writeNode(indent, node, sb, visited); + sb.append("}").append("\n"); + writer.write(sb.toString()); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException("Failed to write JSON output", e); + } } /** * Appends the node and its children to the string builder. @@ -110,7 +116,14 @@ private void writeChildren(int indent, DependencyNode node, StringBuilder sb, Se @Override public boolean endVisit(DependencyNode node) { - return true; + try { + if (node.getParent() == null || node.getParent() == node) { + writer.flush(); + } + return true; + } catch (IOException e) { + throw new RuntimeException("Failed to flush JSON output", e); + } } /** * Appends the artifact values to the string builder. 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 48ebfb0e9d..5b03484e88 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,7 @@ */ package org.apache.maven.plugins.dependency.tree; +import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; @@ -101,31 +102,43 @@ public TGFDependencyNodeVisitor(Writer writer) { * {@inheritDoc} */ @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()); - } - } else { - DependencyNode p = node.getParent(); - // using scope as edge label. - edges.add(new EdgeAppender(p, node, node.getArtifact().getScope())); + public boolean visit(DependencyNode node) { + 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 RuntimeException("Failed to write TGF node", e); } - return true; } /** * {@inheritDoc} */ @Override - public boolean visit(DependencyNode node) { - // write node - writer.write(generateId(node)); - writer.write(" "); - writer.println(node.toNodeString()); - return true; + public boolean endVisit(DependencyNode node) { + 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()); + writer.write(System.lineSeparator()); + } + writer.flush(); + } 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 RuntimeException("Failed to write TGF edges or footer", e); + } } /** From ef1a74d88431973452adc14bbcae17496b96ca2c Mon Sep 17 00:00:00 2001 From: Ndacyayisenga-droid Date: Fri, 30 May 2025 02:57:54 +0300 Subject: [PATCH 2/2] Replace PrintWriter with Writer in AbstractSerializing Visitor and subclasses --- .../tree/DOTDependencyNodeVisitor.java | 21 ++++++++---- .../tree/GraphmlDependencyNodeVisitor.java | 33 ++++++++++++------- .../tree/JsonDependencyNodeVisitor.java | 12 +++++-- .../tree/TGFDependencyNodeVisitor.java | 33 ++++++++++++------- 4 files changed, 66 insertions(+), 33 deletions(-) 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 dec8115867..9f7602ebe2 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 @@ -19,6 +19,8 @@ package org.apache.maven.plugins.dependency.tree; import java.io.IOException; +import java.io.StringWriter; +import java.io.UncheckedIOException; import java.io.Writer; import java.util.List; @@ -49,6 +51,7 @@ public DOTDependencyNodeVisitor(Writer writer) { @Override public boolean visit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); if (node.getParent() == null || node.getParent() == node) { writer.write("digraph \"" + node.toNodeString() + "\" { " + System.lineSeparator()); } @@ -57,13 +60,15 @@ public boolean visit(DependencyNode node) { List children = node.getChildren(); for (DependencyNode child : children) { - writer.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; " - + System.lineSeparator()); + stringWriter.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ;\n"); } + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); writer.flush(); return true; } catch (IOException e) { - throw new RuntimeException("Failed to write to DOT output", e); + throw new UncheckedIOException("Failed to write to DOT output", e); } } @@ -73,13 +78,17 @@ public boolean visit(DependencyNode node) { @Override public boolean endVisit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); if (node.getParent() == null || node.getParent() == node) { - writer.write(" } "); - writer.flush(); + stringWriter.write("}\n"); } + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); + writer.flush(); return true; } catch (IOException e) { - throw new RuntimeException("Failed to write to DOT output", e); + throw new UncheckedIOException("Failed to write to DOT output", e); } } } 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 413b880407..a8efd6ffcb 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 @@ -19,6 +19,8 @@ package org.apache.maven.plugins.dependency.tree; import java.io.IOException; +import java.io.StringWriter; +import java.io.UncheckedIOException; import java.io.Writer; import org.apache.maven.shared.dependency.graph.DependencyNode; @@ -66,19 +68,23 @@ public GraphmlDependencyNodeVisitor(Writer writer) { @Override public boolean visit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); if (node.getParent() == null || node.getParent() == node) { - writer.write(GRAPHML_HEADER); + stringWriter.write(GRAPHML_HEADER); } // write node - writer.write(""); + stringWriter.write(""); // add node label - writer.write("" + node.toNodeString() + stringWriter.write("" + node.toNodeString() + ""); - writer.write("" + System.lineSeparator()); + stringWriter.write("\n"); + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); writer.flush(); return true; } catch (IOException e) { - throw new RuntimeException("Failed to write GraphML node", e); + throw new UncheckedIOException("Failed to write GraphML node", e); } } @@ -88,23 +94,26 @@ public boolean visit(DependencyNode node) { @Override public boolean endVisit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); if (node.getParent() == null || node.getParent() == node) { - writer.write(GRAPHML_FOOTER); - writer.flush(); + stringWriter.write(GRAPHML_FOOTER); } else { DependencyNode p = node.getParent(); - writer.write(""); + stringWriter.write(""); if (node.getArtifact().getScope() != null) { // add Edge label - writer.write("" + stringWriter.write("" + node.getArtifact().getScope() + ""); } - writer.write("" + System.lineSeparator()); - writer.flush(); + stringWriter.write("\n"); } + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); + writer.flush(); return true; } catch (IOException e) { - throw new RuntimeException("Failed to write GraphML edge or footer", e); + throw new UncheckedIOException("Failed to write GraphML edge or footer", e); } } 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 ff97024abd..8b72adb553 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 @@ -19,6 +19,7 @@ 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; @@ -58,18 +59,19 @@ public boolean visit(DependencyNode node) { */ private void writeRootNode(DependencyNode node) { try { + StringBuilder sb = new StringBuilder(); Set visited = new HashSet<>(); int indent = 2; - StringBuilder sb = new StringBuilder(); sb.append("{").append("\n"); writeNode(indent, node, sb, visited); sb.append("}").append("\n"); writer.write(sb.toString()); writer.flush(); } catch (IOException e) { - throw new RuntimeException("Failed to write JSON output", e); + throw new UncheckedIOException("Failed to write JSON output", e); } } + /** * Appends the node and its children to the string builder. * @@ -89,6 +91,7 @@ private void writeNode(int indent, DependencyNode node, StringBuilder sb, SetJerome Creignou */ @@ -104,15 +106,19 @@ public TGFDependencyNodeVisitor(Writer writer) { @Override public boolean visit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); // write node - writer.write(generateId(node)); - writer.write(" "); - writer.write(node.toNodeString()); - writer.write(System.lineSeparator()); + stringWriter.write(generateId(node)); + stringWriter.write(" "); + stringWriter.write(node.toNodeString()); + stringWriter.write("\n"); + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); writer.flush(); return true; } catch (IOException e) { - throw new RuntimeException("Failed to write TGF node", e); + throw new UncheckedIOException("Failed to write TGF node", e); } } @@ -122,22 +128,25 @@ public boolean visit(DependencyNode node) { @Override public boolean endVisit(DependencyNode node) { try { + StringWriter stringWriter = new StringWriter(); if (node.getParent() == null || node.getParent() == node) { // dump edges on last node endVisit - writer.write("#" + System.lineSeparator()); + stringWriter.write("#\n"); for (EdgeAppender edge : edges) { - writer.write(edge.toString()); - writer.write(System.lineSeparator()); + stringWriter.write(edge.toString()); } + + // Write the accumulated output to the provided writer + writer.write(stringWriter.toString()); writer.flush(); } else { - DependencyNode p = node.getParent(); + DependencyNode parent = node.getParent(); // using scope as edge label. - edges.add(new EdgeAppender(p, node, node.getArtifact().getScope())); + edges.add(new EdgeAppender(parent, node, node.getArtifact().getScope())); } return true; } catch (IOException e) { - throw new RuntimeException("Failed to write TGF edges or footer", e); + throw new UncheckedIOException("Failed to write TGF edges or footer", e); } }