This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch commons_io_2_21_0
in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/commons_io_2_21_0 by this push:
new 38404655f Add `AbstractArchiveBuilder` for unified archiver support
(#721)
38404655f is described below
commit 38404655f197206e18b8ade05293176fe22a244b
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Mon Oct 6 14:17:17 2025 +0200
Add `AbstractArchiveBuilder` for unified archiver support (#721)
* Introduce `AbstractArchiveBuilder` for unified archiver support
This PR introduces a new `AbstractArchiveBuilder`, which serves as a shared
foundation for all archive input streams, including `SevenZFile`, `TarFile`,
and `ZipFile`.
This refactoring also leverages the new `ChannelOrigin` from Commons IO
2.21.0, streamlining the builder implementations for `SevenZFile`, `TarFile`,
and `ZipFile`.
### Additional improvements
* **Constructor unification:** All constructors now delegate to a single
constructor that accepts a builder.
* **Resource safety:** If an error occurs during construction (or within
the builder’s `get()` method), the underlying resource is now always closed.
Previously, resources provided via `SeekableByteChannel` were not closed on
error, potentially leaving channels in an incoherent state.
* **Deprecation cleanup:** All references to deprecated constructors and
methods have been removed. Compatibility is verified through
`LegacyConstructorsTest`, which ensures the builder pattern behaves
equivalently to the removed constructors.
* fix: Checkstyle violation
* fix: remove unused members
* fix: Windows failure
---
src/changes/changes.xml | 1 +
.../compress/archivers/AbstractArchiveBuilder.java | 42 ++++++
.../compress/archivers/ArchiveInputStream.java | 56 ++++----
.../apache/commons/compress/archivers/Lister.java | 2 +-
.../archivers/ar/ArArchiveInputStream.java | 7 +-
.../archivers/arj/ArjArchiveInputStream.java | 5 +-
.../archivers/cpio/CpioArchiveInputStream.java | 5 +-
.../archivers/dump/DumpArchiveInputStream.java | 5 +-
.../compress/archivers/examples/Expander.java | 6 +-
.../compress/archivers/sevenz/SevenZFile.java | 147 +++++++++------------
.../compress/archivers/tar/AbstractTarBuilder.java | 4 +-
.../archivers/tar/TarArchiveInputStream.java | 2 +-
.../commons/compress/archivers/tar/TarFile.java | 66 +++++----
.../archivers/zip/ZipArchiveInputStream.java | 5 +-
.../commons/compress/archivers/zip/ZipFile.java | 144 +++++++++-----------
.../commons/compress/LegacyConstructorsTest.java | 129 ++++++++++++++++++
.../apache/commons/compress/archivers/TarTest.java | 20 +--
.../compress/archivers/examples/ExpanderTest.java | 4 +-
.../compress/archivers/sevenz/SevenZFileTest.java | 57 +-------
.../commons/compress/archivers/tar/BigFilesIT.java | 2 +-
.../compress/archivers/tar/SparseFilesTest.java | 20 +--
.../compress/archivers/tar/TarFileTest.java | 55 ++++----
.../compress/archivers/zip/UTF8ZipFilesTest.java | 3 +-
.../zip/ZipFileIgnoringLocalFileHeaderTest.java | 11 +-
.../compress/archivers/zip/ZipFileTest.java | 68 ++++------
.../archivers/zip/ZipMemoryFileSystemTest.java | 9 +-
26 files changed, 464 insertions(+), 411 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 59ce9d743..85c50ea00 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -125,6 +125,7 @@ The <action> type attribute can be add,update,fix,remove.
<action type="add" dev="ggregory" due-to="Gary Gregory, Piotr P.
Karwasz">Introduce builders for all ArchiveInputStream implementations and
deprecate some constructors.</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">TarFile now
implements IOIterable<TarArchiveEntry>.</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add a builder
for the TarFile class and deprecate some constructors.</action>
+ <action type="add" dev="pkarwasz" due-to="Piotr Karwasz">SevenZFile,
TarFile, and ZipFile now always close underlying resources when builder or
constructor fails.</action>
<!-- UPDATE -->
<action type="update" dev="ggregory" due-to="Gary Gregory">Bump
org.apache.commons:commons-parent from 85 to 88 #707.</action>
<action type="update" dev="ggregory" due-to="Gary Gregory">Bump
org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0.</action>
diff --git
a/src/main/java/org/apache/commons/compress/archivers/AbstractArchiveBuilder.java
b/src/main/java/org/apache/commons/compress/archivers/AbstractArchiveBuilder.java
new file mode 100644
index 000000000..0bfa688b6
--- /dev/null
+++
b/src/main/java/org/apache/commons/compress/archivers/AbstractArchiveBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.commons.compress.archivers;
+
+import org.apache.commons.io.build.AbstractStreamBuilder;
+
+/**
+ * Base class for builder pattern implementations of all archive readers.
+ *
+ * <p>Ensures that all {@code ArchiveInputStream} implementations and other
+ * archive handlers expose a consistent set of configuration options.</p>
+ *
+ * @param <T> The type of archive stream or file to build.
+ * @param <B> The type of the concrete builder subclass.
+ * @since 1.29.0
+ */
+public abstract class AbstractArchiveBuilder<T, B extends
AbstractArchiveBuilder<T, B>>
+ extends AbstractStreamBuilder<T, B> {
+
+ /**
+ * Constructs a new instance.
+ */
+ protected AbstractArchiveBuilder() {
+ // empty
+ }
+}
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 73c4dbefd..66b795fb7 100644
---
a/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
+++
b/src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
@@ -26,7 +26,6 @@
import java.util.Objects;
import org.apache.commons.io.Charsets;
-import org.apache.commons.io.build.AbstractStreamBuilder;
import org.apache.commons.io.function.IOConsumer;
import org.apache.commons.io.function.IOIterator;
import org.apache.commons.io.input.NullInputStream;
@@ -52,24 +51,6 @@
*/
public abstract class ArchiveInputStream<E extends ArchiveEntry> extends
FilterInputStream {
- /**
- * Generic builder for ArchiveInputStream instances.
- *
- * @param <T> The type of {@link ArchiveInputStream} to build.
- * @param <B> The type of the concrete AbstractBuilder.
- * @since 1.29.0
- */
- public abstract static class AbstractBuilder<T extends
ArchiveInputStream<?>, B extends AbstractBuilder<T, B>>
- extends AbstractStreamBuilder<T, B> {
-
- /**
- * Constructs a new instance.
- */
- protected AbstractBuilder() {
- // empty
- }
- }
-
/**
* An iterator over a collection of a specific {@link ArchiveEntry} type.
*/
@@ -121,30 +102,45 @@ public Iterator<E> unwrap() {
*/
@SuppressWarnings("resource")
public ArchiveInputStream() {
- this(new NullInputStream(), Charset.defaultCharset());
+ this(new NullInputStream(), Charset.defaultCharset().name());
}
/**
* Constructs a new instance.
*
* @param inputStream the underlying input stream, or {@code null} if this
instance is to be created without an underlying stream.
- * @param charset charset.
+ * @param charsetName charset name.
+ * @since 1.26.0
+ */
+ protected ArchiveInputStream(final InputStream inputStream, final String
charsetName) {
+ super(inputStream == null ? new NullInputStream() : inputStream);
+ this.charset = Charsets.toCharset(charsetName);
+ }
+
+ /**
+ * Constructs a new instance from a builder.
+ *
+ * @param builder The builder.
* @since 1.29.0
*/
- protected ArchiveInputStream(final InputStream inputStream, final Charset
charset) {
- super(inputStream);
- this.charset = Charsets.toCharset(charset);
+ protected ArchiveInputStream(AbstractArchiveBuilder<?, ?> builder) throws
IOException {
+ this(builder.getInputStream(), builder);
}
/**
- * Constructs a new instance.
+ * Constructs a new instance from a builder and an input stream.
*
- * @param inputStream the underlying input stream, or {@code null} if this
instance is to be created without an underlying stream.
- * @param charsetName charset name.
- * @since 1.26.0
+ * <p><strong>Note:</strong> This overload exists to support legacy
constructors that did not declare
+ * {@link IOException}. For new constructors, prefer
+ * {@link #ArchiveInputStream(AbstractArchiveBuilder)} and propagate I/O
errors to callers.</p>
+ *
+ * @param inputStream The underlying input stream, or {@code null} if this
instance is to be created without an underlying stream.
+ * @param builder The builder.
+ * @since 1.29.0
*/
- protected ArchiveInputStream(final InputStream inputStream, final String
charsetName) {
- this(inputStream, Charsets.toCharset(charsetName));
+ protected ArchiveInputStream(final InputStream inputStream, final
AbstractArchiveBuilder<?, ?> builder) {
+ super(inputStream);
+ this.charset = builder.getCharset();
}
/**
diff --git a/src/main/java/org/apache/commons/compress/archivers/Lister.java
b/src/main/java/org/apache/commons/compress/archivers/Lister.java
index 819141ddf..117e632dd 100644
--- a/src/main/java/org/apache/commons/compress/archivers/Lister.java
+++ b/src/main/java/org/apache/commons/compress/archivers/Lister.java
@@ -155,7 +155,7 @@ private void listStream(final Path file, final String[]
args) throws ArchiveExc
}
private void listZipUsingTarFile(final Path file) throws IOException {
- try (TarFile tarFile = new TarFile(file)) {
+ try (TarFile tarFile = TarFile.builder().setPath(file).get()) {
println("Created " + tarFile);
tarFile.getEntries().forEach(this::println);
}
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 a109a5388..0ac687cb5 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
@@ -25,6 +25,7 @@
import java.util.Arrays;
import java.util.regex.Pattern;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.utils.ArchiveUtils;
@@ -52,7 +53,7 @@ public class ArArchiveInputStream extends
ArchiveInputStream<ArArchiveEntry> {
*
* @since 1.29.0
*/
- public static final class Builder extends
AbstractBuilder<ArArchiveInputStream, Builder> {
+ public static final class Builder extends
AbstractArchiveBuilder<ArArchiveInputStream, Builder> {
private Builder() {
setCharset(StandardCharsets.US_ASCII);
@@ -167,7 +168,7 @@ public static boolean matches(final byte[] buffer, final
int ignored) {
private final byte[] metaData = new byte[NAME_LEN + LAST_MODIFIED_LEN +
USER_ID_LEN + GROUP_ID_LEN + FILE_MODE_LEN + LENGTH_LEN];
private ArArchiveInputStream(final Builder builder) throws IOException {
- this(builder.getInputStream(), builder);
+ super(builder);
}
/**
@@ -180,7 +181,7 @@ public ArArchiveInputStream(final InputStream inputStream) {
}
private ArArchiveInputStream(final InputStream inputStream, final Builder
builder) {
- super(inputStream, builder.getCharset());
+ super(inputStream, builder);
}
private int asInt(final byte[] byteArray, final int offset, final int len,
final boolean treatBlankAsZero) throws IOException {
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 de81ffbed..8e127ab8e 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
@@ -27,6 +27,7 @@
import java.util.ArrayList;
import java.util.zip.CRC32;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
@@ -60,7 +61,7 @@ public class ArjArchiveInputStream extends
ArchiveInputStream<ArjArchiveEntry> {
*
* @since 1.29.0
*/
- public static final class Builder extends
AbstractBuilder<ArjArchiveInputStream, Builder> {
+ public static final class Builder extends
AbstractArchiveBuilder<ArjArchiveInputStream, Builder> {
private Builder() {
setCharset(ENCODING_NAME);
@@ -117,7 +118,7 @@ public ArjArchiveInputStream(final InputStream inputStream)
throws ArchiveExcept
}
private ArjArchiveInputStream(final InputStream inputStream, final Builder
builder) throws ArchiveException {
- super(new DataInputStream(inputStream), builder.getCharset());
+ super(new DataInputStream(inputStream), builder);
dis = (DataInputStream) in;
try {
mainHeader = readMainHeader();
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 4b64ed841..2ef00b7b5 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
@@ -22,6 +22,7 @@
import java.io.IOException;
import java.io.InputStream;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipEncoding;
@@ -79,7 +80,7 @@ public class CpioArchiveInputStream extends
ArchiveInputStream<CpioArchiveEntry>
*
* @since 1.29.0
*/
- public static final class Builder extends
AbstractBuilder<CpioArchiveInputStream, Builder> {
+ public static final class Builder extends
AbstractArchiveBuilder<CpioArchiveInputStream, Builder> {
private int blockSize = BLOCK_SIZE;
@@ -211,7 +212,7 @@ public CpioArchiveInputStream(final InputStream in) {
}
private CpioArchiveInputStream(final InputStream in, final Builder
builder) {
- super(in, builder.getCharset());
+ super(in, builder);
if (builder.blockSize <= 0) {
throw new IllegalArgumentException("blockSize must be bigger than
0");
}
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 38b9ba846..89adec8d8 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
@@ -29,6 +29,7 @@
import java.util.Queue;
import java.util.Stack;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipEncoding;
@@ -60,7 +61,7 @@ public class DumpArchiveInputStream extends
ArchiveInputStream<DumpArchiveEntry>
*
* @since 1.29.0
*/
- public static final class Builder extends
AbstractBuilder<DumpArchiveInputStream, Builder> {
+ public static final class Builder extends
AbstractArchiveBuilder<DumpArchiveInputStream, Builder> {
private Builder() {
}
@@ -153,7 +154,7 @@ public DumpArchiveInputStream(final InputStream is) throws
ArchiveException {
}
private DumpArchiveInputStream(final InputStream is, final Builder
builder) throws ArchiveException {
- super(is, builder.getCharset());
+ super(is, builder);
this.raw = new TapeInputStream(is);
this.hasHitEOF = false;
this.zipEncoding =
ZipEncodingHelper.getZipEncoding(builder.getCharset());
diff --git
a/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java
b/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java
index e2a1b87c8..e1e8e2303 100644
--- a/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java
+++ b/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java
@@ -395,11 +395,11 @@ public void expand(final String format, final
SeekableByteChannel archive, final
if (!prefersSeekableByteChannel(format)) {
expand(format, c.track(Channels.newInputStream(archive)),
targetDirectory, CloseableConsumer.NULL_CONSUMER);
} else if (ArchiveStreamFactory.TAR.equalsIgnoreCase(format)) {
- expand(c.track(new TarFile(archive)), targetDirectory);
+ expand(c.track(TarFile.builder().setChannel(archive).get()),
targetDirectory);
} else if (ArchiveStreamFactory.ZIP.equalsIgnoreCase(format)) {
-
expand(c.track(ZipFile.builder().setSeekableByteChannel(archive).get()),
targetDirectory);
+ expand(c.track(ZipFile.builder().setChannel(archive).get()),
targetDirectory);
} else if (ArchiveStreamFactory.SEVEN_Z.equalsIgnoreCase(format)) {
-
expand(c.track(SevenZFile.builder().setSeekableByteChannel(archive).get()),
targetDirectory);
+
expand(c.track(SevenZFile.builder().setChannel(archive).get()),
targetDirectory);
} else {
// never reached as prefersSeekableByteChannel only returns
true for TAR, ZIP and 7z
throw new ArchiveException("Don't know how to handle format
'%s'", format);
diff --git
a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
index c75544f2a..c282f134d 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
@@ -34,14 +34,9 @@
import java.nio.ByteOrder;
import java.nio.channels.Channels;
import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.OpenOption;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
-import java.util.EnumSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
@@ -51,12 +46,10 @@
import java.util.zip.CheckedInputStream;
import org.apache.commons.compress.MemoryLimitException;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.compress.utils.InputStreamStatistics;
-import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
-import org.apache.commons.io.build.AbstractOrigin.ChannelOrigin;
-import org.apache.commons.io.build.AbstractStreamBuilder;
import org.apache.commons.io.input.BoundedInputStream;
import org.apache.commons.io.input.ChecksumInputStream;
import org.apache.commons.lang3.ArrayUtils;
@@ -178,13 +171,14 @@ public String toString() {
*
* @since 1.26.0
*/
- public static class Builder extends AbstractStreamBuilder<SevenZFile,
Builder> {
+ public static class Builder extends AbstractArchiveBuilder<SevenZFile,
Builder> {
static final int MEMORY_LIMIT_KIB = Integer.MAX_VALUE;
static final boolean USE_DEFAULTNAME_FOR_UNNAMED_ENTRIES = false;
static final boolean TRY_TO_RECOVER_BROKEN_ARCHIVES = false;
private String defaultName = DEFAULT_FILE_NAME;
+ private String name;
private byte[] password;
private int maxMemoryLimitKiB = MEMORY_LIMIT_KIB;
private boolean useDefaultNameForUnnamedEntries =
USE_DEFAULTNAME_FOR_UNNAMED_ENTRIES;
@@ -198,29 +192,7 @@ public static class Builder extends
AbstractStreamBuilder<SevenZFile, Builder> {
@SuppressWarnings("resource") // Caller closes
@Override
public SevenZFile get() throws IOException {
- final SeekableByteChannel actualChannel;
- final String actualDescription;
- final boolean isChannelOrigin = checkOrigin() instanceof
ChannelOrigin;
- boolean isSeekableByteChannellOrigin = false;
- if (isChannelOrigin) {
- actualChannel = getChannel(SeekableByteChannel.class);
- isSeekableByteChannellOrigin = true;
- actualDescription = defaultName;
- } else if (checkOrigin() instanceof ByteArrayOrigin) {
- actualChannel = getChannel(SeekableByteChannel.class);
- actualDescription = defaultName;
- } else {
- OpenOption[] openOptions = getOpenOptions();
- if (ArrayUtils.isEmpty(openOptions)) {
- openOptions = new OpenOption[] { StandardOpenOption.READ };
- }
- final Path path = getPath();
- actualChannel = Files.newByteChannel(path, openOptions);
- actualDescription = path.toAbsolutePath().toString();
- }
- final boolean closeOnError = isSeekableByteChannellOrigin;
- return new SevenZFile(actualChannel, actualDescription, password,
closeOnError, maxMemoryLimitKiB, useDefaultNameForUnnamedEntries,
- tryToRecoverBrokenArchives);
+ return new SevenZFile(this);
}
/**
@@ -234,6 +206,22 @@ public Builder setDefaultName(final String defaultName) {
return this;
}
+ Builder setName(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ String getName() {
+ if (name == null) {
+ try {
+ name = getPath().toAbsolutePath().toString();
+ } catch (UnsupportedOperationException e) {
+ name = defaultName;
+ }
+ }
+ return name;
+ }
+
/**
* Sets the maximum amount of memory in kilobytes to use for parsing
the archive and during extraction.
* <p>
@@ -263,6 +251,14 @@ public Builder setMaxMemoryLimitKiB(final int
maxMemoryLimitKiB) {
return this;
}
+ Builder setOptions(final SevenZFileOptions options) {
+ Objects.requireNonNull(options, "options");
+ this.maxMemoryLimitKiB = options.getMaxMemoryLimitInKb();
+ this.useDefaultNameForUnnamedEntries =
options.getUseDefaultNameForUnnamedEntries();
+ this.tryToRecoverBrokenArchives =
options.getTryToRecoverBrokenArchives();
+ return this;
+ }
+
/**
* Sets the password.
*
@@ -301,7 +297,9 @@ public Builder setPassword(final String password) {
*
* @param seekableByteChannel the input channel.
* @return {@code this} instance.
+ * @deprecated Since 1.29.0, use {@link #setChannel} instead.
*/
+ @Deprecated
public Builder setSeekableByteChannel(final SeekableByteChannel
seekableByteChannel) {
return setChannel(seekableByteChannel);
}
@@ -421,10 +419,6 @@ public static boolean matches(final byte[] buffer, final
int ignored) {
return ArrayUtils.startsWith(buffer, SIGNATURE);
}
- private static SeekableByteChannel newByteChannel(final File file) throws
IOException {
- return Files.newByteChannel(file.toPath(),
EnumSet.of(StandardOpenOption.READ));
- }
-
private static long readUint64(final ByteBuffer in) throws IOException {
// long rather than int as it might get shifted beyond the range of an
int
final long firstByte = getUnsignedByte(in);
@@ -496,7 +490,7 @@ public static int toNonNegativeInt(final String
description, final long value) t
*/
@Deprecated
public SevenZFile(final File fileName) throws IOException {
- this(fileName, SevenZFileOptions.DEFAULT);
+ this(builder().setFile(fileName));
}
/**
@@ -510,7 +504,7 @@ public SevenZFile(final File fileName) throws IOException {
@SuppressWarnings("resource") // caller closes
@Deprecated
public SevenZFile(final File file, final byte[] password) throws
IOException {
- this(newByteChannel(file), file.getAbsolutePath(), password, true,
SevenZFileOptions.DEFAULT);
+ this(builder().setFile(file).setPassword(password));
}
/**
@@ -524,7 +518,7 @@ public SevenZFile(final File file, final byte[] password)
throws IOException {
*/
@Deprecated
public SevenZFile(final File file, final char[] password) throws
IOException {
- this(file, password, SevenZFileOptions.DEFAULT);
+ this(builder().setFile(file).setPassword(password));
}
/**
@@ -540,8 +534,7 @@ public SevenZFile(final File file, final char[] password)
throws IOException {
@SuppressWarnings("resource") // caller closes
@Deprecated
public SevenZFile(final File file, final char[] password, final
SevenZFileOptions options) throws IOException {
- this(newByteChannel(file), // NOSONAR
- file.getAbsolutePath(),
AES256SHA256Decoder.utf16Decode(password), true, options);
+
this(builder().setFile(file).setPassword(password).setOptions(options));
}
/**
@@ -555,7 +548,7 @@ public SevenZFile(final File file, final char[] password,
final SevenZFileOption
*/
@Deprecated
public SevenZFile(final File file, final SevenZFileOptions options) throws
IOException {
- this(file, null, options);
+ this(builder().setFile(file).setOptions(options));
}
/**
@@ -571,7 +564,7 @@ public SevenZFile(final File file, final SevenZFileOptions
options) throws IOExc
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel) throws IOException {
- this(channel, SevenZFileOptions.DEFAULT);
+ this(builder().setChannel(channel));
}
/**
@@ -588,7 +581,7 @@ public SevenZFile(final SeekableByteChannel channel) throws
IOException {
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final byte[]
password) throws IOException {
- this(channel, DEFAULT_FILE_NAME, password);
+ this(builder().setChannel(channel).setPassword(password));
}
/**
@@ -605,7 +598,7 @@ public SevenZFile(final SeekableByteChannel channel, final
byte[] password) thro
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final char[]
password) throws IOException {
- this(channel, password, SevenZFileOptions.DEFAULT);
+ this(builder().setChannel(channel).setPassword(password));
}
/**
@@ -623,7 +616,7 @@ public SevenZFile(final SeekableByteChannel channel, final
char[] password) thro
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final char[]
password, final SevenZFileOptions options) throws IOException {
- this(channel, DEFAULT_FILE_NAME, password, options);
+
this(builder().setChannel(channel).setPassword(password).setOptions(options));
}
/**
@@ -640,7 +633,7 @@ public SevenZFile(final SeekableByteChannel channel, final
char[] password, fina
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final
SevenZFileOptions options) throws IOException {
- this(channel, DEFAULT_FILE_NAME, null, options);
+ this(builder().setChannel(channel).setOptions(options));
}
/**
@@ -657,7 +650,7 @@ public SevenZFile(final SeekableByteChannel channel, final
SevenZFileOptions opt
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final String
fileName) throws IOException {
- this(channel, fileName, SevenZFileOptions.DEFAULT);
+ this(builder().setChannel(channel).setName(fileName));
}
/**
@@ -675,52 +668,30 @@ public SevenZFile(final SeekableByteChannel channel,
final String fileName) thro
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final String
fileName, final byte[] password) throws IOException {
- this(channel, fileName, password, false, SevenZFileOptions.DEFAULT);
+
this(builder().setChannel(channel).setName(fileName).setPassword(password));
}
- private SevenZFile(final SeekableByteChannel channel, final String
fileName, final byte[] password, final boolean closeOnError, final int
maxMemoryLimitKiB,
- final boolean useDefaultNameForUnnamedEntries, final boolean
tryToRecoverBrokenArchives) throws IOException {
- boolean succeeded = false;
- this.channel = channel;
- this.fileName = fileName;
- this.maxMemoryLimitKiB = maxMemoryLimitKiB;
- this.useDefaultNameForUnnamedEntries = useDefaultNameForUnnamedEntries;
- this.tryToRecoverBrokenArchives = tryToRecoverBrokenArchives;
+ private SevenZFile(Builder builder) throws IOException {
+ this.channel = builder.getChannel(SeekableByteChannel.class);
try {
+ this.fileName = builder.getName();
+ this.maxMemoryLimitKiB = builder.maxMemoryLimitKiB;
+ this.useDefaultNameForUnnamedEntries =
builder.useDefaultNameForUnnamedEntries;
+ this.tryToRecoverBrokenArchives =
builder.tryToRecoverBrokenArchives;
+ final byte[] password = builder.password;
archive = readHeaders(password);
- if (password != null) {
- this.password = Arrays.copyOf(password, password.length);
- } else {
- this.password = null;
- }
- succeeded = true;
+ this.password = password != null ? Arrays.copyOf(password,
password.length) : null;
} catch (final ArithmeticException | IllegalArgumentException e) {
- throw new ArchiveException(e);
- } finally {
- if (!succeeded && closeOnError) {
- this.channel.close();
+ final ArchiveException archiveException = new ArchiveException(e);
+ try {
+ channel.close();
+ } catch (final IOException suppressed) {
+ archiveException.addSuppressed(suppressed);
}
+ throw archiveException;
}
}
- /**
- * Constructs a new instance.
- *
- * @param channel the channel to read.
- * @param fileName name of the archive - only used for error reporting.
- * @param password optional password if the archive is encrypted.
- * @param closeOnError closes the channel on error.
- * @param options options.
- * @throws IOException if reading the archive fails
- * @deprecated Use {@link Builder#get()}.
- */
- @Deprecated
- private SevenZFile(final SeekableByteChannel channel, final String
fileName, final byte[] password, final boolean closeOnError,
- final SevenZFileOptions options) throws IOException {
- this(channel, fileName, password, closeOnError,
options.getMaxMemoryLimitInKb(), options.getUseDefaultNameForUnnamedEntries(),
- options.getTryToRecoverBrokenArchives());
- }
-
/**
* Reads a SeekableByteChannel as 7z archive
* <p>
@@ -736,7 +707,7 @@ private SevenZFile(final SeekableByteChannel channel, final
String fileName, fin
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final String
fileName, final char[] password) throws IOException {
- this(channel, fileName, password, SevenZFileOptions.DEFAULT);
+
this(builder().setChannel(channel).setName(fileName).setPassword(password));
}
/**
@@ -755,7 +726,7 @@ public SevenZFile(final SeekableByteChannel channel, final
String fileName, fina
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final String
fileName, final char[] password, final SevenZFileOptions options) throws
IOException {
- this(channel, fileName, AES256SHA256Decoder.utf16Decode(password),
false, options);
+
this(builder().setChannel(channel).setName(fileName).setPassword(password).setOptions(options));
}
/**
@@ -773,7 +744,7 @@ public SevenZFile(final SeekableByteChannel channel, final
String fileName, fina
*/
@Deprecated
public SevenZFile(final SeekableByteChannel channel, final String
fileName, final SevenZFileOptions options) throws IOException {
- this(channel, fileName, null, false, options);
+
this(builder().setChannel(channel).setName(fileName).setOptions(options));
}
private InputStream buildDecoderStack(final Folder folder, final long
folderOffset, final int firstPackStreamIndex, final SevenZArchiveEntry entry)
diff --git
a/src/main/java/org/apache/commons/compress/archivers/tar/AbstractTarBuilder.java
b/src/main/java/org/apache/commons/compress/archivers/tar/AbstractTarBuilder.java
index 5555f5ccc..0f471a1ca 100644
---
a/src/main/java/org/apache/commons/compress/archivers/tar/AbstractTarBuilder.java
+++
b/src/main/java/org/apache/commons/compress/archivers/tar/AbstractTarBuilder.java
@@ -19,7 +19,7 @@
package org.apache.commons.compress.archivers.tar;
-import org.apache.commons.io.build.AbstractStreamBuilder;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
/**
* Abstracts TAR builder operations.
@@ -28,7 +28,7 @@
* @param <B> the type of builder subclass.
* @since 1.29.0
*/
-public abstract class AbstractTarBuilder<T, B extends AbstractTarBuilder<T,
B>> extends AbstractStreamBuilder<T, B> {
+public abstract class AbstractTarBuilder<T, B extends AbstractTarBuilder<T,
B>> extends AbstractArchiveBuilder<T, B> {
private int blockSize = TarConstants.DEFAULT_BLKSIZE;
private int recordSize = TarConstants.DEFAULT_RCDSIZE;
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 55d5705b0..51cf4862a 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
@@ -204,7 +204,7 @@ public TarArchiveInputStream(final InputStream inputStream,
final boolean lenien
}
private TarArchiveInputStream(final InputStream inputStream, final Builder
builder) {
- super(inputStream, builder.getCharset());
+ super(inputStream, builder);
this.zipEncoding =
ZipEncodingHelper.getZipEncoding(builder.getCharset());
this.recordBuffer = new byte[builder.getRecordSize()];
this.blockSize = builder.getBlockSize();
diff --git
a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
index 9ebb6c1d6..f6ee3ddf5 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
@@ -24,8 +24,8 @@
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -40,7 +40,6 @@
import org.apache.commons.compress.utils.ArchiveUtils;
import org.apache.commons.compress.utils.BoundedArchiveInputStream;
import org.apache.commons.compress.utils.BoundedSeekableByteChannelInputStream;
-import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.apache.commons.io.function.IOIterable;
import org.apache.commons.io.function.IOIterator;
import org.apache.commons.io.input.BoundedInputStream;
@@ -159,32 +158,18 @@ private int readSparse(final long pos, final ByteBuffer
buf, final int numToRead
*/
// @formatter:on
public static final class Builder extends AbstractTarBuilder<TarFile,
Builder> {
-
- private SeekableByteChannel channel;
-
/**
* Constructs a new instance.
*/
private Builder() {
- // empty
+ // Default options
+ setOpenOptions(StandardOpenOption.READ);
}
@Override
public TarFile get() throws IOException {
return new TarFile(this);
}
-
- /**
- * Sets the SeekableByteChannel.
- *
- * @param channel the SeekableByteChannel.
- * @return {@code this} instance.
- */
- public Builder setSeekableByteChannel(final SeekableByteChannel
channel) {
- this.channel = channel;
- return asThis();
- }
-
}
/**
@@ -234,13 +219,22 @@ public static Builder builder() {
private final Map<String, List<InputStream>> sparseInputStreams = new
HashMap<>();
private TarFile(final Builder builder) throws IOException {
- this.archive = builder.channel != null ? builder.channel :
Files.newByteChannel(builder.getPath());
- this.zipEncoding =
ZipEncodingHelper.getZipEncoding(builder.getCharset());
- this.recordSize = builder.getRecordSize();
- this.recordBuffer = ByteBuffer.allocate(this.recordSize);
- this.blockSize = builder.getBlockSize();
- this.lenient = builder.isLenient();
- forEach(entries::add);
+ this.archive = builder.getChannel(SeekableByteChannel.class);
+ try {
+ this.zipEncoding =
ZipEncodingHelper.getZipEncoding(builder.getCharset());
+ this.recordSize = builder.getRecordSize();
+ this.recordBuffer = ByteBuffer.allocate(this.recordSize);
+ this.blockSize = builder.getBlockSize();
+ this.lenient = builder.isLenient();
+ forEach(entries::add);
+ } catch (IOException ex) {
+ try {
+ this.archive.close();
+ } catch (final IOException e) {
+ ex.addSuppressed(e);
+ }
+ throw ex;
+ }
}
/**
@@ -252,7 +246,7 @@ private TarFile(final Builder builder) throws IOException {
*/
@Deprecated
public TarFile(final byte[] content) throws IOException {
- this(new SeekableInMemoryByteChannel(content));
+ this(builder().setByteArray(content));
}
/**
@@ -266,7 +260,7 @@ public TarFile(final byte[] content) throws IOException {
*/
@Deprecated
public TarFile(final byte[] content, final boolean lenient) throws
IOException {
- this(new SeekableInMemoryByteChannel(content),
TarConstants.DEFAULT_BLKSIZE, TarConstants.DEFAULT_RCDSIZE, null, lenient);
+ this(builder().setByteArray(content).setLenient(lenient));
}
/**
@@ -279,7 +273,7 @@ public TarFile(final byte[] content, final boolean lenient)
throws IOException {
*/
@Deprecated
public TarFile(final byte[] content, final String encoding) throws
IOException {
- this(new SeekableInMemoryByteChannel(content),
TarConstants.DEFAULT_BLKSIZE, TarConstants.DEFAULT_RCDSIZE, encoding, false);
+ this(builder().setByteArray(content).setCharset(encoding));
}
/**
@@ -291,7 +285,7 @@ public TarFile(final byte[] content, final String encoding)
throws IOException {
*/
@Deprecated
public TarFile(final File archive) throws IOException {
- this(archive.toPath());
+ this(builder().setFile(archive));
}
/**
@@ -305,7 +299,7 @@ public TarFile(final File archive) throws IOException {
*/
@Deprecated
public TarFile(final File archive, final boolean lenient) throws
IOException {
- this(archive.toPath(), lenient);
+ this(builder().setFile(archive).setLenient(lenient));
}
/**
@@ -318,7 +312,7 @@ public TarFile(final File archive, final boolean lenient)
throws IOException {
*/
@Deprecated
public TarFile(final File archive, final String encoding) throws
IOException {
- this(archive.toPath(), encoding);
+ this(builder().setFile(archive).setCharset(encoding));
}
/**
@@ -328,7 +322,7 @@ public TarFile(final File archive, final String encoding)
throws IOException {
* @throws IOException when reading the tar archive fails.
*/
public TarFile(final Path archivePath) throws IOException {
- this(Files.newByteChannel(archivePath), TarConstants.DEFAULT_BLKSIZE,
TarConstants.DEFAULT_RCDSIZE, null, false);
+ this(builder().setPath(archivePath));
}
/**
@@ -342,7 +336,7 @@ public TarFile(final Path archivePath) throws IOException {
*/
@Deprecated
public TarFile(final Path archivePath, final boolean lenient) throws
IOException {
- this(Files.newByteChannel(archivePath), TarConstants.DEFAULT_BLKSIZE,
TarConstants.DEFAULT_RCDSIZE, null, lenient);
+ this(builder().setPath(archivePath).setLenient(lenient));
}
/**
@@ -355,7 +349,7 @@ public TarFile(final Path archivePath, final boolean
lenient) throws IOException
*/
@Deprecated
public TarFile(final Path archivePath, final String encoding) throws
IOException {
- this(Files.newByteChannel(archivePath), TarConstants.DEFAULT_BLKSIZE,
TarConstants.DEFAULT_RCDSIZE, encoding, false);
+ this(builder().setPath(archivePath).setCharset(encoding));
}
/**
@@ -367,7 +361,7 @@ public TarFile(final Path archivePath, final String
encoding) throws IOException
*/
@Deprecated
public TarFile(final SeekableByteChannel content) throws IOException {
- this(content, TarConstants.DEFAULT_BLKSIZE,
TarConstants.DEFAULT_RCDSIZE, null, false);
+ this(builder().setChannel(content));
}
/**
@@ -385,7 +379,7 @@ public TarFile(final SeekableByteChannel content) throws
IOException {
@Deprecated
public TarFile(final SeekableByteChannel archive, final int blockSize,
final int recordSize, final String encoding, final boolean lenient)
throws IOException {
-
this(builder().setSeekableByteChannel(archive).setBlockSize(blockSize).setRecordSize(recordSize).setCharset(encoding).setLenient(lenient));
+
this(builder().setChannel(archive).setBlockSize(blockSize).setRecordSize(recordSize).setCharset(encoding).setLenient(lenient));
}
/**
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 1ea753abf..545d6f60d 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
@@ -42,6 +42,7 @@
import java.util.zip.ZipException;
import org.apache.commons.compress.MemoryLimitException;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
@@ -85,7 +86,7 @@ public class ZipArchiveInputStream extends
ArchiveInputStream<ZipArchiveEntry> i
* @since 1.29.0
*/
public abstract static class AbstractBuilder<T extends
ZipArchiveInputStream, B extends AbstractBuilder<T, B>>
- extends ArchiveInputStream.AbstractBuilder<T, B> {
+ extends AbstractArchiveBuilder<T, B> {
private boolean useUnicodeExtraFields = true;
private boolean supportStoredEntryDataDescriptor;
@@ -421,7 +422,7 @@ public ZipArchiveInputStream(final InputStream inputStream)
{
}
private ZipArchiveInputStream(final InputStream inputStream, final
AbstractBuilder<?, ?> builder) {
- super(inputStream, builder.getCharset());
+ super(inputStream, builder);
this.in = new PushbackInputStream(inputStream, buf.capacity());
this.zipEncoding =
ZipEncodingHelper.getZipEncoding(builder.getCharset());
this.useUnicodeExtraFields = builder.isUseUnicodeExtraFields();
diff --git
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
index fc2a90b33..40792f977 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
@@ -39,7 +39,6 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
-import java.util.EnumSet;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
@@ -51,6 +50,7 @@
import java.util.zip.Inflater;
import java.util.zip.ZipException;
+import org.apache.commons.compress.archivers.AbstractArchiveBuilder;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.EntryStreamOffsets;
import
org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
@@ -61,11 +61,7 @@
import org.apache.commons.compress.utils.BoundedSeekableByteChannelInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.compress.utils.InputStreamStatistics;
-import org.apache.commons.io.Charsets;
import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
-import org.apache.commons.io.build.AbstractOrigin.ChannelOrigin;
-import org.apache.commons.io.build.AbstractStreamBuilder;
import org.apache.commons.io.function.IOFunction;
import org.apache.commons.io.function.IOStream;
import org.apache.commons.io.input.BoundedInputStream;
@@ -132,12 +128,13 @@ protected int read(final long pos, final ByteBuffer buf)
throws IOException {
*
* @since 1.26.0
*/
- public static class Builder extends AbstractStreamBuilder<ZipFile,
Builder> {
+ public static class Builder extends AbstractArchiveBuilder<ZipFile,
Builder> {
- static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
+ private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private boolean useUnicodeExtraFields = true;
private boolean ignoreLocalFileHeader;
private long maxNumberOfDisks = 1;
+ private String name;
private IOFunction<InputStream, InputStream> zstdInputStreamFactory;
/**
@@ -146,33 +143,12 @@ public static class Builder extends
AbstractStreamBuilder<ZipFile, Builder> {
public Builder() {
setCharset(DEFAULT_CHARSET);
setCharsetDefault(DEFAULT_CHARSET);
+ setOpenOptions(StandardOpenOption.READ);
}
@Override
public ZipFile get() throws IOException {
- final SeekableByteChannel actualChannel;
- final String actualDescription;
- final boolean isChannelOrigin = checkOrigin() instanceof
ChannelOrigin;
- boolean isSeekableByteChannellOrigin = false;
- if (isChannelOrigin) {
- actualChannel = getChannel(SeekableByteChannel.class);
- isSeekableByteChannellOrigin = true;
- actualDescription = actualChannel.getClass().getSimpleName();
- } else if (checkOrigin() instanceof ByteArrayOrigin) {
- actualChannel = getChannel(SeekableByteChannel.class);
- actualDescription = actualChannel.getClass().getSimpleName();
- } else {
- OpenOption[] openOptions = getOpenOptions();
- if (openOptions.length == 0) {
- openOptions = new OpenOption[] { StandardOpenOption.READ };
- }
- final Path path = getPath();
- actualChannel = openZipChannel(path, maxNumberOfDisks,
openOptions);
- actualDescription = path.toString();
- }
- final boolean closeOnError = isSeekableByteChannellOrigin;
- return new ZipFile(actualChannel, actualDescription, getCharset(),
useUnicodeExtraFields, closeOnError, ignoreLocalFileHeader,
- zstdInputStreamFactory);
+ return new ZipFile(this);
}
/**
@@ -197,12 +173,30 @@ public Builder setMaxNumberOfDisks(final long
maxNumberOfDisks) {
return this;
}
+ Builder setName(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ String getName() {
+ if (name == null) {
+ try {
+ name = getPath().toAbsolutePath().toString();
+ } catch (UnsupportedOperationException ex) {
+ name = "unknown";
+ }
+ }
+ return name;
+ }
+
/**
* The actual channel, overrides any other input aspects like a File,
Path, and so on.
*
* @param seekableByteChannel The actual channel.
* @return {@code this} instance.
+ * @deprecated Since 1.29.0, use {@link #setChannel} instead.
*/
+ @Deprecated
public Builder setSeekableByteChannel(final SeekableByteChannel
seekableByteChannel) {
return setChannel(seekableByteChannel);
}
@@ -284,10 +278,6 @@ public long getUncompressedCount() {
}
}
- private static final String DEFAULT_CHARSET_NAME =
StandardCharsets.UTF_8.name();
-
- private static final EnumSet<StandardOpenOption> READ =
EnumSet.of(StandardOpenOption.READ);
-
private static final int HASH_SIZE = 509;
static final int NIBLET_MASK = 0x0f;
static final int BYTE_SHIFT = 8;
@@ -512,19 +502,8 @@ public static void closeQuietly(final ZipFile zipFile) {
org.apache.commons.io.IOUtils.closeQuietly(zipFile);
}
- /**
- * Creates a new SeekableByteChannel for reading.
- *
- * @param path the path to the file to open or create
- * @return a new seekable byte channel
- * @throws IOException if an I/O error occurs
- */
- private static SeekableByteChannel newReadByteChannel(final Path path)
throws IOException {
- return Files.newByteChannel(path, READ);
- }
-
private static SeekableByteChannel openZipChannel(final Path path, final
long maxNumberOfDisks, final OpenOption[] openOptions) throws IOException {
- final FileChannel channel = FileChannel.open(path,
StandardOpenOption.READ);
+ final FileChannel channel = FileChannel.open(path, openOptions);
try {
final boolean is64 =
positionAtEndOfCentralDirectoryRecord(channel);
final long numberOfDisks;
@@ -761,7 +740,7 @@ private static boolean tryToLocateSignature(final
SeekableByteChannel channel, f
*/
@Deprecated
public ZipFile(final File file) throws IOException {
- this(file, DEFAULT_CHARSET_NAME);
+ this(builder().setFile(file));
}
/**
@@ -774,7 +753,7 @@ public ZipFile(final File file) throws IOException {
*/
@Deprecated
public ZipFile(final File file, final String encoding) throws IOException {
- this(file.toPath(), encoding, true);
+ this(builder().setFile(file).setCharset(encoding));
}
/**
@@ -788,7 +767,7 @@ public ZipFile(final File file, final String encoding)
throws IOException {
*/
@Deprecated
public ZipFile(final File file, final String encoding, final boolean
useUnicodeExtraFields) throws IOException {
- this(file.toPath(), encoding, useUnicodeExtraFields, false);
+
this(builder().setFile(file).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields));
}
/**
@@ -810,9 +789,8 @@ public ZipFile(final File file, final String encoding,
final boolean useUnicodeE
* @deprecated Use {@link Builder#get()}.
*/
@Deprecated
- @SuppressWarnings("resource") // Caller closes
public ZipFile(final File file, final String encoding, final boolean
useUnicodeExtraFields, final boolean ignoreLocalFileHeader) throws IOException {
- this(newReadByteChannel(file.toPath()), file.getAbsolutePath(),
encoding, useUnicodeExtraFields, true, ignoreLocalFileHeader);
+
this(builder().setFile(file).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields).setIgnoreLocalFileHeader(ignoreLocalFileHeader));
}
/**
@@ -825,7 +803,7 @@ public ZipFile(final File file, final String encoding,
final boolean useUnicodeE
*/
@Deprecated
public ZipFile(final Path path) throws IOException {
- this(path, DEFAULT_CHARSET_NAME);
+ this(builder().setPath(path));
}
/**
@@ -839,7 +817,7 @@ public ZipFile(final Path path) throws IOException {
*/
@Deprecated
public ZipFile(final Path path, final String encoding) throws IOException {
- this(path, encoding, true);
+ this(builder().setPath(path).setCharset(encoding));
}
/**
@@ -854,7 +832,7 @@ public ZipFile(final Path path, final String encoding)
throws IOException {
*/
@Deprecated
public ZipFile(final Path path, final String encoding, final boolean
useUnicodeExtraFields) throws IOException {
- this(path, encoding, useUnicodeExtraFields, false);
+
this(builder().setPath(path).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields));
}
/**
@@ -878,7 +856,7 @@ public ZipFile(final Path path, final String encoding,
final boolean useUnicodeE
@SuppressWarnings("resource") // Caller closes
@Deprecated
public ZipFile(final Path path, final String encoding, final boolean
useUnicodeExtraFields, final boolean ignoreLocalFileHeader) throws IOException {
- this(newReadByteChannel(path), path.toAbsolutePath().toString(),
encoding, useUnicodeExtraFields, true, ignoreLocalFileHeader);
+
this(builder().setPath(path).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields).setIgnoreLocalFileHeader(ignoreLocalFileHeader));
}
/**
@@ -894,7 +872,7 @@ public ZipFile(final Path path, final String encoding,
final boolean useUnicodeE
*/
@Deprecated
public ZipFile(final SeekableByteChannel channel) throws IOException {
- this(channel, "a SeekableByteChannel", DEFAULT_CHARSET_NAME, true);
+ this(builder().setChannel(channel));
}
/**
@@ -911,32 +889,38 @@ public ZipFile(final SeekableByteChannel channel) throws
IOException {
*/
@Deprecated
public ZipFile(final SeekableByteChannel channel, final String encoding)
throws IOException {
- this(channel, "a SeekableByteChannel", encoding, true);
+ this(builder().setChannel(channel).setCharset(encoding));
}
- private ZipFile(final SeekableByteChannel channel, final String
channelDescription, final Charset encoding, final boolean useUnicodeExtraFields,
- final boolean closeOnError, final boolean ignoreLocalFileHeader,
final IOFunction<InputStream, InputStream> zstdInputStream) throws IOException {
- this.isSplitZipArchive = channel instanceof
ZipSplitReadOnlySeekableByteChannel;
- this.encoding = Charsets.toCharset(encoding, Builder.DEFAULT_CHARSET);
- this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
- this.useUnicodeExtraFields = useUnicodeExtraFields;
- this.archive = channel;
- this.zstdInputStreamFactory = zstdInputStream;
- boolean success = false;
+ private ZipFile(Builder builder) throws IOException {
+ SeekableByteChannel archive;
try {
+ final Path path = builder.getPath();
+ archive = openZipChannel(path, builder.maxNumberOfDisks,
builder.getOpenOptions());
+ } catch (UnsupportedOperationException e) {
+ archive = builder.getChannel(SeekableByteChannel.class);
+ }
+ this.archive = archive;
+ try {
+ this.isSplitZipArchive = this.archive instanceof
ZipSplitReadOnlySeekableByteChannel;
+ this.encoding = builder.getCharset();
+ this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding);
+ this.useUnicodeExtraFields = builder.useUnicodeExtraFields;
+ this.zstdInputStreamFactory = builder.zstdInputStreamFactory;
final Map<ZipArchiveEntry, NameAndComment> entriesWithoutUTF8Flag
= populateFromCentralDirectory();
- if (!ignoreLocalFileHeader) {
+ if (!builder.ignoreLocalFileHeader) {
resolveLocalFileHeaderData(entriesWithoutUTF8Flag);
}
fillNameMap();
- success = true;
} catch (final IOException e) {
- throw new ArchiveException("Error reading Zip content from " +
channelDescription, (Throwable) e);
- } finally {
- this.closed = !success;
- if (!success && closeOnError) {
- org.apache.commons.io.IOUtils.closeQuietly(archive);
+ final ArchiveException archiveException = new
ArchiveException("Error reading Zip content from " + builder.getName(),
(Throwable) e);
+ this.closed = true;
+ try {
+ this.archive.close();
+ } catch (final IOException ioException) {
+ archiveException.addSuppressed(ioException);
}
+ throw archiveException;
}
}
@@ -957,7 +941,7 @@ private ZipFile(final SeekableByteChannel channel, final
String channelDescripti
@Deprecated
public ZipFile(final SeekableByteChannel channel, final String
channelDescription, final String encoding, final boolean useUnicodeExtraFields)
throws IOException {
- this(channel, channelDescription, encoding, useUnicodeExtraFields,
false, false);
+
this(builder().setChannel(channel).setName(channelDescription).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields));
}
/**
@@ -985,12 +969,8 @@ public ZipFile(final SeekableByteChannel channel, final
String channelDescriptio
@Deprecated
public ZipFile(final SeekableByteChannel channel, final String
channelDescription, final String encoding, final boolean useUnicodeExtraFields,
final boolean ignoreLocalFileHeader) throws IOException {
- this(channel, channelDescription, encoding, useUnicodeExtraFields,
false, ignoreLocalFileHeader);
- }
-
- private ZipFile(final SeekableByteChannel channel, final String
channelDescription, final String encoding, final boolean useUnicodeExtraFields,
- final boolean closeOnError, final boolean ignoreLocalFileHeader)
throws IOException {
- this(channel, channelDescription, Charsets.toCharset(encoding),
useUnicodeExtraFields, closeOnError, ignoreLocalFileHeader, null);
+
this(builder().setChannel(channel).setName(channelDescription).setCharset(encoding).setUseUnicodeExtraFields(useUnicodeExtraFields)
+ .setIgnoreLocalFileHeader(ignoreLocalFileHeader));
}
/**
@@ -1002,7 +982,7 @@ private ZipFile(final SeekableByteChannel channel, final
String channelDescripti
*/
@Deprecated
public ZipFile(final String name) throws IOException {
- this(new File(name).toPath(), DEFAULT_CHARSET_NAME);
+ this(builder().setFile(name));
}
/**
@@ -1015,7 +995,7 @@ public ZipFile(final String name) throws IOException {
*/
@Deprecated
public ZipFile(final String name, final String encoding) throws
IOException {
- this(new File(name).toPath(), encoding, true);
+ this(builder().setFile(name).setCharset(encoding));
}
/**
diff --git
a/src/test/java/org/apache/commons/compress/LegacyConstructorsTest.java
b/src/test/java/org/apache/commons/compress/LegacyConstructorsTest.java
index 2a3d4122f..d60863c6e 100644
--- a/src/test/java/org/apache/commons/compress/LegacyConstructorsTest.java
+++ b/src/test/java/org/apache/commons/compress/LegacyConstructorsTest.java
@@ -21,20 +21,33 @@
import static java.nio.charset.StandardCharsets.US_ASCII;
import static org.apache.commons.lang3.reflect.FieldUtils.readDeclaredField;
import static org.apache.commons.lang3.reflect.FieldUtils.readField;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
+import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
+import java.nio.channels.SeekableByteChannel;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import java.util.stream.Stream;
import org.apache.commons.compress.archivers.arj.ArjArchiveInputStream;
import org.apache.commons.compress.archivers.cpio.CpioArchiveInputStream;
import org.apache.commons.compress.archivers.dump.DumpArchiveInputStream;
import org.apache.commons.compress.archivers.jar.JarArchiveInputStream;
+import org.apache.commons.compress.archivers.sevenz.SevenZFile;
+import org.apache.commons.compress.archivers.sevenz.SevenZFileOptions;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.archivers.tar.TarFile;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.apache.commons.compress.archivers.zip.ZipEncoding;
+import org.apache.commons.compress.archivers.zip.ZipFile;
+import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -120,6 +133,63 @@ void testJarConstructor() throws Exception {
}
}
+ static Stream<Arguments> testSevenZFileContructors() throws IOException {
+ final Path path = getPath("bla.7z");
+ final String defaultName = "unknown archive";
+ final String otherName = path.toAbsolutePath().toString();
+ final String customName = "customName";
+ final int defaultMemoryLimit =
SevenZFileOptions.DEFAULT.getMaxMemoryLimitInKb();
+ final boolean defaultUseDefaultNameForUnnamedEntries =
SevenZFileOptions.DEFAULT.getUseDefaultNameForUnnamedEntries();
+ final boolean defaultTryToRecoverBrokenArchives =
SevenZFileOptions.DEFAULT.getTryToRecoverBrokenArchives();
+ final SevenZFileOptions otherOptions =
+
SevenZFileOptions.builder().withMaxMemoryLimitInKb(42).withTryToRecoverBrokenArchives(true).withUseDefaultNameForUnnamedEntries(true).build();
+ final char[] otherPassword = "password".toCharArray();
+ final byte[] otherPasswordBytes =
"password".getBytes(StandardCharsets.UTF_16LE);
+ return Stream.of(
+ // From File
+ Arguments.of(new SevenZFile(path.toFile()), otherName,
defaultMemoryLimit, defaultUseDefaultNameForUnnamedEntries,
+ defaultTryToRecoverBrokenArchives, null),
+ Arguments.of(new SevenZFile(path.toFile(),
otherPasswordBytes), otherName, defaultMemoryLimit,
defaultUseDefaultNameForUnnamedEntries,
+ defaultTryToRecoverBrokenArchives, otherPasswordBytes),
+ Arguments.of(new SevenZFile(path.toFile(), otherPassword),
otherName, defaultMemoryLimit, defaultUseDefaultNameForUnnamedEntries,
+ defaultTryToRecoverBrokenArchives, otherPasswordBytes),
+ Arguments.of(new SevenZFile(path.toFile(), otherPassword,
otherOptions), otherName, 42, true, true, otherPasswordBytes),
+ Arguments.of(new SevenZFile(path.toFile(), otherOptions),
otherName, 42, true, true, null),
+ // From SeekableByteChannel
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ)), defaultName, defaultMemoryLimit,
+ defaultUseDefaultNameForUnnamedEntries,
defaultTryToRecoverBrokenArchives, null),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), otherPasswordBytes), defaultName, defaultMemoryLimit,
+ defaultUseDefaultNameForUnnamedEntries,
defaultTryToRecoverBrokenArchives, otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), otherPassword), defaultName, defaultMemoryLimit,
+ defaultUseDefaultNameForUnnamedEntries,
defaultTryToRecoverBrokenArchives, otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), otherPassword, otherOptions), defaultName, 42, true,
true,
+ otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), otherOptions), defaultName, 42, true, true, null),
+ // From SeekableByteChannel with custom name
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), customName), customName, defaultMemoryLimit,
+ defaultUseDefaultNameForUnnamedEntries,
defaultTryToRecoverBrokenArchives, null),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), customName, otherPasswordBytes), customName,
+ defaultMemoryLimit,
defaultUseDefaultNameForUnnamedEntries, defaultTryToRecoverBrokenArchives,
otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), customName, otherPassword), customName,
defaultMemoryLimit,
+ defaultUseDefaultNameForUnnamedEntries,
defaultTryToRecoverBrokenArchives, otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), customName, otherPassword, otherOptions), customName,
42,
+ true, true, otherPasswordBytes),
+ Arguments.of(new SevenZFile(Files.newByteChannel(path,
StandardOpenOption.READ), customName, otherOptions), customName, 42, true,
+ true, null));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void testSevenZFileContructors(final SevenZFile archiveFile, final String
expectedName, final int expectedMemoryLimit,
+ final boolean expectedUseDefaultNameForUnnamedEntries, final
boolean expectedTryToRecoverBrokenArchives,
+ final byte[] expectedPassword) throws Exception {
+ assertEquals(expectedName, readDeclaredField(archiveFile, "fileName",
true));
+ assertEquals(expectedMemoryLimit, readDeclaredField(archiveFile,
"maxMemoryLimitKiB", true));
+ assertEquals(expectedUseDefaultNameForUnnamedEntries,
readDeclaredField(archiveFile, "useDefaultNameForUnnamedEntries", true));
+ assertEquals(expectedTryToRecoverBrokenArchives,
readDeclaredField(archiveFile, "tryToRecoverBrokenArchives", true));
+ assertArrayEquals(expectedPassword, (byte[])
readDeclaredField(archiveFile, "password", true));
+ }
+
@ParameterizedTest
@MethodSource
void testTarConstructors(final TarArchiveInputStream archiveStream, final
InputStream expectedInput, final int expectedBlockSize,
@@ -132,6 +202,35 @@ void testTarConstructors(final TarArchiveInputStream
archiveStream, final InputS
assertEquals(expectedLenient, readField(archiveStream, "lenient",
true));
}
+ static Stream<Arguments> testTarFileConstructors() throws IOException {
+ final Path path = getPath("bla.tar");
+ final File file = getFile("bla.tar");
+ final SeekableByteChannel channel = mock(SeekableByteChannel.class);
+ final String defaultEncoding = Charset.defaultCharset().name();
+ final String otherEncoding = "UTF-8".equals(defaultEncoding) ?
"US-ASCII" : "UTF-8";
+ return Stream.of(
+ Arguments.of(new TarFile(IOUtils.EMPTY_BYTE_ARRAY),
defaultEncoding, false),
+ Arguments.of(new TarFile(IOUtils.EMPTY_BYTE_ARRAY, true),
defaultEncoding, true),
+ Arguments.of(new TarFile(IOUtils.EMPTY_BYTE_ARRAY,
otherEncoding), otherEncoding, false),
+ Arguments.of(new TarFile(file), defaultEncoding, false),
+ Arguments.of(new TarFile(file, true), defaultEncoding, true),
+ Arguments.of(new TarFile(file, otherEncoding), otherEncoding,
false),
+ Arguments.of(new TarFile(path), defaultEncoding, false),
+ Arguments.of(new TarFile(path, true), defaultEncoding, true),
+ Arguments.of(new TarFile(path, otherEncoding), otherEncoding,
false),
+ Arguments.of(new TarFile(channel), defaultEncoding, false),
+ Arguments.of(new TarFile(channel, 1024, 1024, otherEncoding,
true), otherEncoding, true));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void testTarFileConstructors(final TarFile tarFile, final String
expectedEncoding, final boolean expectedLenient) throws Exception {
+ final ZipEncoding encoding = (ZipEncoding) readDeclaredField(tarFile,
"zipEncoding", true);
+ final Charset charset = (Charset) readDeclaredField(encoding,
"charset", true);
+ assertEquals(Charset.forName(expectedEncoding), charset);
+ assertEquals(expectedLenient, readDeclaredField(tarFile, "lenient",
true));
+ }
+
@ParameterizedTest
@MethodSource
void testZipConstructors(final ZipArchiveInputStream archiveStream, final
InputStream expectedInput, final String expectedEncoding,
@@ -144,4 +243,34 @@ void testZipConstructors(final ZipArchiveInputStream
archiveStream, final InputS
assertEquals(expectedSupportStoredEntryDataDescriptor,
readDeclaredField(archiveStream, "supportStoredEntryDataDescriptor", true));
assertEquals(expectedSkipSplitSignature,
readDeclaredField(archiveStream, "skipSplitSignature", true));
}
+
+ static Stream<Arguments> testZipFileConstructors() throws IOException {
+ final Path path = getPath("bla.zip");
+ final String defaultEncoding = StandardCharsets.UTF_8.name();
+ final String otherEncoding = "UTF-8".equals(defaultEncoding) ?
"US-ASCII" : "UTF-8";
+ return Stream.of(
+ Arguments.of(new ZipFile(path.toFile()), defaultEncoding,
true),
+ Arguments.of(new ZipFile(path.toFile(), otherEncoding),
otherEncoding, true),
+ Arguments.of(new ZipFile(path.toFile(), otherEncoding, false),
otherEncoding, false),
+ Arguments.of(new ZipFile(path.toFile(), otherEncoding, false,
true), otherEncoding, false),
+ Arguments.of(new ZipFile(path), defaultEncoding, true),
+ Arguments.of(new ZipFile(path, otherEncoding), otherEncoding,
true),
+ Arguments.of(new ZipFile(path, otherEncoding, false),
otherEncoding, false),
+ Arguments.of(new ZipFile(path, otherEncoding, false, true),
otherEncoding, false),
+ Arguments.of(new ZipFile(Files.newByteChannel(path,
StandardOpenOption.READ)), defaultEncoding, true),
+ Arguments.of(new ZipFile(Files.newByteChannel(path,
StandardOpenOption.READ), otherEncoding), otherEncoding, true),
+ Arguments.of(new ZipFile(Files.newByteChannel(path,
StandardOpenOption.READ), null, otherEncoding, false),
+ otherEncoding, false),
+ Arguments.of(new ZipFile(Files.newByteChannel(path,
StandardOpenOption.READ), null, otherEncoding, false, true),
+ otherEncoding, false),
+ Arguments.of(new ZipFile(path.toAbsolutePath().toString()),
defaultEncoding, true),
+ Arguments.of(new ZipFile(path.toAbsolutePath().toString(),
otherEncoding), otherEncoding, true));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void testZipFileConstructors(final ZipFile zipFile, final String
expectedEncoding, final boolean expectedUseUnicodeExtraFields) throws Exception
{
+ assertEquals(Charset.forName(expectedEncoding),
readDeclaredField(zipFile, "encoding", true));
+ assertEquals(expectedUseUnicodeExtraFields, readDeclaredField(zipFile,
"useUnicodeExtraFields", true));
+ }
}
diff --git a/src/test/java/org/apache/commons/compress/archivers/TarTest.java
b/src/test/java/org/apache/commons/compress/archivers/TarTest.java
index 09116d76c..f80b05f32 100644
--- a/src/test/java/org/apache/commons/compress/archivers/TarTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/TarTest.java
@@ -289,7 +289,7 @@ void testTarArchiveLongNameCreation() throws Exception {
@Test
void testTarFileCOMPRESS114() throws Exception {
final File input = getFile("COMPRESS-114.tar");
- try (TarFile tarFile = new TarFile(input,
StandardCharsets.ISO_8859_1.name())) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-114.tar")).setCharset(StandardCharsets.ISO_8859_1).get())
{
final List<TarArchiveEntry> entries = tarFile.getEntries();
TarArchiveEntry entry = entries.get(0);
assertEquals("3\u00b1\u00b1\u00b1F06\u00b1W2345\u00b1ZB\u00b1la\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1BLA",
entry.getName());
@@ -304,7 +304,7 @@ void testTarFileCOMPRESS114() throws Exception {
void testTarFileCOMPRESS178() throws Exception {
final File input = getFile("COMPRESS-178-fail.tar");
final IOException e = assertThrows(ArchiveException.class, () -> {
- try (TarFile tarFile = new TarFile(input)) {
+ try (TarFile tarFile = TarFile.builder().setFile(input).get()) {
// Compared to the TarArchiveInputStream all entries are read
when instantiating the tar file
}
}, "Expected IOException");
@@ -315,7 +315,7 @@ void testTarFileCOMPRESS178() throws Exception {
@Test
void testTarFileCOMPRESS178Lenient() throws Exception {
final File input = getFile("COMPRESS-178-fail.tar");
- try (TarFile tarFile = new TarFile(input, true)) {
+ try (TarFile tarFile =
TarFile.builder().setFile(input).setLenient(true).get()) {
// Compared to the TarArchiveInputStream all entries are read when
instantiating the tar file
}
}
@@ -330,7 +330,7 @@ void testTarFileDirectoryEntryFromFile() throws Exception {
tos.putArchiveEntry(in);
tos.closeArchiveEntry();
tos.close();
- try (TarFile tarFile = new TarFile(archive)) {
+ try (TarFile tarFile = TarFile.builder().setFile(archive).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
assertNotNull(entry);
assertEquals("foo/", entry.getName());
@@ -346,7 +346,7 @@ void testTarFileDirectoryEntryFromFile() throws Exception {
@Test
void testTarFileDirectoryRead() throws IOException {
final File input = getFile("directory.tar");
- try (TarFile tarFile = new TarFile(input)) {
+ try (TarFile tarFile = TarFile.builder().setFile(input).get()) {
final TarArchiveEntry directoryEntry = tarFile.getEntries().get(0);
assertEquals("directory/", directoryEntry.getName());
assertEquals(TarConstants.LF_DIR, directoryEntry.getLinkFlag());
@@ -368,7 +368,7 @@ void testTarFileEntryFromFile() throws Exception {
outputStream.write(file);
outputStream.closeArchiveEntry();
outputStream.close();
- try (TarFile tarFile = new TarFile(archive)) {
+ try (TarFile tarFile = TarFile.builder().setFile(archive).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
assertNotNull(entry);
assertEquals("foo", entry.getName());
@@ -390,7 +390,7 @@ void testTarFileExplicitDirectoryEntry() throws Exception {
tos.putArchiveEntry(in);
tos.closeArchiveEntry();
tos.close();
- try (TarFile tarFile = new TarFile(archive)) {
+ try (TarFile tarFile = TarFile.builder().setFile(archive).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
assertNotNull(entry);
assertEquals("foo/", entry.getName());
@@ -413,7 +413,7 @@ void testTarFileExplicitFileEntry() throws Exception {
outputStream.putArchiveEntry(in);
outputStream.write(file);
outputStream.closeArchiveEntry();
- try (TarFile tarFile = new TarFile(archive)) {
+ try (TarFile tarFile = TarFile.builder().setFile(archive).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
assertNotNull(entry);
assertEquals("foo", entry.getName());
@@ -433,7 +433,7 @@ void testTarFileLongNameLargerThanBuffer() throws
IOException {
final String fileName = createLongName(length);
assertEquals(length.intValue(), fileName.length());
final byte[] data = createTarWithOneLongNameEntry(fileName);
- try (TarFile tarFile = new TarFile(data)) {
+ try (TarFile tarFile = TarFile.builder().setByteArray(data).get())
{
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(fileName, entries.get(0).getName());
assertEquals(TarConstants.LF_NORMAL,
entries.get(0).getLinkFlag());
@@ -444,7 +444,7 @@ void testTarFileLongNameLargerThanBuffer() throws
IOException {
@Test
void testTarFileUnarchive() throws Exception {
final File file = getFile("bla.tar");
- try (TarFile tarFile = new TarFile(file)) {
+ try (TarFile tarFile = TarFile.builder().setFile(file).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
try (InputStream inputStream = tarFile.getInputStream(entry)) {
Files.copy(inputStream, newTempFile(entry.getName()).toPath());
diff --git
a/src/test/java/org/apache/commons/compress/archivers/examples/ExpanderTest.java
b/src/test/java/org/apache/commons/compress/archivers/examples/ExpanderTest.java
index a7ccedc66..9c6eddbb2 100644
---
a/src/test/java/org/apache/commons/compress/archivers/examples/ExpanderTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/examples/ExpanderTest.java
@@ -174,7 +174,7 @@ private void setupZip(final String entry) throws
IOException, ArchiveException {
@Test
void testCompress603Tar() throws IOException, ArchiveException {
setupTarForCompress603();
- try (TarFile f = new TarFile(archive)) {
+ try (TarFile f = TarFile.builder().setFile(archive).get()) {
new Expander().expand(f, tempResultDir);
}
verifyTargetDir();
@@ -261,7 +261,7 @@ void testSevenZTwoFileVersionWithAutoDetection() throws
IOException, ArchiveExce
@Test
void testTarFileVersion() throws IOException, ArchiveException {
setupTar();
- try (TarFile f = new TarFile(archive)) {
+ try (TarFile f = TarFile.builder().setFile(archive).get()) {
new Expander().expand(f, tempResultDir);
}
verifyTargetDir();
diff --git
a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
index 446a2ba64..6df5b102f 100644
---
a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
@@ -160,10 +160,6 @@ void test7zDeflateUnarchive() throws Exception {
@Test
void test7zMultiVolumeUnarchive() throws Exception {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new
SevenZFile(MultiReadOnlySeekableByteChannel.forFiles(getFile("bla-multi.7z.001"),
getFile("bla-multi.7z.002")))) {
- test7zUnarchive(sevenZFile, SevenZMethod.LZMA2);
- }
try (SevenZFile sevenZFile = SevenZFile.builder()
.setSeekableByteChannel(MultiReadOnlySeekableByteChannel.forFiles(getFile("bla-multi.7z.001"),
getFile("bla-multi.7z.002"))).get()) {
test7zUnarchive(sevenZFile, SevenZMethod.LZMA2);
@@ -184,10 +180,6 @@ private void test7zUnarchive(final File file, final
SevenZMethod method, final b
}
private void test7zUnarchive(final File file, final SevenZMethod method,
final byte[] password) throws Exception {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new SevenZFile(file, password)) {
- test7zUnarchive(sevenZFile, method);
- }
try (SevenZFile sevenZFile =
SevenZFile.builder().setFile(file).setPassword(password).get()) {
test7zUnarchive(sevenZFile, method);
}
@@ -198,11 +190,6 @@ private void test7zUnarchive(final File file, final
SevenZMethod m, final char[]
}
private void test7zUnarchive(final File file, final SevenZMethod m, final
char[] password, final boolean tryToRecoverBrokenArchives) throws Exception {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new SevenZFile(file, password,
-
SevenZFileOptions.builder().withTryToRecoverBrokenArchives(tryToRecoverBrokenArchives).build()))
{
- test7zUnarchive(sevenZFile, m);
- }
try (SevenZFile sevenZFile =
SevenZFile.builder().setFile(file).setPassword(password).setTryToRecoverBrokenArchives(tryToRecoverBrokenArchives).get())
{
test7zUnarchive(sevenZFile, m);
}
@@ -324,8 +311,7 @@ void testExtractSpecifiedFile() throws Exception {
@Test
void testExtractSpecifiedFileDeprecated() throws Exception {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new SevenZFile(getFile("COMPRESS-256.7z"))) {
+ try (SevenZFile sevenZFile =
SevenZFile.builder().setURI(getURI("COMPRESS-256.7z")).get()) {
// @formatter:off
final String testTxtContents =
"111111111111111111111111111000101011\n"
@@ -364,10 +350,6 @@ void testGetDefaultName() throws Exception {
try (SevenZFile sevenZFile =
SevenZFile.builder().setSeekableByteChannel(Files.newByteChannel(getFile("bla.deflate64.7z").toPath())).get())
{
assertNull(sevenZFile.getDefaultName());
}
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new
SevenZFile(Files.newByteChannel(getFile("bla.deflate64.7z").toPath()), "foo")) {
- assertEquals("foo~", sevenZFile.getDefaultName());
- }
try (SevenZFile sevenZFile =
SevenZFile.builder().setSeekableByteChannel(Files.newByteChannel(getFile("bla.deflate64.7z").toPath()))
.setDefaultName("foo").get()) {
assertEquals("foo~", sevenZFile.getDefaultName());
@@ -407,16 +389,6 @@ void testGetEntriesOfUnarchiveTest() throws IOException {
@Test
void testGivenNameWinsOverDefaultName() throws Exception {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new SevenZFile(getFile("bla.7z"),
SevenZFileOptions.builder().withUseDefaultNameForUnnamedEntries(true).build()))
{
- SevenZArchiveEntry ae = sevenZFile.getNextEntry();
- assertNotNull(ae);
- assertEquals("test1.xml", ae.getName());
- ae = sevenZFile.getNextEntry();
- assertNotNull(ae);
- assertEquals("test2.xml", ae.getName());
- assertNull(sevenZFile.getNextEntry());
- }
try (SevenZFile sevenZFile =
SevenZFile.builder().setFile(getFile("bla.7z")).setUseDefaultNameForUnnamedEntries(true).get())
{
SevenZArchiveEntry ae = sevenZFile.getNextEntry();
assertNotNull(ae);
@@ -512,25 +484,12 @@ void testNoOOMOnCorruptedHeader() throws IOException {
testFiles.add(getPath("COMPRESS-542-endheadercorrupted.7z"));
testFiles.add(getPath("COMPRESS-542-endheadercorrupted2.7z"));
for (final Path file : testFiles) {
- {
- final IOException e = assertThrows(ArchiveException.class, ()
-> {
- try (@SuppressWarnings("deprecation")
- SevenZFile sevenZFile = new
SevenZFile(Files.newByteChannel(file),
-
SevenZFileOptions.builder().withTryToRecoverBrokenArchives(true).build())) {
- // do nothing
- }
- }, "Expected IOException: start header corrupt and unable to
guess end header");
- assertEquals("Start header corrupt and unable to guess end
header", e.getMessage());
- }
- {
- final IOException e = assertThrows(ArchiveException.class, ()
-> {
- try (SevenZFile sevenZFile =
SevenZFile.builder().setSeekableByteChannel(Files.newByteChannel(file)).setTryToRecoverBrokenArchives(true)
- .get()) {
- // do nothing
- }
- }, "Expected IOException: start header corrupt and unable to
guess end header");
- assertEquals("Start header corrupt and unable to guess end
header", e.getMessage());
- }
+ final IOException e = assertThrows(ArchiveException.class, () -> {
+ try (SevenZFile sevenZFile =
SevenZFile.builder().setPath(file).setTryToRecoverBrokenArchives(true).get()) {
+ // do nothing
+ }
+ }, "Expected IOException: start header corrupt and unable to guess
end header");
+ assertEquals("Start header corrupt and unable to guess end
header", e.getMessage());
}
}
@@ -554,8 +513,6 @@ void testNumCyclesPower30() throws IOException {
.setPassword(password)
.setTryToRecoverBrokenArchives(true)
.get().close());
- assertThrows(ArchiveException.class,
- () -> new SevenZFile(new File(fixture), password).close());
// @formatter:on
}
diff --git
a/src/test/java/org/apache/commons/compress/archivers/tar/BigFilesIT.java
b/src/test/java/org/apache/commons/compress/archivers/tar/BigFilesIT.java
index a941dbe0e..eab504cfe 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/BigFilesIT.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/BigFilesIT.java
@@ -94,7 +94,7 @@ void testTarFileReadFileHeadersOfArchiveBiggerThan8GByte()
throws Exception {
GzipCompressorInputStream gzin = new
GzipCompressorInputStream(in)) {
Files.copy(gzin, output, StandardCopyOption.REPLACE_EXISTING);
}
- try (TarFile tarFile = new TarFile(output)) {
+ try (TarFile tarFile = TarFile.builder().setPath(output).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(1, entries.size());
assertNotNull(entries.get(0));
diff --git
a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
index 4d09fddca..2e03a978b 100644
---
a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
@@ -116,7 +116,7 @@ private String getTarBinaryHelp() throws IOException {
void testCompareTarArchiveInputStreamWithTarFile() throws IOException {
final Path file = getPath("oldgnu_sparse.tar");
try (TarArchiveInputStream tarIn =
TarArchiveInputStream.builder().setPath(file).get();
- TarFile tarFile = new TarFile(file)) {
+ TarFile tarFile = TarFile.builder().setPath(file).get()) {
assertNotNull(tarIn.getNextTarEntry());
try (InputStream inputStream =
tarFile.getInputStream(tarFile.getEntries().get(0))) {
assertArrayEquals(IOUtils.toByteArray(tarIn),
IOUtils.toByteArray(inputStream));
@@ -303,7 +303,7 @@ void testPaxGNU() throws Throwable {
void testTarFileExtractExtendedOldGNU() throws IOException,
InterruptedException {
final File file = getFile("oldgnu_extended_sparse.tar");
try (InputStream sparseFileInputStream =
extractTarAndGetInputStream(file, "sparse6");
- TarFile tarFile = new TarFile(file)) {
+ TarFile tarFile = TarFile.builder().setFile(file).get()) {
final TarArchiveEntry ae = tarFile.getEntries().get(0);
try (InputStream tarInput = tarFile.getInputStream(ae)) {
@@ -341,7 +341,7 @@ void testTarFileExtractExtendedOldGNU() throws IOException,
InterruptedException
void testTarFileExtractOldGNU() throws IOException, InterruptedException {
final File file = getFile("oldgnu_sparse.tar");
try (InputStream sparseFileInputStream =
extractTarAndGetInputStream(file, "sparsefile");
- TarFile tarFile = new TarFile(file)) {
+ TarFile tarFile = TarFile.builder().setFile(file).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
try (InputStream tarInput = tarFile.getInputStream(entry)) {
assertArrayEquals(IOUtils.toByteArray(tarInput),
IOUtils.toByteArray(sparseFileInputStream));
@@ -358,7 +358,7 @@ void testTarFileExtractPaxGNU() throws IOException,
InterruptedException {
assumeFalse(getTarBinaryHelp().startsWith("tar (GNU tar) 1.28"), "This
test should be ignored if GNU tar is version 1.28");
final File file = getFile("pax_gnu_sparse.tar");
- try (TarFile paxGnu = new TarFile(file)) {
+ try (TarFile paxGnu = TarFile.builder().setFile(file).get()) {
final List<TarArchiveEntry> entries = paxGnu.getEntries();
TarArchiveEntry entry = entries.get(0);
@@ -386,12 +386,12 @@ void testTarFileExtractPaxGNU() throws IOException,
InterruptedException {
void testTarFileExtractSparseTarsOnWindows() throws IOException {
final File oldGNUSparseTar = getFile("oldgnu_sparse.tar");
final File paxGNUSparseTar = getFile("pax_gnu_sparse.tar");
- try (TarFile paxGnu = new TarFile(paxGNUSparseTar)) {
+ try (TarFile paxGnu =
TarFile.builder().setFile(paxGNUSparseTar).get()) {
final List<TarArchiveEntry> entries = paxGnu.getEntries();
// compare between old GNU and PAX 0.0
TarArchiveEntry paxGnuEntry = entries.get(0);
- try (TarFile oldGnu = new TarFile(oldGNUSparseTar)) {
+ try (TarFile oldGnu =
TarFile.builder().setFile(oldGNUSparseTar).get()) {
final TarArchiveEntry oldGnuEntry = oldGnu.getEntries().get(0);
try (InputStream old = oldGnu.getInputStream(oldGnuEntry);
InputStream pax = paxGnu.getInputStream(paxGnuEntry)) {
@@ -401,7 +401,7 @@ void testTarFileExtractSparseTarsOnWindows() throws
IOException {
// compare between old GNU and PAX 0.1
paxGnuEntry = entries.get(1);
- try (TarFile oldGnu = new TarFile(oldGNUSparseTar)) {
+ try (TarFile oldGnu =
TarFile.builder().setFile(oldGNUSparseTar).get()) {
final TarArchiveEntry oldGnuEntry = oldGnu.getEntries().get(0);
try (InputStream old = oldGnu.getInputStream(oldGnuEntry);
InputStream pax = paxGnu.getInputStream(paxGnuEntry)) {
@@ -411,7 +411,7 @@ void testTarFileExtractSparseTarsOnWindows() throws
IOException {
// compare between old GNU and PAX 1.0
paxGnuEntry = entries.get(2);
- try (TarFile oldGnu = new TarFile(oldGNUSparseTar)) {
+ try (TarFile oldGnu =
TarFile.builder().setFile(oldGNUSparseTar).get()) {
final TarArchiveEntry oldGnuEntry = oldGnu.getEntries().get(0);
try (InputStream old = oldGnu.getInputStream(oldGnuEntry);
InputStream pax = paxGnu.getInputStream(paxGnuEntry)) {
@@ -424,7 +424,7 @@ void testTarFileExtractSparseTarsOnWindows() throws
IOException {
@Test
void testTarFileOldGNU() throws Throwable {
final File file = getFile("oldgnu_sparse.tar");
- try (TarFile tarFile = new TarFile(file)) {
+ try (TarFile tarFile = TarFile.builder().setFile(file).get()) {
final TarArchiveEntry ae = tarFile.getEntries().get(0);
assertEquals("sparsefile", ae.getName());
assertEquals(TarConstants.LF_GNUTYPE_SPARSE, ae.getLinkFlag());
@@ -464,7 +464,7 @@ void testTarFileOldGNU() throws Throwable {
@Test
void testTarFilePaxGNU() throws IOException {
final File file = getFile("pax_gnu_sparse.tar");
- try (TarFile tarFile = new TarFile(file)) {
+ try (TarFile tarFile = TarFile.builder().setFile(file).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertPaxGNUEntry(entries.get(0), "0.0");
assertPaxGNUEntry(entries.get(1), "0.1");
diff --git
a/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
b/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
index 5b8b9a18f..87f6766ba 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
@@ -32,6 +32,7 @@
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
+import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -51,7 +52,7 @@
class TarFileTest extends AbstractTest {
private void datePriorToEpoch(final String archive) throws Exception {
- try (TarFile tarFile = new TarFile(getPath(archive))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI(archive)).get()) {
final TarArchiveEntry entry = tarFile.getEntries().get(0);
assertEquals("foo", entry.getName());
assertEquals(TarConstants.LF_NORMAL, entry.getLinkFlag());
@@ -69,7 +70,7 @@ private void datePriorToEpoch(final String archive) throws
Exception {
@Test
void testArchiveWithTrailer() throws IOException {
try (SeekableByteChannel channel =
Files.newByteChannel(getPath("archive_with_trailer.tar"));
- TarFile tarfile = new TarFile(channel,
TarConstants.DEFAULT_BLKSIZE, TarConstants.DEFAULT_RCDSIZE, null, false)) {
+ TarFile tarfile = TarFile.builder().setChannel(channel).get())
{
final String tarAppendix = "Hello, world!\n";
final ByteBuffer buffer =
ByteBuffer.allocate(tarAppendix.length());
channel.read(buffer);
@@ -81,7 +82,7 @@ void testArchiveWithTrailer() throws IOException {
void testBuilderSeekableByteChannel() throws IOException {
try (SeekableByteChannel channel =
Files.newByteChannel(getPath("archive_with_trailer.tar"));
TarFile tarfile = TarFile.builder()
- .setSeekableByteChannel(channel)
+ .setChannel(channel)
.setBlockSize(TarConstants.DEFAULT_BLKSIZE)
.setRecordSize(TarConstants.DEFAULT_RCDSIZE)
.setLenient(false)
@@ -95,7 +96,7 @@ void testBuilderSeekableByteChannel() throws IOException {
@Test
void testCompress197() throws IOException {
- try (TarFile tarFile = new TarFile(getPath("COMPRESS-197.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-197.tar")).get()) {
// noop
}
}
@@ -122,7 +123,7 @@ void testCompress558() throws IOException {
tos.closeArchiveEntry();
}
final byte[] data = bos.toByteArray();
- try (TarFile tarFile = new TarFile(data)) {
+ try (TarFile tarFile = TarFile.builder().setByteArray(data).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(folderName, entries.get(0).getName());
assertEquals(TarConstants.LF_DIR, entries.get(0).getLinkFlag());
@@ -135,7 +136,7 @@ void testCompress558() throws IOException {
@Test
void testCompress657() throws IOException {
- try (TarFile tarFile = new
TarFile(getPath("COMPRESS-657/orjson-3.7.8.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-657/orjson-3.7.8.tar")).get()) {
for (final TarArchiveEntry entry : tarFile.getEntries()) {
if (entry.isDirectory()) {
// An entry cannot be a directory and a "normal file" at
the same time.
@@ -184,7 +185,7 @@ void testDirectoryWithLongNameEndsWithSlash() throws
IOException {
out.flush();
}
// untar these tars
- try (TarFile tarFile = new TarFile(tarF)) {
+ try (TarFile tarFile = TarFile.builder().setFile(tarF).get()) {
for (final TarArchiveEntry entry : tarFile.getEntries()) {
assertTrue(entry.getName().endsWith("/"), "Entry name: " +
entry.getName());
}
@@ -195,7 +196,7 @@ void testDirectoryWithLongNameEndsWithSlash() throws
IOException {
@Test
void testMultiByteReadConsistentlyReturnsMinusOneAtEof() throws Exception {
final byte[] buf = new byte[2];
- try (TarFile tarFile = new TarFile(getPath("bla.tar"));
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("bla.tar")).get();
InputStream input =
tarFile.getInputStream(tarFile.getEntries().get(0))) {
IOUtils.toByteArray(input);
assertEquals(-1, input.read(buf));
@@ -205,22 +206,22 @@ void testMultiByteReadConsistentlyReturnsMinusOneAtEof()
throws Exception {
@Test
void testParseTarTruncatedInContent() {
- assertThrows(IOException.class, () -> new
TarFile(getPath("COMPRESS-544_truncated_in_content.tar")));
+ assertThrows(IOException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-544_truncated_in_content.tar")).get());
}
@Test
void testParseTarTruncatedInPadding() {
- assertThrows(IOException.class, () -> new
TarFile(getPath("COMPRESS-544_truncated_in_padding.tar")));
+ assertThrows(IOException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-544_truncated_in_padding.tar")).get());
}
@Test
void testParseTarWithNonNumberPaxHeaders() {
- assertThrows(ArchiveException.class, () -> new
TarFile(getPath("COMPRESS-529-fail.tar")));
+ assertThrows(ArchiveException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-529-fail.tar")).get());
}
@Test
void testParseTarWithSpecialPaxHeaders() {
- assertThrows(ArchiveException.class, () -> new
TarFile(getPath("COMPRESS-530-fail.tar")));
+ assertThrows(ArchiveException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-530-fail.tar")).get());
}
@Test
@@ -230,7 +231,7 @@ void testReadsArchiveCompletely_COMPRESS245() {
try (GZIPInputStream gin = new
GZIPInputStream(Files.newInputStream(getPath("COMPRESS-245.tar.gz")))) {
Files.copy(gin, tempTar);
}
- try (TarFile tarFile = new TarFile(tempTar)) {
+ try (TarFile tarFile = TarFile.builder().setPath(tempTar).get()) {
assertEquals(31, tarFile.getEntries().size());
}
} catch (final IOException e) {
@@ -240,7 +241,7 @@ void testReadsArchiveCompletely_COMPRESS245() {
@Test
void testRejectsArchivesWithNegativeSizes() throws Exception {
- assertThrows(ArchiveException.class, () -> new
TarFile(getFile("COMPRESS-569-fail.tar")));
+ assertThrows(ArchiveException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-569-fail.tar")).get());
}
@Test
@@ -256,7 +257,7 @@ void testShouldReadBigGid() throws Exception {
tos.closeArchiveEntry();
}
final byte[] data = bos.toByteArray();
- try (TarFile tarFile = new TarFile(data)) {
+ try (TarFile tarFile = TarFile.builder().setByteArray(data).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(4294967294L, entries.get(0).getLongGroupId());
}
@@ -267,7 +268,7 @@ void testShouldReadBigGid() throws Exception {
*/
@Test
void testShouldReadGNULongNameEntryWithWrongName() throws Exception {
- try (TarFile tarFile = new TarFile(getPath("COMPRESS-324.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-324.tar")).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(
"1234567890123456789012345678901234567890123456789012345678901234567890"
@@ -280,15 +281,15 @@ void testShouldReadGNULongNameEntryWithWrongName() throws
Exception {
@Test
void testShouldThrowAnExceptionOnTruncatedEntries() throws Exception {
createTempDirectory("COMPRESS-279");
- assertThrows(IOException.class, () -> new
TarFile(getPath("COMPRESS-279.tar")));
+ assertThrows(IOException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-279.tar")).get());
}
@Test
void testShouldUseSpecifiedEncodingWhenReadingGNULongNames() throws
Exception {
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
- final String encoding = StandardCharsets.UTF_16.name();
+ final Charset encoding = StandardCharsets.UTF_16;
final String name =
"1234567890123456789012345678901234567890123456789" +
"01234567890123456789012345678901234567890123456789" + "01234567890\u00e4";
- try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos,
encoding)) {
+ try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos,
encoding.name())) {
tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
final TarArchiveEntry t = new TarArchiveEntry(name);
t.setSize(1);
@@ -297,7 +298,7 @@ void
testShouldUseSpecifiedEncodingWhenReadingGNULongNames() throws Exception {
tos.closeArchiveEntry();
}
final byte[] data = bos.toByteArray();
- try (TarFile tarFile = new TarFile(data, encoding)) {
+ try (TarFile tarFile =
TarFile.builder().setByteArray(data).setCharset(encoding).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(1, entries.size());
assertEquals(name, entries.get(0).getName());
@@ -306,7 +307,7 @@ void
testShouldUseSpecifiedEncodingWhenReadingGNULongNames() throws Exception {
@Test
void testSingleByteReadConsistentlyReturnsMinusOneAtEof() throws Exception
{
- try (TarFile tarFile = new TarFile(getPath("bla.tar"));
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("bla.tar")).get();
InputStream input =
tarFile.getInputStream(tarFile.getEntries().get(0))) {
IOUtils.toByteArray(input);
assertEquals(-1, input.read());
@@ -319,7 +320,7 @@ void testSingleByteReadConsistentlyReturnsMinusOneAtEof()
throws Exception {
*/
@Test
void testSkipsDevNumbersWhenEntryIsNoDevice() throws Exception {
- try (TarFile tarFile = new TarFile(getPath("COMPRESS-417.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-417.tar")).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(2, entries.size());
assertEquals("test1.xml", entries.get(0).getName());
@@ -334,7 +335,7 @@ void testSkipsDevNumbersWhenEntryIsNoDevice() throws
Exception {
*/
@Test
void testSurvivesBlankLinesInPaxHeader() throws Exception {
- try (TarFile tarFile = new TarFile(getPath("COMPRESS-355.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-355.tar")).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(1, entries.size());
assertEquals("package/package.json", entries.get(0).getName());
@@ -347,7 +348,7 @@ void testSurvivesBlankLinesInPaxHeader() throws Exception {
*/
@Test
void testSurvivesPaxHeaderWithNameEndingInSlash() throws Exception {
- try (TarFile tarFile = new TarFile(getPath("COMPRESS-356.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("COMPRESS-356.tar")).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(1, entries.size());
assertEquals("package/package.json", entries.get(0).getName());
@@ -357,18 +358,18 @@ void testSurvivesPaxHeaderWithNameEndingInSlash() throws
Exception {
@Test
void testThrowException() {
- assertThrows(ArchiveException.class, () -> new
TarFile(getPath("COMPRESS-553-fail.tar")));
+ assertThrows(ArchiveException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-553-fail.tar")).get());
}
@Test
void testThrowExceptionWithNullEntry() {
// Only on Windows: throws a UnmappableCharacterException
- assertThrows(IOException.class, () -> new
TarFile(getPath("COMPRESS-554-fail.tar")));
+ assertThrows(IOException.class, () ->
TarFile.builder().setURI(getURI("COMPRESS-554-fail.tar")).get());
}
@Test
void testWorkaroundForBrokenTimeHeader() throws IOException {
- try (TarFile tarFile = new
TarFile(getPath("simple-aix-native-tar.tar"))) {
+ try (TarFile tarFile =
TarFile.builder().setURI(getURI("simple-aix-native-tar.tar")).get()) {
final List<TarArchiveEntry> entries = tarFile.getEntries();
assertEquals(3, entries.size());
final TarArchiveEntry entry = entries.get(1);
diff --git
a/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
b/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
index aceae288b..c9dbe374d 100644
---
a/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
@@ -201,8 +201,7 @@ void testRawNameReadFromZipFile() throws IOException {
*/
@Test
void testRead7ZipArchive() throws IOException {
- final File archive = getFile("utf8-7zip-test.zip");
- try (ZipFile zf = new ZipFile(archive, CP437, false)) {
+ try (ZipFile zf =
ZipFile.builder().setURI(getURI("utf8-7zip-test.zip")).setCharset(CP437).setUseUnicodeExtraFields(false).get())
{
assertNotNull(zf.getEntry(ASCII_TXT));
assertNotNull(zf.getEntry(EURO_FOR_DOLLAR_TXT));
assertNotNull(zf.getEntry(OIL_BARREL_TXT));
diff --git
a/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileIgnoringLocalFileHeaderTest.java
b/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileIgnoringLocalFileHeaderTest.java
index 397a09723..3406dc780 100644
---
a/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileIgnoringLocalFileHeaderTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileIgnoringLocalFileHeaderTest.java
@@ -25,7 +25,6 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Enumeration;
@@ -38,18 +37,12 @@ class ZipFileIgnoringLocalFileHeaderTest {
private static ZipFile openZipWithoutLocalFileHeader(final String
fileName) throws IOException {
// @formatter:off
return ZipFile.builder()
- .setFile(AbstractTest.getFile(fileName))
- .setCharset(StandardCharsets.UTF_8.name())
- .setUseUnicodeExtraFields(true)
+ .setURI(AbstractTest.getURI(fileName))
.setIgnoreLocalFileHeader(true)
.get();
// @formatter:on
}
- private static ZipFile openZipWithoutLocalFileHeaderDeprecated(final
String fileName) throws IOException {
- return new ZipFile(AbstractTest.getFile(fileName),
StandardCharsets.UTF_8.name(), true, true);
- }
-
@TempDir
private File dir;
@@ -104,7 +97,7 @@ void testPhysicalOrder() throws IOException {
*/
@Test
void testZipUnarchive() throws Exception {
- try (ZipFile zipFile =
openZipWithoutLocalFileHeaderDeprecated("bla.zip")) {
+ try (ZipFile zipFile = openZipWithoutLocalFileHeader("bla.zip")) {
zipFile.stream().forEach(entry -> {
try (InputStream inputStream = zipFile.getInputStream(entry)) {
Files.copy(inputStream, new File(dir,
entry.getName()).toPath());
diff --git
a/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileTest.java
b/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileTest.java
index ba97587aa..c417ec823 100644
--- a/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/zip/ZipFileTest.java
@@ -61,6 +61,7 @@
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.channels.ByteArraySeekableByteChannel;
import org.apache.commons.io.function.IORunnable;
import org.apache.commons.lang3.ArrayFill;
import org.apache.commons.lang3.ArrayUtils;
@@ -109,7 +110,7 @@ private static void assertEntryName(final
ArrayList<ZipArchiveEntry> entries, fi
}
private static void nameSource(final String archive, final String entry,
final ZipArchiveEntry.NameSource expected) throws Exception {
- try (ZipFile zf = ZipFile.builder().setFile(getFile(archive)).get()) {
+ try (ZipFile zf = ZipFile.builder().setURI(getURI(archive)).get()) {
final ZipArchiveEntry ze = zf.getEntry(entry);
assertEquals(entry, ze.getName());
assertEquals(expected, ze.getNameSource());
@@ -211,7 +212,7 @@ private void
multiByteReadConsistentlyReturnsMinusOneAtEof(final File file) thro
* The central directory has ZipFile and ZipUtil swapped so central
directory order is different from entry data order.
*/
private void readOrderTest() throws Exception {
- zf = ZipFile.builder().setFile(getFile("ordertest.zip")).get();
+ zf = ZipFile.builder().setURI(getURI("ordertest.zip")).get();
}
/**
@@ -284,14 +285,14 @@ void testCDOrder() throws Exception {
@Test
void testCDOrderInMemory() throws Exception {
final byte[] data = readAllBytes("ordertest.zip");
- zf =
ZipFile.builder().setByteArray(data).setCharset(StandardCharsets.UTF_8).get();
+ zf = ZipFile.builder().setByteArray(data).get();
testCDOrderInMemory(zf);
- try (SeekableInMemoryByteChannel channel = new
SeekableInMemoryByteChannel(data)) {
- zf =
ZipFile.builder().setSeekableByteChannel(channel).setCharset(StandardCharsets.UTF_8).get();
+ try (ByteArraySeekableByteChannel channel =
ByteArraySeekableByteChannel.wrap(data)) {
+ zf = ZipFile.builder().setChannel(channel).get();
testCDOrderInMemory(zf);
}
- try (SeekableInMemoryByteChannel channel = new
SeekableInMemoryByteChannel(data)) {
- zf = new ZipFile(channel, StandardCharsets.UTF_8.name());
+ try (ByteArraySeekableByteChannel channel =
ByteArraySeekableByteChannel.wrap(data)) {
+ zf = ZipFile.builder().setChannel(channel).get();
testCDOrderInMemory(zf);
}
}
@@ -326,8 +327,7 @@ private void testCDOrderInMemory(final ZipFile zipFile) {
@Test
void testConcurrentReadFile() throws Exception {
// mixed.zip contains both inflated and stored files
- final File archive = getFile("mixed.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("mixed.zip")).get();
final Map<String, byte[]> content = new HashMap<>();
zf.stream().forEach(entry -> {
try (InputStream inputStream = zf.getInputStream(entry)) {
@@ -356,7 +356,7 @@ void testConcurrentReadSeekable() throws Exception {
data = IOUtils.toByteArray(fis);
}
try (SeekableInMemoryByteChannel channel = new
SeekableInMemoryByteChannel(data)) {
- zf =
ZipFile.builder().setSeekableByteChannel(channel).setCharset(StandardCharsets.UTF_8).get();
+ zf =
ZipFile.builder().setChannel(channel).setCharset(StandardCharsets.UTF_8).get();
final Map<String, byte[]> content = new HashMap<>();
zf.stream().forEach(entry -> {
try (InputStream inputStream = zf.getInputStream(entry)) {
@@ -439,8 +439,7 @@ void testDoubleClose() throws Exception {
*/
@Test
void testDuplicateEntry() throws Exception {
- final File archive = getFile("COMPRESS-227.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("COMPRESS-227.zip")).get();
final ZipArchiveEntry ze = zf.getEntry("test1.txt");
assertNotNull(ze);
@@ -566,8 +565,7 @@ void testEntryAlignmentExceed() throws Exception {
*/
@Test
void testExcessDataInZip64ExtraField() throws Exception {
- final File archive = getFile("COMPRESS-228.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("COMPRESS-228.zip")).get();
// actually, if we get here, the test already has passed
final ZipArchiveEntry ze =
zf.getEntry("src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java");
@@ -578,7 +576,7 @@ void testExcessDataInZip64ExtraField() throws Exception {
void testExtractFileLiesAcrossSplitZipSegmentsCreatedByWinrar() throws
Exception {
final File lastFile =
getFile("COMPRESS-477/split_zip_created_by_winrar/split_zip_created_by_winrar.zip");
try (SeekableByteChannel channel =
ZipSplitReadOnlySeekableByteChannel.buildFromLastSplitSegment(lastFile)) {
- zf = ZipFile.builder().setSeekableByteChannel(channel).get();
+ zf = ZipFile.builder().setChannel(channel).get();
// the compressed content of ZipArchiveInputStream.java lies
between .z01 and .z02
final ZipArchiveEntry zipEntry =
zf.getEntry("commons-compress/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java");
@@ -591,7 +589,7 @@ void
testExtractFileLiesAcrossSplitZipSegmentsCreatedByWinrar() throws Exception
void testExtractFileLiesAcrossSplitZipSegmentsCreatedByZip() throws
Exception {
final File lastFile =
getFile("COMPRESS-477/split_zip_created_by_zip/split_zip_created_by_zip.zip");
try (SeekableByteChannel channel =
ZipSplitReadOnlySeekableByteChannel.buildFromLastSplitSegment(lastFile)) {
- zf = new ZipFile(channel);
+ zf = ZipFile.builder().setChannel(channel).get();
// the compressed content of
UnsupportedCompressionAlgorithmException.java lies between .z01 and .z02
ZipArchiveEntry zipEntry = zf
@@ -610,7 +608,7 @@ void
testExtractFileLiesAcrossSplitZipSegmentsCreatedByZip() throws Exception {
void testExtractFileLiesAcrossSplitZipSegmentsCreatedByZipOfZip64() throws
Exception {
final File lastFile =
getFile("COMPRESS-477/split_zip_created_by_zip/split_zip_created_by_zip_zip64.zip");
try (SeekableByteChannel channel =
ZipSplitReadOnlySeekableByteChannel.buildFromLastSplitSegment(lastFile)) {
- zf = new ZipFile(channel);
+ zf = ZipFile.builder().setChannel(channel).get();
// the compressed content of
UnsupportedCompressionAlgorithmException.java lies between .z01 and .z02
ZipArchiveEntry zipEntry = zf
@@ -628,8 +626,7 @@ void
testExtractFileLiesAcrossSplitZipSegmentsCreatedByZipOfZip64() throws Excep
@Test
void testGetEntries() throws Exception {
// mixed.zip contains both inflated and stored files
- final File archive = getFile("mixed.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("mixed.zip")).get();
final Map<String, byte[]> content = new HashMap<>();
for (final ZipArchiveEntry entry : Collections.list(zf.getEntries())) {
try (InputStream inputStream = zf.getInputStream(entry)) {
@@ -644,8 +641,7 @@ void testGetEntries() throws Exception {
@Test
void testGetEntriesInPhysicalOrder() throws Exception {
// mixed.zip contains both inflated and stored files
- final File archive = getFile("mixed.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("mixed.zip")).get();
final Map<String, byte[]> content = new HashMap<>();
for (final ZipArchiveEntry entry :
Collections.list(zf.getEntriesInPhysicalOrder())) {
try (InputStream inputStream = zf.getInputStream(entry)) {
@@ -716,8 +712,7 @@ void testNameSourceIsSetToUnicodeExtraField() throws
Exception {
@Test
void testOffsets() throws Exception {
// mixed.zip contains both inflated and stored files
- final File archive = getFile("mixed.zip");
- try (ZipFile zf = new ZipFile(archive)) {
+ try (ZipFile zf = ZipFile.builder().setURI(getURI("mixed.zip")).get())
{
final ZipArchiveEntry inflatedEntry = zf.getEntry("inflated.txt");
assertEquals(0x0000, inflatedEntry.getLocalHeaderOffset());
assertEquals(0x0046, inflatedEntry.getDataOffset());
@@ -775,10 +770,8 @@ void testPhysicalOrderOfSpecificFile() throws Exception {
*/
@Test
void testReadDeflate64CompressedStream() throws Exception {
- final File input = getFile("COMPRESS-380/COMPRESS-380-input");
- final File archive = getFile("COMPRESS-380/COMPRESS-380.zip");
- try (InputStream in = Files.newInputStream(input.toPath());
- ZipFile zf = new ZipFile(archive)) {
+ try (InputStream in =
Files.newInputStream(getPath("COMPRESS-380/COMPRESS-380-input"));
+ ZipFile zf =
ZipFile.builder().setURI(getURI("COMPRESS-380/COMPRESS-380.zip")).get()) {
final byte[] orig = IOUtils.toByteArray(in);
final ZipArchiveEntry e = zf.getEntry("input2");
try (InputStream s = zf.getInputStream(e)) {
@@ -796,7 +789,7 @@ void testReadingOfExtraDataBeforeZip() throws IOException {
final byte[] fileHeader = "Before Zip file".getBytes(UTF_8);
final String entryName = "COMPRESS-621.txt";
final byte[] entryContent =
"https://issues.apache.org/jira/browse/COMPRESS-621".getBytes(UTF_8);
- try (ZipFile archive = new ZipFile(getFile("COMPRESS-621.zip"))) {
+ try (ZipFile archive =
ZipFile.builder().setURI(getURI("COMPRESS-621.zip")).get()) {
assertEquals(fileHeader.length,
archive.getFirstLocalFileHeaderOffset());
try (InputStream input =
archive.getContentBeforeFirstLocalFileHeader()) {
assertArrayEquals(fileHeader, IOUtils.toByteArray(input));
@@ -815,8 +808,7 @@ void testReadingOfExtraDataBeforeZip() throws IOException {
*/
@Test
void testReadingOfFirstStoredEntry() throws Exception {
- final File archive = getFile("COMPRESS-264.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("COMPRESS-264.zip")).get();
final ZipArchiveEntry ze = zf.getEntry("test.txt");
assertEquals(5, ze.getSize());
try (InputStream inputStream = zf.getInputStream(ze)) {
@@ -839,7 +831,7 @@ void testReadingOfStoredEntry() throws Exception {
zo.closeArchiveEntry();
}
- zf = new ZipFile(file);
+ zf = ZipFile.builder().setFile(file).get();
ze = zf.getEntry("foo");
assertNotNull(ze);
try (InputStream i = zf.getInputStream(ze)) {
@@ -965,8 +957,7 @@ void
testSingleByteReadConsistentlyReturnsMinusOneAtEofUsingUnshrink() throws Ex
*/
@Test
void testSkipsPK00Prefix() throws Exception {
- final File archive = getFile("COMPRESS-208.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("COMPRESS-208.zip")).get();
assertNotNull(zf.getEntry("test1.xml"));
assertNotNull(zf.getEntry("test2.xml"));
}
@@ -998,8 +989,7 @@ void testUnixSymlinkSampleFile() throws Exception {
expectedVals.put(entryPrefix + "link6",
"../COMPRESS-214_unix_symlinks/././a/b/");
// I looked into creating a test with hard links, but ZIP does not
appear to
// support hard links, so nevermind.
- final File archive = getFile("COMPRESS-214_unix_symlinks.zip");
- zf = new ZipFile(archive);
+ zf =
ZipFile.builder().setURI(getURI("COMPRESS-214_unix_symlinks.zip")).get();
zf.stream().forEach(zae -> {
final String link = zf.getUnixSymlink(zae);
if (zae.isUnixSymlink()) {
@@ -1015,7 +1005,7 @@ void testUnixSymlinkSampleFile() throws Exception {
@Test
void testUnshrinking() throws Exception {
- zf = new ZipFile(getFile("SHRUNK.ZIP"));
+ zf = ZipFile.builder().setURI(getURI("SHRUNK.ZIP")).get();
ZipArchiveEntry test = zf.getEntry("TEST1.XML");
try (InputStream original = newInputStream("test1.xml");
InputStream inputStream = zf.getInputStream(test)) {
@@ -1030,8 +1020,7 @@ void testUnshrinking() throws Exception {
@Test
void testUnzipBZip2CompressedEntry() throws Exception {
- final File archive = getFile("bzip2-zip.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("bzip2-zip.zip")).get();
final ZipArchiveEntry ze = zf.getEntry("lots-of-as");
assertEquals(42, ze.getSize());
final byte[] expected = ArrayFill.fill(new byte[42], (byte) 'a');
@@ -1045,8 +1034,7 @@ void testUnzipBZip2CompressedEntry() throws Exception {
*/
@Test
void testWinzipBackSlashWorkaround() throws Exception {
- final File archive = getFile("test-winzip.zip");
- zf = new ZipFile(archive);
+ zf = ZipFile.builder().setURI(getURI("test-winzip.zip")).get();
assertNull(zf.getEntry("\u00e4\\\u00fc.txt"));
assertNotNull(zf.getEntry("\u00e4/\u00fc.txt"));
}
diff --git
a/src/test/java/org/apache/commons/compress/archivers/zip/ZipMemoryFileSystemTest.java
b/src/test/java/org/apache/commons/compress/archivers/zip/ZipMemoryFileSystemTest.java
index 60c6fadbd..e44e01888 100644
---
a/src/test/java/org/apache/commons/compress/archivers/zip/ZipMemoryFileSystemTest.java
+++
b/src/test/java/org/apache/commons/compress/archivers/zip/ZipMemoryFileSystemTest.java
@@ -32,7 +32,6 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.SeekableByteChannel;
-import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -230,8 +229,7 @@ void testScatterFileWithCompressionAndTargetInMemory()
throws IOException {
}
}
- try (ZipFile zf = new ZipFile(Files.newByteChannel(target,
StandardOpenOption.READ), target.getFileName().toString(),
StandardCharsets.UTF_8.name(),
- true)) {
+ try (ZipFile zf = ZipFile.builder().setPath(target).get()) {
final ZipArchiveEntry b_entry =
zf.getEntries("b.txt").iterator().next();
assertEquals(8, b_entry.getSize());
try (InputStream inputStream = zf.getInputStream(b_entry)) {
@@ -245,8 +243,7 @@ void testScatterFileWithCompressionAndTargetInMemory()
throws IOException {
}
}
- try (ZipFile zf = new ZipFile(Files.newByteChannel(target,
StandardOpenOption.READ), target.getFileName().toString(),
StandardCharsets.UTF_8.name(),
- true, false)) {
+ try (ZipFile zf = ZipFile.builder().setPath(target).get()) {
final ZipArchiveEntry b_entry =
zf.getEntries("b.txt").iterator().next();
assertEquals(8, b_entry.getSize());
try (InputStream inputStream = zf.getInputStream(b_entry)) {
@@ -328,7 +325,7 @@ void testZipFileInMemory() throws IOException {
}
}
- try (ZipFile zf = new ZipFile(target)) {
+ try (ZipFile zf = ZipFile.builder().setPath(target).get()) {
final ZipArchiveEntry b_entry =
zf.getEntries("b.txt").iterator().next();
assertEquals(8, b_entry.getSize());
try (InputStream inputStream = zf.getInputStream(b_entry)) {