Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#107 Extract entries by prefix exclude prefix path #109

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.OutputStream;
Expand Down Expand Up @@ -66,8 +67,11 @@ public class UnzipExtractEngine {
protected final ZipModel zipModel;

public void extract(Path dstDir, Collection<String> fileNames) throws IOException {
Map<String, String> map = CollectionUtils.isEmpty(fileNames) ? null
: getEntriesByPrefix(new HashSet<>(fileNames));
Map<String, String> map = null;

if (CollectionUtils.isNotEmpty(fileNames))
map = getEntriesByPrefix(new HashSet<>(fileNames));

extractEntry(dstDir, map);
}

Expand All @@ -86,10 +90,10 @@ protected Map<String, String> getEntriesByPrefix(Set<String> fileNames) {
if (zipModel.hasEntry(entryName)) {
ZipEntry zipEntry = zipModel.getZipEntryByFileName(entryName);
map.put(entryName, FilenameUtils.getName(zipEntry.getFileName()));
} else {
for (ZipEntry zipEntry : getEntriesByPrefix(entryName + '/'))
map.put(zipEntry.getFileName(), zipEntry.getFileName());
}

for (ZipEntry zipEntry : getEntriesByPrefix(entryName + '/'))
map.put(zipEntry.getFileName(), StringUtils.substring(zipEntry.getFileName(), fileName.length() + 1));
}

return map.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(map);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import ru.olegcherednik.zip4jvm.io.in.file.random.RandomAccessDataInput;
import ru.olegcherednik.zip4jvm.model.ZipModel;
import ru.olegcherednik.zip4jvm.model.src.SrcZip;
import ru.olegcherednik.zip4jvm.utils.PathUtils;
import ru.olegcherednik.zip4jvm.utils.function.LocalSupplier;

import lombok.Getter;
Expand Down
31 changes: 5 additions & 26 deletions src/test/java/ru/olegcherednik/zip4jvm/UnzipItSolidTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileBentleyAssert;
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileFerrariAssert;
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileSaintPetersburgAssert;
import static ru.olegcherednik.zip4jvm.TestDataAssert.rootAssert;
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatDirectory;
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatFile;

Expand Down Expand Up @@ -86,9 +87,7 @@ public void shouldUnzipOneFileIgnorePath() throws IOException {
public void shouldUnzipFolder() throws IOException {
Path dstDir = Zip4jvmSuite.subDirNameAsMethodNameWithTime(rootDir);
UnzipIt.zip(zipDeflateSolid).dstDir(dstDir).extract(dirNameBikes);

assertThatDirectory(dstDir).exists().hasEntries(1).hasDirectories(1);
assertThatDirectory(dstDir.resolve(dirNameBikes)).matches(dirBikesAssert);
assertThatDirectory(dstDir).matches(dirBikesAssert);
}

public void shouldExtractZipArchiveWhenEntryNameWithCustomCharset() throws IOException {
Expand All @@ -98,7 +97,6 @@ public void shouldExtractZipArchiveWhenEntryNameWithCustomCharset() throws IOExc
UnzipSettings settings = UnzipSettings.builder().charset(Charset.forName("GBK")).build();

UnzipIt.zip(zip).dstDir(dstDir).settings(settings).extract();

assertThatDirectory(dstDir).hasEntries(2).hasRegularFiles(2);
}

Expand All @@ -108,9 +106,9 @@ public void shouldExtractZipArchiveWhenZipWasCreatedUnderMac() throws IOExceptio

UnzipIt.zip(zip).dstDir(dstDir).extract();

// TODO commented tests
// assertThatDirectory(dstDir).hasDirectories(0).hasFiles(2);
// assertThatDirectory(dstDir).file("fff - 副本.txt").exists();
assertThatDirectory(dstDir).hasDirectories(2).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve("__MACOSX")).exists();
assertThatDirectory(dstDir.resolve("data")).matches(rootAssert);
}

public void shouldExtractZipArchiveWhenUtf8Charset() throws IOException {
Expand All @@ -128,23 +126,4 @@ public void shouldExtractZipArchiveWhenUtf8Charset() throws IOException {
assertThatDirectory(dstDir).directory("test/测试文件夹3").exists();
}

@Test(enabled = false)
public void foo() throws IOException {
/*
The issue was that for some unknown reason there's a spanned archive
marker (0x08074b50, little endian) at the start of these ZIP files,
right before the first local file header (0x04034b50), which results
in iterating over the file using ZipInputStream.getNextEntry() failing
as the first call immediately returns null.
*/
// Path dstDir = Zip4jvmSuite.subDirNameAsMethodNameWithTime(rootDir);
// Path zip = Zip4jvmSuite.getResourcePath("/zip/spanned.zip");

// TODO we could have a problem when read a zip like a stream (not reading CentralDirectory)
// see https://github.com/srikanth-lingala/zip4j/issues/563
// Stream<ZipFile.Entry> stream = UnzipIt.zip(zip).open().stream();

// ZipInfo.zip(zip).decompose(dstDir);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -229,4 +229,9 @@ public DirectoryAssert isEmpty() {
return myself;
}

@Override
public String toString() {
return actual.toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ public void shouldUnzipWhenWhenDeflateCompressionAndPkwareEncryption() throws IO
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);

UnzipIt.zip(zipDeflateSolidPkware).dstDir(dstDir).password(password).extract(dirNameCars);
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldUnzipWhenWhenDeflateCompressionAndAesEncryption() throws IOException {
Expand All @@ -144,8 +143,7 @@ public void shouldUnzipWhenWhenDeflateCompressionAndAesEncryption() throws IOExc
.build();

UnzipIt.zip(zipDeflateSolidAes).dstDir(dstDir).settings(settings).extract(dirNameCars);
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldUseCompressStoreWhenFileEmpty() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,7 @@ public void shouldUnzipWhenWhenStoreCompressionAndPkwareEncryption() throws IOEx
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);

UnzipIt.zip(zipStoreSolidPkware).dstDir(dstDir).password(password).extract(dirNameCars);
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldUnzipWhenWhenStoreCompressionAndAesEncryption() throws IOException {
Expand All @@ -133,8 +132,7 @@ public void shouldUnzipWhenWhenStoreCompressionAndAesEncryption() throws IOExcep
UnzipSettings settings = UnzipSettings.builder().passwordProvider(fileNamePasswordProvider).build();

UnzipIt.zip(zipStoreSolidAes).dstDir(dstDir).settings(settings).extract(dirNameCars);
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

}
21 changes: 12 additions & 9 deletions src/test/java/ru/olegcherednik/zip4jvm/engine/UnzipEngineTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import static ru.olegcherednik.zip4jvm.TestData.dirNameCars;
import static ru.olegcherednik.zip4jvm.TestData.zipDeflateSolid;
import static ru.olegcherednik.zip4jvm.TestDataAssert.dirCarsAssert;
import static ru.olegcherednik.zip4jvm.TestDataAssert.rootAssert;
import static ru.olegcherednik.zip4jvm.Zip4jvmSuite.fileNamePasswordProvider;
import static ru.olegcherednik.zip4jvm.Zip4jvmSuite.password;
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatDirectory;
Expand Down Expand Up @@ -70,29 +71,23 @@ public void shouldUnzipZipFileIntoDestinationFolderWhenDeflateSolid() throws IOE
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);

UnzipIt.zip(zipDeflateSolid).dstDir(dstDir).extract(dirNameCars);

assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldUnzipZipFileIntoDestinationFolderWhenDeflateSolidPkware() throws IOException {
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
UnzipSettings settings = UnzipSettings.builder().password(password).build();

UnzipIt.zip(zipDeflateSolid).settings(settings).dstDir(dstDir).extract(dirNameCars);

assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldUnzipZipFileIntoDestinationFolderWhenDeflateSolidAes() throws IOException {
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
UnzipSettings settings = UnzipSettings.builder().passwordProvider(fileNamePasswordProvider).build();

UnzipIt.zip(zipDeflateSolid).settings(settings).dstDir(dstDir).extract(dirNameCars);

assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
assertThatDirectory(dstDir).matches(dirCarsAssert);
}

public void shouldCorrectlySetLastTimeStampWhenUnzip() throws IOException, ParseException {
Expand All @@ -113,6 +108,14 @@ public void shouldCorrectlySetLastTimeStampWhenUnzip() throws IOException, Parse
assertThat(convert(Files.getLastModifiedTime(fileFooUnzip).toMillis())).isEqualTo(str);
}

public void shouldUnzipZipFileIntoDestinationFolderRemovingPrefixWhenExtractWithPrefix() throws IOException {
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
Path zip = Zip4jvmSuite.getResourcePath("/zip/macos_10.zip");

UnzipIt.zip(zip).dstDir(dstDir).extract("data");
assertThatDirectory(dstDir).matches(rootAssert);
}

private static long convert(String str) throws ParseException {
return new SimpleDateFormat("yyyy.MM.dd'T'HH:mm:ss", Locale.ENGLISH).parse(str).getTime();
}
Expand Down
Binary file modified src/test/resources/zip/macos_10.zip
Binary file not shown.
Loading