From da1730cd51c747ceb53dd1b5ab5af0455bcfa587 Mon Sep 17 00:00:00 2001 From: Ndacyayisenga-droid Date: Tue, 20 May 2025 16:43:28 +0300 Subject: [PATCH 1/3] Fix [MDEP-931] Replace PrintWriter with Writer in AbstractSerializingVisitor and subclasses Replace PrintWriter with Writer in AbstractSerializing Visitor and subclasses Only use writer --- .../tree/AbstractSerializingVisitor.java | 9 +--- .../tree/DOTDependencyNodeVisitor.java | 31 +++++++---- .../tree/GraphmlDependencyNodeVisitor.java | 53 ++++++++++++------- .../tree/JsonDependencyNodeVisitor.java | 16 ++++-- .../tree/TGFDependencyNodeVisitor.java | 45 ++++++++++------ 5 files changed, 98 insertions(+), 56 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..fe602620a9 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,22 @@ public DOTDependencyNodeVisitor(Writer writer) { */ @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 children = node.getChildren(); + List 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() + "\" ; " + "\n"); + } + writer.flush(); + } catch (IOException e) { + throw new UncheckedIOException("Failed to write DOT format output", e); } return true; @@ -67,8 +75,13 @@ 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(" } " + "\n"); + 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 77c55c4131..7b3f8d2a48 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 GraphmlDependencyNodeVisitor(Writer writer) { */ @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() + ""); + try { + if (node.getParent() == null || node.getParent() == node) { + writer.write(GRAPHML_FOOTER); + } else { + DependencyNode p = node.getParent(); + writer.write(""); + if (node.getArtifact().getScope() != null) { + // add Edge label + writer.write("" + + node.getArtifact().getScope() + ""); + } + writer.write("" + "\n"); } - writer.println(""); + writer.flush(); + return true; + } catch (IOException e) { + throw new UncheckedIOException("Failed to write GraphML format output", e); } - return true; } /** @@ -84,16 +91,22 @@ public boolean endVisit(DependencyNode node) { */ @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(""); + // add node label + writer.write("" + node.toNodeString() + + ""); + writer.write("" + "\n"); + writer.flush(); + return true; + } catch (IOException e) { + throw new UncheckedIOException("Failed to write GraphML format output", 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..4323ec26bf 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,18 +46,23 @@ public JsonDependencyNodeVisitor(Writer writer) { @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 visited = new HashSet<>(); int indent = 2; StringBuilder sb = new StringBuilder(); @@ -63,6 +70,7 @@ private void writeRootNode(DependencyNode node) { writeNode(indent, node, sb, visited); sb.append("}").append("\n"); writer.write(sb.toString()); + writer.flush(); } /** * Appends the node and its children 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..3247447835 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 @@ public class TGFDependencyNodeVisitor extends AbstractSerializingVisitor implements DependencyNodeVisitor { /** - * Utiity class to write an Edge. + * Utility class to write an Edge. * * @author Jerome Creignou */ @@ -102,18 +104,23 @@ public TGFDependencyNodeVisitor(Writer writer) { */ @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("#\n"); + for (EdgeAppender edge : edges) { + writer.write(edge.toString() + "\n"); + } + 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 boolean endVisit(DependencyNode node) { */ @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("\n"); + writer.flush(); + return true; + } catch (IOException e) { + throw new UncheckedIOException("Failed to write TGF format output", e); + } } /** From eb50b478c9cb56d24dceaa1f48b7709f06878062 Mon Sep 17 00:00:00 2001 From: Ndacyayisenga-droid Date: Thu, 10 Jul 2025 14:27:28 +0300 Subject: [PATCH 2/3] use System.lineSeparator --- .../maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3247447835..04fefa5ec8 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 @@ -107,7 +107,7 @@ public boolean endVisit(DependencyNode node) { try { if (node.getParent() == null || node.getParent() == node) { // dump edges on last node endVisit - writer.write("#\n"); + writer.write("#" + System.lineSeparator()); for (EdgeAppender edge : edges) { writer.write(edge.toString() + "\n"); } From 9e5792d7efdebdc071e6f3fea913e390377ec623 Mon Sep 17 00:00:00 2001 From: Ndacyayisenga-droid Date: Sun, 13 Jul 2025 21:53:09 +0300 Subject: [PATCH 3/3] Use System.lineSeparator --- .../verify.bsh | 4 ++-- .../dependency/analyze/AnalyzeDuplicateMojo.java | 4 ++-- .../tree/DOTDependencyNodeVisitor.java | 5 +++-- .../tree/GraphmlDependencyNodeVisitor.java | 4 ++-- .../tree/JsonDependencyNodeVisitor.java | 16 ++++++++-------- .../tree/TGFDependencyNodeVisitor.java | 4 ++-- .../plugins/dependency/tree/TestTreeMojo.java | 2 +- 7 files changed, 20 insertions(+), 19 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 b3300d87b9..a5101713ec 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 9ad7de2c63..1d59ff8d64 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 @@ private void createMessage( Set duplicateDependencies, StringBuilder sb, String messageDuplicateDepInDependencies) { if (!duplicateDependencies.isEmpty()) { if (sb.length() > 0) { - sb.append("\n"); + sb.append(System.lineSeparator()); } sb.append(messageDuplicateDepInDependencies); for (Iterator it = duplicateDependencies.iterator(); it.hasNext(); ) { @@ -130,7 +130,7 @@ private void createMessage( 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/DOTDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/DOTDependencyNodeVisitor.java index fe602620a9..5cc8f86c9b 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 @@ -60,7 +60,8 @@ public boolean visit(DependencyNode node) { List children = node.getChildren(); for (DependencyNode child : children) { - writer.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; " + "\n"); + writer.write("\t\"" + node.toNodeString() + "\" -> \"" + child.toNodeString() + "\" ; " + + System.lineSeparator()); } writer.flush(); } catch (IOException e) { @@ -77,7 +78,7 @@ public boolean visit(DependencyNode node) { public boolean endVisit(DependencyNode node) { try { if (node.getParent() == null || node.getParent() == node) { - writer.write(" } " + "\n"); + writer.write(" } " + System.lineSeparator()); writer.flush(); } } catch (IOException 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 7b3f8d2a48..c6c600fa5e 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 @@ -77,7 +77,7 @@ public boolean endVisit(DependencyNode node) { writer.write("" + node.getArtifact().getScope() + ""); } - writer.write("" + "\n"); + writer.write("" + System.lineSeparator()); } writer.flush(); return true; @@ -101,7 +101,7 @@ public boolean visit(DependencyNode node) { // add node label writer.write("" + node.toNodeString() + ""); - writer.write("" + "\n"); + writer.write("" + System.lineSeparator()); writer.flush(); return true; } catch (IOException 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 4323ec26bf..ef8496bd9a 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 @@ -66,9 +66,9 @@ private void writeRootNode(DependencyNode node) throws IOException { Set 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(); } @@ -99,21 +99,21 @@ private void writeNode(int indent, DependencyNode node, StringBuilder sb, Set 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 @@ -164,7 +164,7 @@ private void appendKeyValue(StringBuilder sb, int indent, String key, String val .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. @@ -188,7 +188,7 @@ private void appendKeyWithoutComma(StringBuilder sb, int indent, String key, Str .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 04fefa5ec8..c2fb62fd46 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 @@ -109,7 +109,7 @@ public boolean endVisit(DependencyNode node) { // dump edges on last node endVisit writer.write("#" + System.lineSeparator()); for (EdgeAppender edge : edges) { - writer.write(edge.toString() + "\n"); + writer.write(edge.toString() + System.lineSeparator()); } writer.flush(); } else { @@ -133,7 +133,7 @@ public boolean visit(DependencyNode node) { writer.write(generateId(node)); writer.write(" "); writer.write(node.toNodeString()); - writer.write("\n"); + writer.write(System.lineSeparator()); writer.flush(); return true; } catch (IOException 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 b336afd24b..6cfa0ef99c 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 void testTreeJsonParsing() throws Exception { List 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");