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());
         }

Reply via email to