Skip to content

Commit 8633401

Browse files
#107 Extract entries by prefix exclude prefix path
1 parent edfb5bc commit 8633401

File tree

8 files changed

+35
-49
lines changed

8 files changed

+35
-49
lines changed

src/main/java/ru/olegcherednik/zip4jvm/engine/unzip/UnzipExtractEngine.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.commons.collections4.CollectionUtils;
3838
import org.apache.commons.io.FilenameUtils;
3939
import org.apache.commons.io.IOUtils;
40+
import org.apache.commons.lang3.StringUtils;
4041

4142
import java.io.IOException;
4243
import java.io.OutputStream;
@@ -66,8 +67,11 @@ public class UnzipExtractEngine {
6667
protected final ZipModel zipModel;
6768

6869
public void extract(Path dstDir, Collection<String> fileNames) throws IOException {
69-
Map<String, String> map = CollectionUtils.isEmpty(fileNames) ? null
70-
: getEntriesByPrefix(new HashSet<>(fileNames));
70+
Map<String, String> map = null;
71+
72+
if (CollectionUtils.isNotEmpty(fileNames))
73+
map = getEntriesByPrefix(new HashSet<>(fileNames));
74+
7175
extractEntry(dstDir, map);
7276
}
7377

@@ -86,10 +90,10 @@ protected Map<String, String> getEntriesByPrefix(Set<String> fileNames) {
8690
if (zipModel.hasEntry(entryName)) {
8791
ZipEntry zipEntry = zipModel.getZipEntryByFileName(entryName);
8892
map.put(entryName, FilenameUtils.getName(zipEntry.getFileName()));
89-
} else {
90-
for (ZipEntry zipEntry : getEntriesByPrefix(entryName + '/'))
91-
map.put(zipEntry.getFileName(), zipEntry.getFileName());
9293
}
94+
95+
for (ZipEntry zipEntry : getEntriesByPrefix(entryName + '/'))
96+
map.put(zipEntry.getFileName(), StringUtils.substring(zipEntry.getFileName(), fileName.length() + 1));
9397
}
9498

9599
return map.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(map);

src/main/java/ru/olegcherednik/zip4jvm/model/block/Block.java

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import ru.olegcherednik.zip4jvm.io.in.file.random.RandomAccessDataInput;
2626
import ru.olegcherednik.zip4jvm.model.ZipModel;
2727
import ru.olegcherednik.zip4jvm.model.src.SrcZip;
28-
import ru.olegcherednik.zip4jvm.utils.PathUtils;
2928
import ru.olegcherednik.zip4jvm.utils.function.LocalSupplier;
3029

3130
import lombok.Getter;

src/test/java/ru/olegcherednik/zip4jvm/UnzipItSolidTest.java

+5-26
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileBentleyAssert;
4343
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileFerrariAssert;
4444
import static ru.olegcherednik.zip4jvm.TestDataAssert.fileSaintPetersburgAssert;
45+
import static ru.olegcherednik.zip4jvm.TestDataAssert.rootAssert;
4546
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatDirectory;
4647
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatFile;
4748

@@ -86,9 +87,7 @@ public void shouldUnzipOneFileIgnorePath() throws IOException {
8687
public void shouldUnzipFolder() throws IOException {
8788
Path dstDir = Zip4jvmSuite.subDirNameAsMethodNameWithTime(rootDir);
8889
UnzipIt.zip(zipDeflateSolid).dstDir(dstDir).extract(dirNameBikes);
89-
90-
assertThatDirectory(dstDir).exists().hasEntries(1).hasDirectories(1);
91-
assertThatDirectory(dstDir.resolve(dirNameBikes)).matches(dirBikesAssert);
90+
assertThatDirectory(dstDir).matches(dirBikesAssert);
9291
}
9392

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

10099
UnzipIt.zip(zip).dstDir(dstDir).settings(settings).extract();
101-
102100
assertThatDirectory(dstDir).hasEntries(2).hasRegularFiles(2);
103101
}
104102

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

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

111-
// TODO commented tests
112-
// assertThatDirectory(dstDir).hasDirectories(0).hasFiles(2);
113-
// assertThatDirectory(dstDir).file("fff - 副本.txt").exists();
109+
assertThatDirectory(dstDir).hasDirectories(2).hasRegularFiles(0);
110+
assertThatDirectory(dstDir.resolve("__MACOSX")).exists();
111+
assertThatDirectory(dstDir.resolve("data")).matches(rootAssert);
114112
}
115113

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

131-
@Test(enabled = false)
132-
public void foo() throws IOException {
133-
/*
134-
The issue was that for some unknown reason there's a spanned archive
135-
marker (0x08074b50, little endian) at the start of these ZIP files,
136-
right before the first local file header (0x04034b50), which results
137-
in iterating over the file using ZipInputStream.getNextEntry() failing
138-
as the first call immediately returns null.
139-
*/
140-
// Path dstDir = Zip4jvmSuite.subDirNameAsMethodNameWithTime(rootDir);
141-
// Path zip = Zip4jvmSuite.getResourcePath("/zip/spanned.zip");
142-
143-
// TODO we could have a problem when read a zip like a stream (not reading CentralDirectory)
144-
// see https://github.com/srikanth-lingala/zip4j/issues/563
145-
// Stream<ZipFile.Entry> stream = UnzipIt.zip(zip).open().stream();
146-
147-
// ZipInfo.zip(zip).decompose(dstDir);
148-
}
149-
150129
}

src/test/java/ru/olegcherednik/zip4jvm/assertj/DirectoryAssert.java

+5
Original file line numberDiff line numberDiff line change
@@ -229,4 +229,9 @@ public DirectoryAssert isEmpty() {
229229
return myself;
230230
}
231231

232+
@Override
233+
public String toString() {
234+
return actual.toString();
235+
}
236+
232237
}

src/test/java/ru/olegcherednik/zip4jvm/compression/CompressionDeflateTest.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ public void shouldUnzipWhenWhenDeflateCompressionAndPkwareEncryption() throws IO
132132
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
133133

134134
UnzipIt.zip(zipDeflateSolidPkware).dstDir(dstDir).password(password).extract(dirNameCars);
135-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
136-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
135+
assertThatDirectory(dstDir).matches(dirCarsAssert);
137136
}
138137

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

146145
UnzipIt.zip(zipDeflateSolidAes).dstDir(dstDir).settings(settings).extract(dirNameCars);
147-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
148-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
146+
assertThatDirectory(dstDir).matches(dirCarsAssert);
149147
}
150148

151149
public void shouldUseCompressStoreWhenFileEmpty() throws IOException {

src/test/java/ru/olegcherednik/zip4jvm/compression/CompressionStoreTest.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,7 @@ public void shouldUnzipWhenWhenStoreCompressionAndPkwareEncryption() throws IOEx
123123
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
124124

125125
UnzipIt.zip(zipStoreSolidPkware).dstDir(dstDir).password(password).extract(dirNameCars);
126-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
127-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
126+
assertThatDirectory(dstDir).matches(dirCarsAssert);
128127
}
129128

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

135134
UnzipIt.zip(zipStoreSolidAes).dstDir(dstDir).settings(settings).extract(dirNameCars);
136-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
137-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
135+
assertThatDirectory(dstDir).matches(dirCarsAssert);
138136
}
139137

140138
}

src/test/java/ru/olegcherednik/zip4jvm/engine/UnzipEngineTest.java

+12-9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import static ru.olegcherednik.zip4jvm.TestData.dirNameCars;
4343
import static ru.olegcherednik.zip4jvm.TestData.zipDeflateSolid;
4444
import static ru.olegcherednik.zip4jvm.TestDataAssert.dirCarsAssert;
45+
import static ru.olegcherednik.zip4jvm.TestDataAssert.rootAssert;
4546
import static ru.olegcherednik.zip4jvm.Zip4jvmSuite.fileNamePasswordProvider;
4647
import static ru.olegcherednik.zip4jvm.Zip4jvmSuite.password;
4748
import static ru.olegcherednik.zip4jvm.assertj.Zip4jvmAssertions.assertThatDirectory;
@@ -70,29 +71,23 @@ public void shouldUnzipZipFileIntoDestinationFolderWhenDeflateSolid() throws IOE
7071
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
7172

7273
UnzipIt.zip(zipDeflateSolid).dstDir(dstDir).extract(dirNameCars);
73-
74-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
75-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
74+
assertThatDirectory(dstDir).matches(dirCarsAssert);
7675
}
7776

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

8281
UnzipIt.zip(zipDeflateSolid).settings(settings).dstDir(dstDir).extract(dirNameCars);
83-
84-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
85-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
82+
assertThatDirectory(dstDir).matches(dirCarsAssert);
8683
}
8784

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

9289
UnzipIt.zip(zipDeflateSolid).settings(settings).dstDir(dstDir).extract(dirNameCars);
93-
94-
assertThatDirectory(dstDir).exists().hasDirectories(1).hasRegularFiles(0);
95-
assertThatDirectory(dstDir.resolve(dirNameCars)).matches(dirCarsAssert);
90+
assertThatDirectory(dstDir).matches(dirCarsAssert);
9691
}
9792

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

111+
public void shouldUnzipZipFileIntoDestinationFolderRemovingPrefixWhenExtractWithPrefix() throws IOException {
112+
Path dstDir = Zip4jvmSuite.subDirNameAsMethodName(rootDir);
113+
Path zip = Zip4jvmSuite.getResourcePath("/zip/macos_10.zip");
114+
115+
UnzipIt.zip(zip).dstDir(dstDir).extract("data");
116+
assertThatDirectory(dstDir).matches(rootAssert);
117+
}
118+
116119
private static long convert(String str) throws ParseException {
117120
return new SimpleDateFormat("yyyy.MM.dd'T'HH:mm:ss", Locale.ENGLISH).parse(str).getTime();
118121
}

src/test/resources/zip/macos_10.zip

-444 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)