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

claude pushed a commit to branch feature/restructure
in repository https://gitbox.apache.org/repos/asf/creadur-rat.git

commit 07f5645e69bc0f0fe53a471f303f40245658e1d7
Author: Claude Warren <[email protected]>
AuthorDate: Fri Mar 6 18:02:00 2026 +0000

    changed to IODescriptor for input/output configuration streams
---
 .../java/org/apache/rat/ReportConfiguration.java   | 69 ++++++++++++++++++----
 .../org/apache/rat/commandline/StyleSheets.java    | 24 ++++----
 2 files changed, 70 insertions(+), 23 deletions(-)

diff --git 
a/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java 
b/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java
index 9edf694e..82ce4920 100644
--- a/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java
+++ b/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java
@@ -81,6 +81,8 @@ import org.xml.sax.SAXException;
  */
 public class ReportConfiguration {
 
+    /** The IODescriptor for System.out */
+    public static final IODescriptor<OutputStream> SYSTEM_OUT = new  
IODescriptor<>("System.out", () -> CloseShieldOutputStream.wrap(System.out));
     /**
      * The styles of processing for various categories of documents.
      */
@@ -130,11 +132,11 @@ public class ReportConfiguration {
     /**
      * The IOSupplier that provides the output stream to write the report to.
      */
-    private IOSupplier<OutputStream> out;
+    private IODescriptor<OutputStream> out;
     /**
      * The IOSupplier that provides the stylesheet to style the XML output.
      */
-    private IOSupplier<InputStream> styleSheet;
+    private IODescriptor<InputStream> styleSheet;
 
     /**
      * A list of files to read file names from.
@@ -458,6 +460,15 @@ public class ReportConfiguration {
      * the report with.
      */
     public IOSupplier<InputStream> getStyleSheet() {
+        return styleSheet.ioSupplier();
+    }
+
+    /**
+     * Gets the IODescriptor of the style sheet.
+     * @return the Supplier of the InputStream that is the XSLT style sheet to 
style
+     * the report with.
+     */
+    public IODescriptor<InputStream> getStyleSheetDescriptor() {
         return styleSheet;
     }
 
@@ -467,7 +478,7 @@ public class ReportConfiguration {
      * multiple times.
      * @param styleSheet the XSLT style sheet to style the report with.
      */
-    public void setStyleSheet(final IOSupplier<InputStream> styleSheet) {
+    public void setStyleSheet(final IODescriptor<InputStream> styleSheet) {
         this.styleSheet = styleSheet;
     }
 
@@ -479,7 +490,7 @@ public class ReportConfiguration {
      */
     public void setFrom(final Defaults defaults) {
         licenseSetFactory.add(defaults.getLicenseSetFactory());
-        if (getStyleSheet() == null) {
+        if (getStyleSheetDescriptor() == null) {
             setStyleSheet(StyleSheets.PLAIN.getStyleSheet());
         }
         defaults.getStandardExclusion().forEach(this::addExcludedCollection);
@@ -515,7 +526,7 @@ public class ReportConfiguration {
      */
     public void setStyleSheet(final URL styleSheet) {
         Objects.requireNonNull(styleSheet, "Stylesheet file must not be null");
-        setStyleSheet(styleSheet::openStream);
+        setStyleSheet(new IODescriptor<>(styleSheet.toString(), 
styleSheet::openStream));
     }
 
     /**
@@ -526,7 +537,7 @@ public class ReportConfiguration {
      * @param out The OutputStream supplier that provides the output stream to 
write
      * the report to. A null value will use System.out.
      */
-    public void setOut(final IOSupplier<OutputStream> out) {
+    public void setOut(final IODescriptor<OutputStream> out) {
         this.out = out;
     }
 
@@ -534,7 +545,7 @@ public class ReportConfiguration {
      * Sets the OutputStream supplier to use the specified file. The file may 
be
      * opened and closed several times. File is deleted first and then may be
      * repeatedly opened in append mode.
-     * @see #setOut(IOSupplier)
+     * @see #setOut(IODescriptor)
      * @param file The file to create the supplier with.
      */
     public void setOut(final File file) {
@@ -550,7 +561,7 @@ public class ReportConfiguration {
         if (!parent.mkdirs() && !parent.isDirectory()) {
             DefaultLog.getInstance().warn("Unable to create directory: " + 
file.getParentFile());
         }
-        setOut(() -> new FileOutputStream(file, true));
+        setOut(new IODescriptor<>(file.toString(), () -> new 
FileOutputStream(file, true)));
     }
 
     /**
@@ -559,7 +570,15 @@ public class ReportConfiguration {
      * @return The supplier of the output stream to write the report to.
      */
     public IOSupplier<OutputStream> getOutput() {
-        return out == null ? () -> CloseShieldOutputStream.wrap(System.out) : 
out;
+        return getOutputDescriptor().ioSupplier();
+    }
+
+    /**
+     * Returns the output IODescriptor.
+     * @return The IODescriptor of the output stream to write the report to.
+     */
+    public IODescriptor<OutputStream> getOutputDescriptor() {
+        return out == null ? SYSTEM_OUT : out;
     }
 
     /**
@@ -870,7 +889,9 @@ public class ReportConfiguration {
                         .attribute("listLicenses", listLicenses.name())
                         .attribute("dryRun", Boolean.toString(dryRun))
                         .attribute("archiveProcessing", 
getArchiveProcessing().name())
-                        .attribute("standardProcessing", 
getStandardProcessing().name());
+                        .attribute("standardProcessing", 
getStandardProcessing().name())
+                        .attribute("stylesheet", styleSheet.name())
+                        .attribute("output", out.name());
                 if (StringUtils.isNotEmpty(copyrightMessage)) {
                     
writer.openElement("copyrightMessage").content(copyrightMessage).closeElement();
                 }
@@ -903,7 +924,7 @@ public class ReportConfiguration {
             }
         }
 
-        public void deserialize(final IOSupplier<InputStream> 
inputStreamSupplier) throws IOException {
+        public void deserialize(final IOSupplier<InputStream> 
inputStreamSupplier, final DocumentName workingDirectory) throws IOException {
             DocumentBuilder builder;
             try {
                 builder = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
@@ -927,6 +948,18 @@ public class ReportConfiguration {
             dryRun = Boolean.parseBoolean(attributes.get("dryRun"));
             archiveProcessing = 
Processing.valueOf(attributes.get("archiveProcessing"));
             standardProcessing = 
Processing.valueOf(attributes.get("standardProcessing"));
+            String styleName = attributes.get("stylesheet");
+            if (styleName != null) {
+                styleSheet = StyleSheets.getStyleSheet(styleName, 
workingDirectory);
+            }
+            String outputName = attributes.get("output");
+            if (outputName != null) {
+                if (outputName.equals(ReportConfiguration.SYSTEM_OUT.name())) {
+                    out = ReportConfiguration.SYSTEM_OUT;
+                } else {
+                    out = IODescriptor.output(outputName, workingDirectory);
+                }
+            }
 
             
XMLConfigurationReader.nodeListConsumer(document.getElementsByTagName("source"),
 lNode -> {
                 Map<String, String> nAttributes = 
XMLConfigurationReader.attributes(lNode);
@@ -951,11 +984,23 @@ public class ReportConfiguration {
         }
     }
 
-
     private record DeserializedReportable(DocumentName name) implements 
IReportable {
         @Override
         public void run(final RatReport report) throws RatException {
             throw new RatException("Attempt to run a deserialized reportable");
         }
     }
+
+    public record IODescriptor<T>(String name, IOSupplier<T> ioSupplier) {
+        /**
+         * Creates an output IODescriptor for the file name within the working 
directory.
+         * @param name the name of the file to open.
+         * @param workingDirectory the working directory for the file.
+         * @return the Output IODescriptor.
+         */
+        static IODescriptor<OutputStream> output(final String name, final 
DocumentName workingDirectory) {
+            DocumentName docName = workingDirectory.resolve(name);
+            return new IODescriptor<OutputStream>(name, () -> new 
FileOutputStream(docName.asFile()));
+        }
+    };
 }
diff --git 
a/apache-rat-core/src/main/java/org/apache/rat/commandline/StyleSheets.java 
b/apache-rat-core/src/main/java/org/apache/rat/commandline/StyleSheets.java
index 0a2983f1..f9e47cc2 100644
--- a/apache-rat-core/src/main/java/org/apache/rat/commandline/StyleSheets.java
+++ b/apache-rat-core/src/main/java/org/apache/rat/commandline/StyleSheets.java
@@ -23,8 +23,8 @@ import java.net.URL;
 import java.nio.file.Files;
 import java.util.Objects;
 
-import org.apache.commons.io.function.IOSupplier;
 import org.apache.rat.ConfigurationException;
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.document.DocumentName;
 
 import static java.lang.String.format;
@@ -73,27 +73,29 @@ public enum StyleSheets {
     }
 
     /**
-     * Gets the IOSupplier for a style sheet.
-     * @return an IOSupplier for the sheet.
+     * Gets the IODescriptor for a style sheet.
+     * @return an IODescriptor for the sheet.
      */
-    public IOSupplier<InputStream> getStyleSheet() {
-        return 
Objects.requireNonNull(StyleSheets.class.getClassLoader().getResource(format("org/apache/rat/%s.xsl",
 name)),
-                "missing stylesheet: " + name)::openStream;
+    public ReportConfiguration.IODescriptor<InputStream> getStyleSheet() {
+        URL url = 
StyleSheets.class.getClassLoader().getResource(format("org/apache/rat/%s.xsl", 
name));
+        Objects.requireNonNull(url, "missing stylesheet: " + name);
+        return new ReportConfiguration.IODescriptor<>(name, url::openStream);
     }
 
     /**
-     * Gets the IOSupplier for a style sheet.
+     * Gets the IODescriptor for a style sheet.
      * @param name the short name for or the path to a style sheet.
-     * @return the IOSupplier for the style sheet.
+     * @param workingDirectory the working directory to resolve the name 
against.
+     * @return the IODescriptor for the style sheet.
      */
-    public static IOSupplier<InputStream> getStyleSheet(final String name, 
final DocumentName workingDirectory) {
+    public static ReportConfiguration.IODescriptor<InputStream> 
getStyleSheet(final String name, final DocumentName workingDirectory) {
         URL url = 
StyleSheets.class.getClassLoader().getResource(format("org/apache/rat/%s.xsl", 
name));
         if (url != null) {
-            return url::openStream;
+            return new ReportConfiguration.IODescriptor<>(name, 
url::openStream);
         }
         DocumentName xslt = workingDirectory.resolve(name);
         if (xslt.asFile().exists()) {
-            return () -> Files.newInputStream(xslt.asFile().toPath());
+            return new ReportConfiguration.IODescriptor<>(xslt.toString(), () 
-> Files.newInputStream(xslt.asFile().toPath()));
         }
         throw new ConfigurationException(format("Stylesheet file '%s' not 
found", name));
     }

Reply via email to