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

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git

commit 7d4beb1940af7756ab184eac94bbaf14287e1779
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Tue Jan 16 13:59:14 2024 -0500

    Add ArchiveInputStream.getCharset()
    
    Pull-up charsetName (a.k.a encoding) fields from all ArchiveInputStream
    subclasses
---
 src/changes/changes.xml                            |   5 +-
 .../compress/archivers/ArchiveInputStream.java     |  47 +++++++-
 .../archivers/ar/ArArchiveInputStream.java         |   2 +
 .../archivers/arj/ArjArchiveInputStream.java       |   6 +-
 .../archivers/cpio/CpioArchiveInputStream.java     |   5 +-
 .../archivers/cpio/CpioArchiveOutputStream.java    |   4 +-
 .../archivers/dump/DumpArchiveInputStream.java     |   5 +-
 .../archivers/tar/TarArchiveInputStream.java       |   5 +-
 .../archivers/tar/TarArchiveOutputStream.java      |   5 +-
 .../archivers/zip/ZipArchiveInputStream.java       |   5 +-
 .../archivers/zip/ZipArchiveOutputStream.java      |  28 ++---
 .../archivers/ArchiveStreamFactoryTest.java        | 124 +++++++++------------
 .../archivers/memory/MemoryArchiveInputStream.java |   3 +
 13 files changed, 133 insertions(+), 111 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 5379eecdc..c458e6bd2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -75,8 +75,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate 
ByteUtils.fromLittleEndian(InputStream, int).</action>
       <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate 
ByteUtils.toLittleEndian(DataOutput, long, int).</action>
       <!-- ADD -->
-      <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
ZipFile.builder(), add ZipFile.Builder, deprecate constructors.</action>  
-      <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
SevenZFile.builder(), add SevenZFile.Builder, deprecate constructors.</action>  
+      <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
ZipFile.builder(), add ZipFile.Builder, deprecate constructors.</action>
+      <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
SevenZFile.builder(), add SevenZFile.Builder, deprecate constructors.</action>
+      <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
ArchiveInputStream.getCharset().</action>
       <!-- UPDATE -->
       <action type="update" dev="ggregory" due-to="Gary Gregory">Bump 
commons-lang3 from 3.13.0 to 3.14.0.</action>
       <action type="update" dev="ggregory" due-to="Dependabot">Bump 
com.github.marschall:memoryfilesystem from 2.6.1 to 2.8.0 #444, #458.</action>
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java 
b/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
index 5ae527d3f..22cd2e98a 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
@@ -20,6 +20,9 @@ package org.apache.commons.compress.archivers;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import org.apache.commons.io.Charsets;
 
 /**
  * Archive input streams <b>MUST</b> override the {@link #read(byte[], int, 
int)} - or {@link #read()} - method so that reading from the stream generates 
EOF
@@ -42,11 +45,42 @@ import java.io.InputStream;
 public abstract class ArchiveInputStream<E extends ArchiveEntry> extends 
InputStream {
 
     private static final int BYTE_MASK = 0xFF;
+
     private final byte[] single = new byte[1];
 
-    /** Holds the number of bytes read in this stream */
+    /** The number of bytes read in this stream */
     private long bytesRead;
 
+    private Charset charset;
+
+    /**
+     * Constructs a new instance.
+     */
+    public ArchiveInputStream() {
+        this(Charset.defaultCharset());
+    }
+
+    /**
+     * Constructs a new instance.
+     *
+     * @param charset charset.
+     * @since 1.26.0
+     */
+    // This will be protected once subclasses use builders.
+    private ArchiveInputStream(final Charset charset) {
+        this.charset = Charsets.toCharset(charset);
+    }
+
+    /**
+     * Constructs a new instance.
+     *
+     * @param charsetName charset name.
+     * @since 1.26.0
+     */
+    protected ArchiveInputStream(final String charsetName) {
+        this(Charsets.toCharset(charsetName));
+    }
+
     /**
      * Whether this stream is able to read the given entry.
      * <p>
@@ -93,11 +127,20 @@ public abstract class ArchiveInputStream<E extends 
ArchiveEntry> extends InputSt
         return bytesRead;
     }
 
+    /**
+     * Gets the Charest.
+     *
+     * @return the Charest.
+     */
+    public Charset getCharset() {
+        return charset;
+    }
+
     /**
      * Gets the current number of bytes read from this stream.
      *
      * @return the number of read bytes
-     * @deprecated this method may yield wrong results for large archives, use 
#getBytesRead instead
+     * @deprecated this method may yield wrong results for large archives, use 
{@link #getBytesRead()} instead.
      */
     @Deprecated
     public int getCount() {
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
index 270133adb..940408fc9 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
@@ -21,6 +21,7 @@ package org.apache.commons.compress.archivers.ar;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.regex.Pattern;
 
@@ -145,6 +146,7 @@ public class ArArchiveInputStream extends 
ArchiveInputStream<ArArchiveEntry> {
      * @param inputStream the ar input stream
      */
     public ArArchiveInputStream(final InputStream inputStream) {
+        super(StandardCharsets.US_ASCII.name());
         this.input = inputStream;
     }
 
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
index 44d4946b1..a7b30744a 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
@@ -31,7 +31,6 @@ import 
org.apache.commons.compress.archivers.ArchiveInputStream;
 import org.apache.commons.compress.utils.BoundedInputStream;
 import org.apache.commons.compress.utils.CRC32VerifyingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
-import org.apache.commons.io.Charsets;
 
 /**
  * Implements the "arj" archive format as an InputStream.
@@ -60,7 +59,6 @@ public class ArjArchiveInputStream extends 
ArchiveInputStream<ArjArchiveEntry> {
     }
 
     private final DataInputStream in;
-    private final String charsetName;
     private final MainHeader mainHeader;
     private LocalFileHeader currentLocalFileHeader;
     private InputStream currentInputStream;
@@ -83,8 +81,8 @@ public class ArjArchiveInputStream extends 
ArchiveInputStream<ArjArchiveEntry> {
      * @throws ArchiveException if an exception occurs while reading
      */
     public ArjArchiveInputStream(final InputStream inputStream, final String 
charsetName) throws ArchiveException {
+        super(charsetName);
         in = new DataInputStream(inputStream);
-        this.charsetName = charsetName;
         try {
             mainHeader = readMainHeader();
             if ((mainHeader.arjFlags & MainHeader.Flags.GARBLED) != 0) {
@@ -347,7 +345,7 @@ public class ArjArchiveInputStream extends 
ArchiveInputStream<ArjArchiveEntry> {
             while ((nextByte = dataIn.readUnsignedByte()) != 0) {
                 buffer.write(nextByte);
             }
-            return buffer.toString(Charsets.toCharset(charsetName).name());
+            return buffer.toString(getCharset().name());
         }
     }
 }
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
index 42898831a..0b5d7439d 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
@@ -151,9 +151,6 @@ public class CpioArchiveInputStream extends 
ArchiveInputStream<CpioArchiveEntry>
      */
     private final ZipEncoding zipEncoding;
 
-    // the provided encoding (for unit tests)
-    final String encoding;
-
     /**
      * Constructs the cpio input stream with a blocksize of {@link 
CpioConstants#BLOCK_SIZE BLOCK_SIZE} and expecting ASCII file names.
      *
@@ -184,12 +181,12 @@ public class CpioArchiveInputStream extends 
ArchiveInputStream<CpioArchiveEntry>
      * @since 1.6
      */
     public CpioArchiveInputStream(final InputStream in, final int blockSize, 
final String encoding) {
+        super(encoding);
         this.in = in;
         if (blockSize <= 0) {
             throw new IllegalArgumentException("blockSize must be bigger than 
0");
         }
         this.blockSize = blockSize;
-        this.encoding = encoding;
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
     }
 
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
index 95b549474..0fb314b50 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
@@ -100,7 +100,7 @@ public class CpioArchiveOutputStream extends 
ArchiveOutputStream<CpioArchiveEntr
     private final ZipEncoding zipEncoding;
 
     // the provided encoding (for unit tests)
-    final String encoding;
+    final String charsetName;
 
     /**
      * Constructs the cpio output stream. The format for this CPIO stream is 
the "new" format using ASCII encoding for file names
@@ -159,7 +159,7 @@ public class CpioArchiveOutputStream extends 
ArchiveOutputStream<CpioArchiveEntr
         }
         this.entryFormat = format;
         this.blockSize = blockSize;
-        this.encoding = encoding;
+        this.charsetName = encoding;
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
     }
 
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
index 6d07e5960..35bf8e9df 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
@@ -95,9 +95,6 @@ public class DumpArchiveInputStream extends 
ArchiveInputStream<DumpArchiveEntry>
      */
     private final ZipEncoding zipEncoding;
 
-    // the provided encoding (for unit tests)
-    final String encoding;
-
     /**
      * Constructor using the platform's default encoding for file names.
      *
@@ -117,9 +114,9 @@ public class DumpArchiveInputStream extends 
ArchiveInputStream<DumpArchiveEntry>
      * @throws ArchiveException on error
      */
     public DumpArchiveInputStream(final InputStream is, final String encoding) 
throws ArchiveException {
+        super(encoding);
         this.raw = new TapeInputStream(is);
         this.hasHitEOF = false;
-        this.encoding = encoding;
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
 
         try {
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index f0ce211fe..b7491de0b 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -111,9 +111,6 @@ public class TarArchiveInputStream extends 
ArchiveInputStream<TarArchiveEntry> {
     /** The encoding of the file. */
     private final ZipEncoding zipEncoding;
 
-    /** The provided encoding (for unit tests). */
-    final String encoding;
-
     /** The global PAX header. */
     private Map<String, String> globalPaxHeaders = new HashMap<>();
 
@@ -189,9 +186,9 @@ public class TarArchiveInputStream extends 
ArchiveInputStream<TarArchiveEntry> {
      * @since 1.19
      */
     public TarArchiveInputStream(final InputStream inputStream, final int 
blockSize, final int recordSize, final String encoding, final boolean lenient) {
+        super(encoding);
         this.inputStream = inputStream;
         this.atEof = false;
-        this.encoding = encoding;
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
         this.recordSize = recordSize;
         this.recordBuffer = new byte[recordSize];
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
index 3e7330aa0..97c7bb08d 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
@@ -35,6 +35,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.codec.Charsets;
 import org.apache.commons.compress.archivers.ArchiveOutputStream;
 import org.apache.commons.compress.archivers.zip.ZipEncoding;
 import org.apache.commons.compress.archivers.zip.ZipEncodingHelper;
@@ -129,7 +130,7 @@ public class TarArchiveOutputStream extends 
ArchiveOutputStream<TarArchiveEntry>
     /**
      * The provided encoding (for unit tests).
      */
-    final String encoding;
+    final String charsetName;
 
     private boolean addPaxHeadersForNonAsciiNames;
 
@@ -208,7 +209,7 @@ public class TarArchiveOutputStream extends 
ArchiveOutputStream<TarArchiveEntry>
             throw new IllegalArgumentException("Block size must be a multiple 
of 512 bytes. Attempt to use set size of " + blockSize);
         }
         out = new FixedLengthBlockOutputStream(countingOut = new 
CountingOutputStream(os), RECORD_SIZE);
-        this.encoding = encoding;
+        this.charsetName = Charsets.toCharset(encoding).name();
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
 
         this.recordBuf = new byte[RECORD_SIZE];
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
index 8797d3d7d..01a06c2fa 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
@@ -237,9 +237,6 @@ public class ZipArchiveInputStream extends 
ArchiveInputStream<ZipArchiveEntry> i
     /** The ZIP encoding to use for file names and the file comment. */
     private final ZipEncoding zipEncoding;
 
-    // the provided encoding (for unit tests)
-    final String encoding;
-
     /** Whether to look for and use Unicode extra fields. */
     private final boolean useUnicodeExtraFields;
 
@@ -354,7 +351,7 @@ public class ZipArchiveInputStream extends 
ArchiveInputStream<ZipArchiveEntry> i
      */
     public ZipArchiveInputStream(final InputStream inputStream, final String 
encoding, final boolean useUnicodeExtraFields,
             final boolean allowStoredEntriesWithDataDescriptor, final boolean 
skipSplitSig) {
-        this.encoding = encoding;
+        super(encoding);
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
         this.useUnicodeExtraFields = useUnicodeExtraFields;
         this.inputStream = new PushbackInputStream(inputStream, 
buf.capacity());
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
index 1e984e0d3..113810201 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
@@ -321,7 +321,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * Defaults to UTF-8.
      * </p>
      */
-    private String encoding = DEFAULT_ENCODING;
+    private String charsetName = DEFAULT_ENCODING;
 
     /**
      * The ZIP encoding to use for file names and the file comment.
@@ -415,9 +415,9 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      */
     public ZipArchiveOutputStream(final OutputStream out) {
         this.outputStream = out;
-        def = new Deflater(level, true);
-        streamCompressor = StreamCompressor.create(out, def);
-        isSplitZip = false;
+        this.def = new Deflater(level, true);
+        this.streamCompressor = StreamCompressor.create(out, def);
+        this.isSplitZip = false;
     }
 
     /**
@@ -438,10 +438,10 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * @since 1.22
      */
     public ZipArchiveOutputStream(final Path path, final long zipSplitSize) 
throws IOException {
-        def = new Deflater(level, true);
+        this.def = new Deflater(level, true);
         this.outputStream = new ZipSplitOutputStream(path, zipSplitSize);
-        streamCompressor = StreamCompressor.create(this.outputStream, def);
-        isSplitZip = true;
+        this.streamCompressor = StreamCompressor.create(this.outputStream, 
def);
+        this.isSplitZip = true;
     }
 
     /**
@@ -453,7 +453,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * @since 1.21
      */
     public ZipArchiveOutputStream(final Path file, final OpenOption... 
options) throws IOException {
-        def = new Deflater(level, true);
+        this.def = new Deflater(level, true);
         this.outputStream = options.length == 0 ? new 
FileRandomAccessOutputStream(file) : new FileRandomAccessOutputStream(file, 
options);
         this.streamCompressor = StreamCompressor.create(outputStream, def);
         this.isSplitZip = false;
@@ -471,9 +471,9 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      */
     public ZipArchiveOutputStream(final SeekableByteChannel channel) {
         this.outputStream = new 
SeekableChannelRandomAccessOutputStream(channel);
-        def = new Deflater(level, true);
-        streamCompressor = StreamCompressor.create(outputStream, def);
-        isSplitZip = false;
+        this.def = new Deflater(level, true);
+        this.streamCompressor = StreamCompressor.create(outputStream, def);
+        this.isSplitZip = false;
     }
 
     /**
@@ -1013,7 +1013,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * @return null if using the platform's default character encoding.
      */
     public String getEncoding() {
-        return encoding;
+        return charsetName;
     }
 
     private ZipEncoding getEntryEncoding(final ZipArchiveEntry ze) {
@@ -1329,7 +1329,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * @param encoding the encoding to use for file names, use null for the 
platform's default encoding
      */
     public void setEncoding(final String encoding) {
-        this.encoding = encoding;
+        this.charsetName = encoding;
         this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
         if (useUTF8Flag && !ZipEncodingHelper.isUTF8(encoding)) {
             useUTF8Flag = false;
@@ -1389,7 +1389,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
      * @param b whether to set the language encoding flag if the file name 
encoding is UTF-8
      */
     public void setUseLanguageEncodingFlag(final boolean b) {
-        useUTF8Flag = b && ZipEncodingHelper.isUTF8(encoding);
+        useUTF8Flag = b && ZipEncodingHelper.isUTF8(charsetName);
     }
 
     /**
diff --git 
a/src/test/java/org/apache/commons/compress/archivers/ArchiveStreamFactoryTest.java
 
b/src/test/java/org/apache/commons/compress/archivers/ArchiveStreamFactoryTest.java
index f97bcbc77..ba01e8aba 100644
--- 
a/src/test/java/org/apache/commons/compress/archivers/ArchiveStreamFactoryTest.java
+++ 
b/src/test/java/org/apache/commons/compress/archivers/ArchiveStreamFactoryTest.java
@@ -29,7 +29,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.compress.AbstractTest;
 import org.apache.commons.compress.archivers.arj.ArjArchiveInputStream;
@@ -41,12 +41,11 @@ import 
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
 import org.apache.commons.compress.utils.ByteUtils;
 import org.apache.commons.compress.utils.CharsetNames;
 import org.apache.commons.io.input.BrokenInputStream;
+import org.apache.commons.lang3.reflect.FieldUtils;
 import org.junit.jupiter.api.Test;
 
 public class ArchiveStreamFactoryTest extends AbstractTest {
 
-    private static final String SHORT_ASCII_NAME = "ASCII";
-
     static class TestData {
         final String testFile;
         final String expectedEncoding;
@@ -78,34 +77,34 @@ public class ArchiveStreamFactoryTest extends AbstractTest {
 
     private static final ArchiveStreamFactory FACTORY_UTF8 = new 
ArchiveStreamFactory(CharsetNames.UTF_8);
 
-    private static final ArchiveStreamFactory FACTORY_ASCII = new 
ArchiveStreamFactory(SHORT_ASCII_NAME);
+    private static final ArchiveStreamFactory FACTORY_ASCII = new 
ArchiveStreamFactory(StandardCharsets.US_ASCII.name());
 
     private static final ArchiveStreamFactory FACTORY_SET_UTF8 = 
getFactory(CharsetNames.UTF_8);
 
-    private static final ArchiveStreamFactory FACTORY_SET_ASCII = 
getFactory(SHORT_ASCII_NAME);
+    private static final ArchiveStreamFactory FACTORY_SET_ASCII = 
getFactory(StandardCharsets.US_ASCII.name());
 
     /**
      * Default encoding if none is provided (not even null). The test 
currently assumes that the output default is the same as the input default.
      */
     private static final String ARJ_DEFAULT;
     private static final String DUMP_DEFAULT;
-    private static final String ZIP_DEFAULT = getField(new 
ZipArchiveInputStream(null), "encoding");
-    private static final String CPIO_DEFAULT = getField(new 
CpioArchiveInputStream(null), "encoding");
-    private static final String TAR_DEFAULT = getField(new 
TarArchiveInputStream(null), "encoding");
-    private static final String JAR_DEFAULT = getField(new 
JarArchiveInputStream(null), "encoding");
+    private static final String ZIP_DEFAULT = getField(new 
ZipArchiveInputStream(null));
+    private static final String CPIO_DEFAULT = getField(new 
CpioArchiveInputStream(null));
+    private static final String TAR_DEFAULT = getField(new 
TarArchiveInputStream(null));
+    private static final String JAR_DEFAULT = getField(new 
JarArchiveInputStream(null));
 
     static {
         String dflt;
         dflt = UNKNOWN;
         try (ArjArchiveInputStream inputStream = new 
ArjArchiveInputStream(newInputStream("bla.arj"))) {
-            dflt = getField(inputStream, "charsetName");
+            dflt = getField(inputStream);
         } catch (final Exception e) {
             e.printStackTrace();
         }
         ARJ_DEFAULT = dflt;
         dflt = UNKNOWN;
         try (DumpArchiveInputStream inputStream = new 
DumpArchiveInputStream(newInputStream("bla.dump"))) {
-            dflt = getField(inputStream, "encoding");
+            dflt = getField(inputStream);
         } catch (final Exception e) {
             e.printStackTrace();
         }
@@ -114,39 +113,39 @@ public class ArchiveStreamFactoryTest extends 
AbstractTest {
 
     static final TestData[] TESTS = { new TestData("bla.arj", 
ArchiveStreamFactory.ARJ, false, ARJ_DEFAULT, FACTORY, "charsetName"),
             new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
-            new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
SHORT_ASCII_NAME, FACTORY_ASCII, "charsetName"),
+            new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
             new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
-            new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "charsetName"),
-
-            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CPIO_DEFAULT, FACTORY, "encoding"),
-            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "encoding"),
-            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
SHORT_ASCII_NAME, FACTORY_ASCII, "encoding"),
-            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "encoding"),
-            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "encoding"),
-
-            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
DUMP_DEFAULT, FACTORY, "encoding"),
-            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
CharsetNames.UTF_8, FACTORY_UTF8, "encoding"),
-            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
SHORT_ASCII_NAME, FACTORY_ASCII, "encoding"),
-            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "encoding"),
-            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "encoding"),
-
-            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
TAR_DEFAULT, FACTORY, "encoding"),
-            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "encoding"),
-            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
SHORT_ASCII_NAME, FACTORY_ASCII, "encoding"),
-            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "encoding"),
-            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "encoding"),
-
-            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
JAR_DEFAULT, FACTORY, "encoding"),
-            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "encoding"),
-            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
SHORT_ASCII_NAME, FACTORY_ASCII, "encoding"),
-            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "encoding"),
-            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "encoding"),
-
-            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
ZIP_DEFAULT, FACTORY, "encoding"),
-            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "encoding"),
-            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
SHORT_ASCII_NAME, FACTORY_ASCII, "encoding"),
-            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "encoding"),
-            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
SHORT_ASCII_NAME, FACTORY_SET_ASCII, "encoding"), };
+            new TestData("bla.arj", ArchiveStreamFactory.ARJ, false, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"),
+
+            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CPIO_DEFAULT, FACTORY, "charsetName"),
+            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
+            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
+            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
+            new TestData("bla.cpio", ArchiveStreamFactory.CPIO, true, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"),
+
+            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
DUMP_DEFAULT, FACTORY, "charsetName"),
+            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
+            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
+            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
+            new TestData("bla.dump", ArchiveStreamFactory.DUMP, false, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"),
+
+            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
TAR_DEFAULT, FACTORY, "charsetName"),
+            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
+            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
+            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
+            new TestData("bla.tar", ArchiveStreamFactory.TAR, true, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"),
+
+            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
JAR_DEFAULT, FACTORY, "charsetName"),
+            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
+            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
+            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
+            new TestData("bla.jar", ArchiveStreamFactory.JAR, true, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"),
+
+            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
ZIP_DEFAULT, FACTORY, "charsetName"),
+            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
CharsetNames.UTF_8, FACTORY_UTF8, "charsetName"),
+            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
StandardCharsets.US_ASCII.name(), FACTORY_ASCII, "charsetName"),
+            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
CharsetNames.UTF_8, FACTORY_SET_UTF8, "charsetName"),
+            new TestData("bla.zip", ArchiveStreamFactory.ZIP, true, 
StandardCharsets.US_ASCII.name(), FACTORY_SET_ASCII, "charsetName"), };
 
     /** equals allowing null. */
     private static boolean eq(final String exp, final String act) {
@@ -163,37 +162,24 @@ public class ArchiveStreamFactoryTest extends 
AbstractTest {
         return fac;
     }
 
+    private static String getField(final ArchiveInputStream<?> instance) {
+        return instance.getCharset().name();
+    }
+
     private static String getField(final Object instance, final String name) {
-        final Class<?> cls = instance.getClass();
-        Field fld;
-        try {
-            fld = cls.getDeclaredField(name);
-        } catch (final NoSuchFieldException nsfe) {
-            try {
-                fld = cls.getSuperclass().getDeclaredField(name);
-            } catch (final NoSuchFieldException e) {
-                System.out.println("Cannot find " + name + " in class " + 
instance.getClass().getSimpleName());
-                return UNKNOWN;
-            }
+        if (instance instanceof ArchiveInputStream) {
+            return getField((ArchiveInputStream<?>) instance);
         }
-        final boolean isAccessible = fld.isAccessible();
         try {
-            if (!isAccessible) {
-                fld.setAccessible(true);
-            }
-            final Object object = fld.get(instance);
+            final Object object = FieldUtils.readField(instance, name, true);
             if (object instanceof String || object == null) {
                 return (String) object;
             }
             System.out.println("Wrong type: " + 
object.getClass().getCanonicalName() + " for " + name + " in class " + 
instance.getClass().getSimpleName());
             return UNKNOWN;
-        } catch (final Exception e) {
-            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            System.out.println("Cannot find " + name + " in class " + 
instance.getClass().getSimpleName());
             return UNKNOWN;
-        } finally {
-            if (!isAccessible) {
-                fld.setAccessible(isAccessible);
-            }
         }
     }
 
@@ -308,8 +294,8 @@ public class ArchiveStreamFactoryTest extends AbstractTest {
         assertNull(fac1.getEntryEncoding());
         fac1.setEntryEncoding(CharsetNames.UTF_8);
         assertEquals(CharsetNames.UTF_8, fac1.getEntryEncoding());
-        fac1.setEntryEncoding("US_ASCII");
-        assertEquals("US_ASCII", fac1.getEntryEncoding());
+        fac1.setEntryEncoding(CharsetNames.US_ASCII);
+        assertEquals(CharsetNames.US_ASCII, fac1.getEntryEncoding());
         final ArchiveStreamFactory fac2 = new 
ArchiveStreamFactory(CharsetNames.UTF_8);
         assertEquals(CharsetNames.UTF_8, fac2.getEntryEncoding());
         assertThrows(IllegalStateException.class, () -> 
fac2.setEntryEncoding("US_ASCII"), "Expected IllegalStateException");
@@ -321,7 +307,7 @@ public class ArchiveStreamFactoryTest extends AbstractTest {
         for (int i = 1; i <= TESTS.length; i++) {
             final TestData test = TESTS[i - 1];
             try (ArchiveInputStream<?> ais = getInputStream(test.type, 
test.testFile, test.fac)) {
-                final String field = getField(ais, test.fieldName);
+                final String field = getField(ais);
                 if (!eq(test.expectedEncoding, field)) {
                     System.err.println("Failed test " + i + ". expected: " + 
test.expectedEncoding + " actual: " + field + " type: " + test.type);
                     failed++;
@@ -339,7 +325,7 @@ public class ArchiveStreamFactoryTest extends AbstractTest {
         for (int i = 1; i <= TESTS.length; i++) {
             final TestData test = TESTS[i - 1];
             try (ArchiveInputStream<?> ais = getInputStream(test.testFile, 
test.fac)) {
-                final String field = getField(ais, test.fieldName);
+                final String field = getField(ais);
                 if (!eq(test.expectedEncoding, field)) {
                     System.err.println("Failed test " + i + ". expected: " + 
test.expectedEncoding + " actual: " + field + " type: " + test.type);
                     failed++;
diff --git 
a/src/test/java/org/apache/commons/compress/archivers/memory/MemoryArchiveInputStream.java
 
b/src/test/java/org/apache/commons/compress/archivers/memory/MemoryArchiveInputStream.java
index 6f6487238..b52f4e7e2 100644
--- 
a/src/test/java/org/apache/commons/compress/archivers/memory/MemoryArchiveInputStream.java
+++ 
b/src/test/java/org/apache/commons/compress/archivers/memory/MemoryArchiveInputStream.java
@@ -22,6 +22,9 @@ import java.io.IOException;
 
 import org.apache.commons.compress.archivers.ArchiveInputStream;
 
+/**
+ * A test input stream.
+ */
 public final class MemoryArchiveInputStream extends 
ArchiveInputStream<MemoryArchiveEntry> {
 
     private final String[] fileNames;


Reply via email to