Skip to content

Commit

Permalink
Remove alt
Browse files Browse the repository at this point in the history
  • Loading branch information
oleg-cherednik committed Feb 16, 2025
1 parent f5ae35c commit 3c901fc
Show file tree
Hide file tree
Showing 13 changed files with 62 additions and 170 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -58,25 +58,18 @@ protected void extractAllEntries(Path dstDir) {
List<CompletableFuture<Void>> tasks = new LinkedList<>();
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();

ConsecutiveAccessDataInputHolder dataInputHolder =
new ConsecutiveAccessDataInputHolder(this::createConsecutiveDataInput);
ExecutorService executor = createExecutor();

try {
while (it.hasNext()) {
ZipEntry zipEntry = it.next();
Path file = dstDir.resolve(zipEntry.getFileName());

CompletableFuture<Void> task = createCompletableFuture(
() -> extractEntry(file, zipEntry, dataInputHolder.get()), executor);

tasks.add(task);
tasks.add(createCompletableFuture(() -> extractEntry(file, zipEntry), executor));
}

tasks.forEach(CompletableFuture::join);
} finally {
executor.shutdown();
dataInputHolder.release();
}
}

Expand All @@ -87,8 +80,6 @@ protected void extractEntryByPrefix(Path dstDir, Set<String> prefixes) {
List<CompletableFuture<Void>> tasks = new LinkedList<>();
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();

ConsecutiveAccessDataInputHolder dataInputHolder =
new ConsecutiveAccessDataInputHolder(this::createConsecutiveDataInput);
ExecutorService executor = createExecutor();

try {
Expand All @@ -98,16 +89,12 @@ protected void extractEntryByPrefix(Path dstDir, Set<String> prefixes) {

if (fileName != null) {
Path file = dstDir.resolve(fileName);
CompletableFuture<Void> task = createCompletableFuture(
() -> extractEntry(file, zipEntry, dataInputHolder.get()), executor);

tasks.add(task);
tasks.add(createCompletableFuture(() -> extractEntry(file, zipEntry), executor));
}
}

tasks.forEach(CompletableFuture::join);
} finally {
dataInputHolder.release();
executor.shutdown();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import ru.olegcherednik.zip4jvm.ZipFile;
import ru.olegcherednik.zip4jvm.engine.zip.ZipSymlinkEngine;
import ru.olegcherednik.zip4jvm.exception.Zip4jvmException;
import ru.olegcherednik.zip4jvm.io.in.DataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.ConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.SolidConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.SplitConsecutiveAccessDataInput;
Expand Down Expand Up @@ -82,36 +81,28 @@ public ZipFile.Entry extract(String fileName) {
}

protected void extractAllEntries(Path dstDir) {
try (ConsecutiveAccessDataInput in = createConsecutiveDataInput()) {
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();

while (it.hasNext()) {
ZipEntry zipEntry = it.next();
Path file = dstDir.resolve(zipEntry.getFileName());
extractEntry(file, zipEntry, in);
}
} catch (IOException e) {
throw new Zip4jvmException(e);
while (it.hasNext()) {
ZipEntry zipEntry = it.next();
Path file = dstDir.resolve(zipEntry.getFileName());
extractEntry(file, zipEntry);
}
}

protected void extractEntryByPrefix(Path dstDir, Set<String> prefixes) {
assert CollectionUtils.isNotEmpty(prefixes);

try (ConsecutiveAccessDataInput in = createConsecutiveDataInput()) {
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();

while (it.hasNext()) {
ZipEntry zipEntry = it.next();
String fileName = getFileName(zipEntry, prefixes);
while (it.hasNext()) {
ZipEntry zipEntry = it.next();
String fileName = getFileName(zipEntry, prefixes);

if (fileName != null) {
Path file = dstDir.resolve(fileName);
extractEntry(file, zipEntry, in);
}
if (fileName != null) {
Path file = dstDir.resolve(fileName);
extractEntry(file, zipEntry);
}
} catch (IOException e) {
throw new Zip4jvmException(e);
}
}

Expand All @@ -135,23 +126,23 @@ protected String getFileName(ZipEntry zipEntry, Set<String> prefixes) {
return null;
}

protected void extractEntry(Path file, ZipEntry zipEntry, ConsecutiveAccessDataInput in) throws IOException {
in.seekForward(zipEntry.getLocalFileHeaderAbsOffs());

if (zipEntry.isSymlink())
extractSymlink(file, zipEntry, in);
else if (zipEntry.isDirectory())
extractEmptyDirectory(file);
else
extractRegularFile(file, zipEntry, in);

// TODO attributes for directory should be set at the end (under Posix, it could have less privileges)
setFileAttributes(file, zipEntry);
setFileLastModifiedTime(file, zipEntry);
protected void extractEntry(Path file, ZipEntry zipEntry) {
Quietly.doRuntime(() -> {
if (zipEntry.isSymlink())
extractSymlink(file, zipEntry);
else if (zipEntry.isDirectory())
extractEmptyDirectory(file);
else
extractRegularFile(file, zipEntry);

// TODO attributes for directory should be set at the end (under Posix, it could have less privileges)
setFileAttributes(file, zipEntry);
setFileLastModifiedTime(file, zipEntry);
});
}

protected void extractSymlink(Path symlink, ZipEntry zipEntry, DataInput in) throws IOException {
String target = IOUtils.toString(zipEntry.createInputStream(in), Charsets.UTF_8);
protected void extractSymlink(Path symlink, ZipEntry zipEntry) throws IOException {
String target = IOUtils.toString(zipEntry.createInputStream(), Charsets.UTF_8);

if (target.charAt(0) == SLASH)
ZipSymlinkEngine.createAbsoluteSymlink(symlink, Paths.get(target));
Expand All @@ -166,15 +157,17 @@ protected void extractEmptyDirectory(Path dir) throws IOException {
Files.createDirectories(dir);
}

protected void extractRegularFile(Path file, ZipEntry zipEntry, DataInput in) throws IOException {
protected void extractRegularFile(Path file, ZipEntry zipEntry) throws IOException {
String fileName = ZipUtils.getFileNameNoDirectoryMarker(zipEntry.getFileName());
zipEntry.setPassword(passwordProvider.getFilePassword(fileName));
ZipUtils.copyLarge(zipEntry.createInputStream(in), getOutputStream(file));
ZipUtils.copyLarge(zipEntry.createInputStream(), getOutputStream(file));
}

public ConsecutiveAccessDataInput createConsecutiveDataInput() {
SrcZip srcZip = zipModel.getSrcZip();
public ConsecutiveAccessDataInput createConsecutiveAccessDataInput() {
return createConsecutiveAccessDataInput(zipModel.getSrcZip());
}

public static ConsecutiveAccessDataInput createConsecutiveAccessDataInput(SrcZip srcZip) {
return Quietly.doRuntime(() -> srcZip.isSolid() ? new SolidConsecutiveAccessDataInput(srcZip)
: new SplitConsecutiveAccessDataInput(srcZip));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public void write(DataOutput out) throws IOException {
Path tempFile = tempDir.resolve(zipEntry.getFileName());
Files.deleteIfExists(tempFile);

zipEntry.setChecksum(ChecksumUtils.crc32(zipEntry.createInputStream(null)));
zipEntry.setChecksum(ChecksumUtils.crc32(zipEntry.createInputStream()));

try (SolidDataOutput tmpOut = new SolidDataOutput(out.getByteOrder(), tempFile)) {
writePayload(tmpOut);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ protected final void writePayload(DataOutput out) throws IOException {
out = SizeCalcDataOutput.uncompressedSize(zipEntry, out);
out = ChecksumCalcDataOutput.checksum(zipEntry, out);

ZipUtils.copyLarge(zipEntry.createInputStream(null), out);
ZipUtils.copyLarge(zipEntry.createInputStream(), out);
}

// ---------- Writer ----------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ private ZipEntry createSymlinkEntry() {
String symlinkName = ZipUtils.getFileName(entry);
int lastModifiedTime = DosTimestampConverterUtils.javaToDosTime(entry.getLastModifiedTime());
ExternalFileAttributes externalFileAttributes = entry.getExternalFileAttributes();
ZipEntryInputStreamFunction inputStreamSup = (zipEntry, in) -> entry.getInputStream();
ZipEntryInputStreamFunction inputStreamFunc = zipEntry -> entry.getInputStream();

ZipEntry zipEntry = new RegularFileZipEntry(symlinkName,
lastModifiedTime,
Expand All @@ -52,7 +52,7 @@ private ZipEntry createSymlinkEntry() {
CompressionMethod.STORE,
CompressionLevel.NORMAL,
EncryptionMethod.OFF,
inputStreamSup);
inputStreamFunc);

zipEntry.setDataDescriptorAvailable(true);
zipEntry.setComment(entrySettings.getComment());
Expand All @@ -79,7 +79,7 @@ private ZipEntry createRegularFileEntry() {
: entrySettings.getCompression().getMethod();
CompressionLevel compressionLevel = entrySettings.getCompressionLevel();
EncryptionMethod encryptionMethod = entrySettings.getEncryption().getMethod();
ZipEntryInputStreamFunction inputStreamFunction = (zipEntry, in) -> entry.getInputStream();
ZipEntryInputStreamFunction inputStreamFunc = zipEntry -> entry.getInputStream();
boolean dataDescriptorAvailable =
entrySettings.getDataDescriptor().isIncludeDataDescriptor(compressionMethod, encryptionMethod);
AesVersion aesVersion = entrySettings.getAesVersion().getVersion();
Expand All @@ -91,7 +91,7 @@ private ZipEntry createRegularFileEntry() {
compressionMethod,
compressionLevel,
encryptionMethod,
inputStreamFunction);
inputStreamFunc);

zipEntry.setDataDescriptorAvailable(dataDescriptorAvailable);
zipEntry.setZip64(entrySettings.isZip64());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package ru.olegcherednik.zip4jvm.model.entry;

import ru.olegcherednik.zip4jvm.engine.unzip.UnzipEngine;
import ru.olegcherednik.zip4jvm.engine.unzip.UnzipExtractEngine;
import ru.olegcherednik.zip4jvm.io.in.DataInput;
import ru.olegcherednik.zip4jvm.io.in.ReadBufferInputStream;
import ru.olegcherednik.zip4jvm.io.in.decorators.ChecksumCheckDataInput;
import ru.olegcherednik.zip4jvm.io.in.decorators.DataDescriptorDataInput;
import ru.olegcherednik.zip4jvm.io.in.decorators.LimitSizeDataInput;
import ru.olegcherednik.zip4jvm.io.in.decorators.SizeCheckDataInput;
import ru.olegcherednik.zip4jvm.io.in.decorators.UncloseableDataInput;
import ru.olegcherednik.zip4jvm.io.in.encrypted.EncryptedDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.random.RandomAccessDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.ConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.io.readers.LocalFileHeaderReader;
import ru.olegcherednik.zip4jvm.model.AesVersion;
import ru.olegcherednik.zip4jvm.model.AesVersionEnum;
Expand Down Expand Up @@ -46,7 +45,6 @@ class FileHeaderBasedZipEntryBuilder {
private final CentralDirectory.FileHeader fileHeader;
private final SrcZip srcZip;
private final Function<Charset, Charset> charsetCustomizer;
private final boolean alt;

public ZipEntry build() {
boolean regularFile = ZipUtils.isRegularFile(fileHeader.getFileName());
Expand Down Expand Up @@ -75,8 +73,7 @@ private ZipEntry createRegularFileEntry() {
EncryptionMethod encryptionMethod = fileHeader.getEncryptionMethod();
ExternalFileAttributes externalFileAttributes = fileHeader.getExternalFileAttributes();

ZipEntryInputStreamFunction inputStreamFunction = alt ? this::createInputStream
: (zipEntry, in) -> createInputStream(zipEntry);
ZipEntryInputStreamFunction inputStreamFunction = this::createInputStream;

RegularFileZipEntry zipEntry = new RegularFileZipEntry(fileName,
lastModifiedTime,
Expand Down Expand Up @@ -104,29 +101,8 @@ private ZipEntry createEmptyDirectoryEntry() {
return new EmptyDirectoryZipEntry(dirName, lastModifiedTime, externalFileAttributes);
}

@SuppressWarnings({ "resource", "PMD.CloseResource" })
private InputStream createInputStream(ZipEntry zipEntry) throws IOException {
RandomAccessDataInput in1 = UnzipEngine.createRandomAccessDataInput(srcZip);
in1.seek(zipEntry.getLocalFileHeaderAbsOffs());

DataInput in2 = in1;

LocalFileHeader localFileHeader = new LocalFileHeaderReader(charsetCustomizer).read(in2);
zipEntry.setDataDescriptorAvailable(localFileHeader.isDataDescriptorAvailable());
// TODO check that localFileHeader matches fileHeader

in2 = DataDescriptorDataInput.create(zipEntry, in2);
in2 = LimitSizeDataInput.create(zipEntry.getCompressedSize(), in2);
in2 = EncryptedDataInput.create(zipEntry.createDecoder(in2), in2);
in2 = Compression.of(zipEntry.getCompressionMethod()).addCompressionDecorator(zipEntry, in2);
in2 = SizeCheckDataInput.uncompressedSize(zipEntry, in2);
in2 = ChecksumCheckDataInput.checksum(zipEntry, in2);

return ReadBufferInputStream.create(in2);
}

private InputStream createInputStream(ZipEntry zipEntry, DataInput in) throws IOException {
in = new UncloseableDataInput(in);
DataInput in = createDataInput(zipEntry);

LocalFileHeader localFileHeader = new LocalFileHeaderReader(charsetCustomizer).read(in);
zipEntry.setDataDescriptorAvailable(localFileHeader.isDataDescriptorAvailable());
Expand All @@ -142,6 +118,12 @@ private InputStream createInputStream(ZipEntry zipEntry, DataInput in) throws IO
return ReadBufferInputStream.create(in);
}

private DataInput createDataInput(ZipEntry zipEntry) throws IOException {
ConsecutiveAccessDataInput in = UnzipExtractEngine.createConsecutiveAccessDataInput(srcZip);
in.seekForward(zipEntry.getLocalFileHeaderAbsOffs());
return in;
}

private int getDiskNo() {
if (fileHeader.getDiskNo() == MAX_TOTAL_DISKS)
return (int) fileHeader.getExtraField().getExtendedInfo().getDiskNo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,15 @@ final class RegularFileZipEntry extends ZipEntry {
CompressionMethod compressionMethod,
CompressionLevel compressionLevel,
EncryptionMethod encryptionMethod,
ZipEntryInputStreamFunction inputStreamFunction) {
ZipEntryInputStreamFunction inputStreamFunc) {
super(ZipUtils.getFileName(fileName, false),
lastModifiedTime,
externalFileAttributes,
aesVersion,
compressionMethod,
compressionLevel,
encryptionMethod,
inputStreamFunction);
inputStreamFunc);
}

@Override
Expand Down
Loading

0 comments on commit 3c901fc

Please sign in to comment.