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;