This is an automated email from the ASF dual-hosted git repository. jochen pushed a commit to branch feature/clean-spotbugs in repository https://gitbox.apache.org/repos/asf/creadur-rat.git
commit 9b462488b681cfcc0715c77e180a324baf4ef555 Author: Jochen Wiedmann <[email protected]> AuthorDate: Fri Dec 6 01:31:03 2024 +0100 Making Spotbugs happy (Some issues related to implicit default character set) --- .../java/org/apache/rat/tools/AntGenerator.java | 23 ++++++++++++++++------ .../java/org/apache/rat/tools/ArgumentTypes.java | 17 +++++++++++++--- .../java/org/apache/rat/tools/MavenGenerator.java | 16 +++++++++++---- .../src/main/java/org/apache/rat/tools/Naming.java | 21 ++++++++++++++++++-- .../org/apache/rat/tools/xsd/XsdGenerator.java | 9 ++++++++- 5 files changed, 70 insertions(+), 16 deletions(-) diff --git a/apache-rat-tools/src/main/java/org/apache/rat/tools/AntGenerator.java b/apache-rat-tools/src/main/java/org/apache/rat/tools/AntGenerator.java index 743d5d0e..991359db 100644 --- a/apache-rat-tools/src/main/java/org/apache/rat/tools/AntGenerator.java +++ b/apache-rat-tools/src/main/java/org/apache/rat/tools/AntGenerator.java @@ -20,12 +20,13 @@ package org.apache.rat.tools; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -110,11 +111,20 @@ public final class AntGenerator { String pkgName = String.join(File.separator, new CasedString(StringCase.DOT, packageName).getSegments()); File file = new File(new File(new File(destDir), pkgName), className + ".java"); - file.getParentFile().mkdirs(); + File dir = file.getParentFile(); + if (dir != null && !dir.isDirectory() && !dir.mkdirs()) { + throw new IOException("Unable to create directory: " + dir); + } try (InputStream template = AntGenerator.class.getResourceAsStream("/Ant.tpl"); - FileWriter writer = new FileWriter(file); + FileOutputStream fos = new FileOutputStream(file); + /* It is questionable, whether the default character set is a good idea here. + * However, we want to retain upwards compatibility, and still make Spotbugs happy. + */ + Writer writer = new OutputStreamWriter(fos, Charset.defaultCharset()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); - OutputStreamWriter customClasses = new OutputStreamWriter(bos)) { + /* Again, questionable choice of character set for the same reasons. + */ + OutputStreamWriter customClasses = new OutputStreamWriter(bos, Charset.defaultCharset())) { if (template == null) { throw new RuntimeException("Template /Ant.tpl not found"); } @@ -145,7 +155,8 @@ public final class AntGenerator { case "${classes}": customClasses.flush(); customClasses.close(); - writer.write(bos.toString()); + // Once more, default character set for compatibiliy reasons only. + writer.write(bos.toString(Charset.defaultCharset().name())); break; case "${commonArgs}": try (InputStream argsTpl = MavenGenerator.class.getResourceAsStream("/Args.tpl")) { @@ -163,7 +174,7 @@ public final class AntGenerator { } } - private static void writeMethods(final FileWriter writer, final List<AntOption> options, final Writer customClasses) throws IOException { + private static void writeMethods(final Writer writer, final List<AntOption> options, final Writer customClasses) throws IOException { for (AntOption option : options) { if (option.isAttribute()) { diff --git a/apache-rat-tools/src/main/java/org/apache/rat/tools/ArgumentTypes.java b/apache-rat-tools/src/main/java/org/apache/rat/tools/ArgumentTypes.java index 21d6aa31..a2471a22 100644 --- a/apache-rat-tools/src/main/java/org/apache/rat/tools/ArgumentTypes.java +++ b/apache-rat-tools/src/main/java/org/apache/rat/tools/ArgumentTypes.java @@ -18,10 +18,13 @@ */ package org.apache.rat.tools; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.Charset; +import java.util.function.Consumer; import org.apache.rat.help.Help; @@ -41,8 +44,16 @@ public final class ArgumentTypes { private ArgumentTypes() { } public static void main(final String[] args) throws IOException { - try (Writer writer = args.length > 0 ? new FileWriter(args[0]) : new OutputStreamWriter(System.out)) { - new Help(writer).printArgumentTypes(); + final Consumer<Writer> writerConsumer = writer -> new Help(writer).printArgumentTypes(); + if (args.length > 0) { + try (OutputStream os = new FileOutputStream(args[0]); + Writer writer = new OutputStreamWriter(os, Charset.defaultCharset())) { + writerConsumer.accept(writer); + } + } else { + // Do *not* use try-with-resources, because we don't want to close System.out. + Writer writer = new OutputStreamWriter(System.out, Charset.defaultCharset()); + writerConsumer.accept(writer); } } } diff --git a/apache-rat-tools/src/main/java/org/apache/rat/tools/MavenGenerator.java b/apache-rat-tools/src/main/java/org/apache/rat/tools/MavenGenerator.java index a2184276..4b605bb1 100644 --- a/apache-rat-tools/src/main/java/org/apache/rat/tools/MavenGenerator.java +++ b/apache-rat-tools/src/main/java/org/apache/rat/tools/MavenGenerator.java @@ -19,10 +19,14 @@ package org.apache.rat.tools; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -107,9 +111,13 @@ public final class MavenGenerator { String pkgName = String.join(File.separator, new CasedString(StringCase.DOT, packageName).getSegments()); File file = new File(new File(new File(destDir), pkgName), className + ".java"); System.out.println("Creating " + file); - file.getParentFile().mkdirs(); + File dir = file.getParentFile(); + if (dir != null && !dir.isDirectory() && !dir.mkdirs()) { + throw new IOException("Unable to create directory: " + dir); + } try (InputStream template = MavenGenerator.class.getResourceAsStream("/Maven.tpl"); - FileWriter writer = new FileWriter(file)) { + OutputStream os = new FileOutputStream(file); + Writer writer = new OutputStreamWriter(os, Charset.defaultCharset())) { if (template == null) { throw new RuntimeException("Template /Maven.tpl not found"); } @@ -185,7 +193,7 @@ public final class MavenGenerator { return sb.append(format(" */%n")).toString(); } - private static void writeMethods(final FileWriter writer, final List<MavenOption> options) throws IOException { + private static void writeMethods(final Writer writer, final List<MavenOption> options) throws IOException { for (MavenOption option : options) { writer.append(getComment(option)) .append(option.getMethodSignature(" ", option.hasArgs())).append(" {").append(System.lineSeparator()) diff --git a/apache-rat-tools/src/main/java/org/apache/rat/tools/Naming.java b/apache-rat-tools/src/main/java/org/apache/rat/tools/Naming.java index b5bff5c2..e1efe49a 100644 --- a/apache-rat-tools/src/main/java/org/apache/rat/tools/Naming.java +++ b/apache-rat-tools/src/main/java/org/apache/rat/tools/Naming.java @@ -19,11 +19,13 @@ package org.apache.rat.tools; import java.io.CharArrayWriter; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Deque; @@ -42,6 +44,7 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.QuoteMode; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.function.FailableConsumer; import org.apache.rat.OptionCollection; import org.apache.rat.help.AbstractHelp; @@ -150,13 +153,27 @@ public final class Naming { }; } - try (Writer underWriter = cl.getArgs().length != 0 ? new FileWriter(cl.getArgs()[0]) : new OutputStreamWriter(System.out)) { + final FailableConsumer<Writer, IOException> writerConsumer = underWriter -> { if (cl.hasOption(CSV)) { printCSV(columns, filter, cl.hasOption(CLI), mavenFilter, antFilter, descriptionFunction, underWriter); } else { printText(columns, filter, cl.hasOption(CLI), mavenFilter, antFilter, descriptionFunction, underWriter, width); } + }; + // Once more: We are using the default character set, because + // a) We want to make Spotbugs happy. (Using the default character set is okay, but doing + // it silently is not. + // b) We want to retain compatibility. + if (cl.getArgs().length != 0) { + try (OutputStream out = new FileOutputStream(cl.getArgs()[0]); + Writer underWriter = new OutputStreamWriter(out, Charset.defaultCharset())) { + writerConsumer.accept(underWriter); + } + } else { + // Do *not* use try-with-resources, because we don't want to close System.out. + Writer underWriter = new OutputStreamWriter(System.out, Charset.defaultCharset()); + writerConsumer.accept(underWriter); } } diff --git a/apache-rat-tools/src/main/java/org/apache/rat/tools/xsd/XsdGenerator.java b/apache-rat-tools/src/main/java/org/apache/rat/tools/xsd/XsdGenerator.java index f1369e63..9219e4d2 100644 --- a/apache-rat-tools/src/main/java/org/apache/rat/tools/xsd/XsdGenerator.java +++ b/apache-rat-tools/src/main/java/org/apache/rat/tools/xsd/XsdGenerator.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -46,6 +47,9 @@ import org.apache.rat.configuration.XMLConfig; import org.apache.rat.license.SimpleLicense; import org.apache.rat.tools.xsd.XsdWriter.Type; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + + /** * Generates the XSD for a configuration. */ @@ -68,6 +72,7 @@ public class XsdGenerator { * @throws IOException on IO errors. * @throws TransformerException if the XSD can not be pretty printed. */ + @SuppressFBWarnings public static void main(final String[] args) throws IOException, TransformerException { XsdGenerator generator = new XsdGenerator(); @@ -93,7 +98,9 @@ public class XsdGenerator { */ public InputStream getInputStream() throws IOException { try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Writer writer = new OutputStreamWriter(baos)) { + // Explicit use of default character makes Spotbugs happy, and retains + // binary compatibility. + Writer writer = new OutputStreamWriter(baos, Charset.defaultCharset())) { write(writer); return new ByteArrayInputStream(baos.toByteArray()); }
