Skip to content

Commit edfb5bc

Browse files
Refactoring
1 parent 96d39b0 commit edfb5bc

File tree

10 files changed

+34
-49
lines changed

10 files changed

+34
-49
lines changed

src/main/java/ru/olegcherednik/zip4jvm/ZipMisc.java

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package ru.olegcherednik.zip4jvm;
2020

2121
import ru.olegcherednik.zip4jvm.exception.EntryNotFoundException;
22+
import ru.olegcherednik.zip4jvm.model.entry.ZipEntry;
2223
import ru.olegcherednik.zip4jvm.model.settings.ZipSettings;
2324

2425
import lombok.AccessLevel;
@@ -86,10 +87,13 @@ public String getComment() throws IOException {
8687

8788
/**
8889
* Retrieve not {@literal null} {@link Stream} with existed entries as {@link ZipFile.Entry} objects.
90+
* </p>
91+
* Retrieved {@link ZipFile.Entry} are sorted by {@link ZipEntry#getLocalFileHeaderAbsOffs()}.
8992
*
9093
* @return not {@literal null} stream of entries
9194
* @throws IOException in case of any problem with file access
9295
*/
96+
// @NotNull
9397
public Stream<ZipFile.Entry> getEntries() throws IOException {
9498
return UnzipIt.zip(zip).open().stream();
9599
}

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

+7-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import ru.olegcherednik.zip4jvm.io.in.file.random.SplitRandomAccessDataInput;
2525
import ru.olegcherednik.zip4jvm.model.ZipModel;
2626
import ru.olegcherednik.zip4jvm.model.builders.ZipModelBuilder;
27+
import ru.olegcherednik.zip4jvm.model.entry.ZipEntry;
28+
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;
2729
import ru.olegcherednik.zip4jvm.model.settings.UnzipSettings;
2830
import ru.olegcherednik.zip4jvm.model.src.SrcZip;
2931

@@ -43,8 +45,9 @@ public final class UnzipEngine implements ZipFile.Reader {
4345
private final UnzipExtractEngine unzipExtractEngine;
4446

4547
public UnzipEngine(SrcZip srcZip, UnzipSettings settings) {
46-
zipModel = ZipModelBuilder.read(srcZip, settings.getCharsetCustomizer(), settings.getPasswordProvider());
47-
unzipExtractEngine = new UnzipExtractEngine(settings.getPasswordProvider(), zipModel);
48+
PasswordProvider passwordProvider = settings.getPasswordProvider();
49+
zipModel = ZipModelBuilder.read(srcZip, settings.getCharsetCustomizer(), passwordProvider);
50+
unzipExtractEngine = new UnzipExtractEngine(passwordProvider, zipModel);
4851
}
4952

5053
// ---------- ZipFile.Reader ----------
@@ -88,7 +91,7 @@ public boolean isZip64() {
8891
@SuppressWarnings("PMD.UseDiamondOperator")
8992
public Iterator<ZipFile.Entry> iterator() {
9093
return new Iterator<ZipFile.Entry>() {
91-
private final Iterator<String> it = zipModel.getEntryNames().iterator();
94+
private final Iterator<ZipEntry> it = zipModel.absOffsAscIterator();
9295

9396
@Override
9497
public boolean hasNext() {
@@ -97,7 +100,7 @@ public boolean hasNext() {
97100

98101
@Override
99102
public ZipFile.Entry next() {
100-
return zipModel.getZipEntryByFileName(it.next()).createImmutableEntry();
103+
return it.next().createImmutableEntry();
101104
}
102105
};
103106
}

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

+7-29
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@
3838
import org.apache.commons.io.FilenameUtils;
3939
import org.apache.commons.io.IOUtils;
4040

41-
import java.io.FileNotFoundException;
4241
import java.io.IOException;
43-
import java.io.InputStream;
4442
import java.io.OutputStream;
4543
import java.nio.file.Files;
4644
import java.nio.file.Path;
@@ -57,8 +55,6 @@
5755
import java.util.Set;
5856
import java.util.stream.Collectors;
5957

60-
import static ru.olegcherednik.zip4jvm.utils.ValidationUtils.requireNotBlank;
61-
6258
/**
6359
* @author Oleg Cherednik
6460
* @since 22.12.2024
@@ -76,13 +72,7 @@ public void extract(Path dstDir, Collection<String> fileNames) throws IOExceptio
7672
}
7773

7874
public ZipFile.Entry extract(String fileName) throws IOException {
79-
requireNotBlank(fileName, "UnzipIt.fileName");
80-
8175
ZipEntry zipEntry = zipModel.getZipEntryByFileName(ZipUtils.normalizeFileName(fileName));
82-
83-
if (zipEntry == null)
84-
throw new FileNotFoundException("Entry '" + fileName + "' was not found");
85-
8676
zipEntry.setPassword(passwordProvider.getFilePassword(zipEntry.getFileName()));
8777
return zipEntry.createImmutableEntry();
8878
}
@@ -97,25 +87,25 @@ protected Map<String, String> getEntriesByPrefix(Set<String> fileNames) {
9787
ZipEntry zipEntry = zipModel.getZipEntryByFileName(entryName);
9888
map.put(entryName, FilenameUtils.getName(zipEntry.getFileName()));
9989
} else {
100-
for (ZipEntry zipEntry : getEntriesNamesByPrefix(entryName + '/'))
90+
for (ZipEntry zipEntry : getEntriesByPrefix(entryName + '/'))
10191
map.put(zipEntry.getFileName(), zipEntry.getFileName());
10292
}
10393
}
10494

10595
return map.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(map);
10696
}
10797

108-
protected List<ZipEntry> getEntriesNamesByPrefix(String fileNamePrefix) {
98+
protected List<ZipEntry> getEntriesByPrefix(String prefix) {
10999
return zipModel.getZipEntries().stream()
110-
.filter(entry -> entry.getFileName().startsWith(fileNamePrefix))
100+
.filter(entry -> entry.getFileName().startsWith(prefix))
111101
.collect(Collectors.toList());
112102
}
113103

114104
// ----------
115105

116106
protected void extractEntry(Path dstDir, Map<String, String> map) throws IOException {
117107
try (ConsecutiveAccessDataInput in = createConsecutiveDataInput(zipModel.getSrcZip())) {
118-
Iterator<ZipEntry> it = zipModel.offsAscIterator();
108+
Iterator<ZipEntry> it = zipModel.absOffsAscIterator();
119109

120110
while (it.hasNext()) {
121111
ZipEntry zipEntry = it.next();
@@ -147,7 +137,7 @@ else if (zipEntry.isDirectory())
147137
}
148138

149139
protected static void extractSymlink(Path symlink, ZipEntry zipEntry, DataInput in) throws IOException {
150-
String target = IOUtils.toString(zipEntry.createInputStream(), Charsets.UTF_8);
140+
String target = IOUtils.toString(zipEntry.createInputStream(in), Charsets.UTF_8);
151141

152142
if (target.startsWith("/"))
153143
ZipSymlinkEngine.createAbsoluteSymlink(symlink, Paths.get(target));
@@ -162,22 +152,10 @@ protected static void extractEmptyDirectory(Path dir) throws IOException {
162152
Files.createDirectories(dir);
163153
}
164154

165-
@SuppressWarnings("PMD.CloseResource")
166-
protected void extractRegularFile(Path file, ZipEntry zipEntry, DataInput di) throws IOException {
155+
protected void extractRegularFile(Path file, ZipEntry zipEntry, DataInput in) throws IOException {
167156
String fileName = ZipUtils.getFileNameNoDirectoryMarker(zipEntry.getFileName());
168157
zipEntry.setPassword(passwordProvider.getFilePassword(fileName));
169-
170-
InputStream in = zipEntry.createInputStream(di);
171-
172-
// if (zipEntry.getAesVersion() != AesVersion.AE_2) {
173-
// in = ChecksumCheckDataInput.builder()
174-
// .setExpectedChecksumValue(zipEntry.getChecksum())
175-
// .setChecksum(new PureJavaCrc32())
176-
// .setInputStream(in)
177-
// .get();
178-
// }
179-
180-
ZipUtils.copyLarge(in, getOutputStream(file));
158+
ZipUtils.copyLarge(zipEntry.createInputStream(in), getOutputStream(file));
181159
}
182160

183161
protected static void setFileAttributes(Path path, ZipEntry zipEntry) throws IOException {

src/main/java/ru/olegcherednik/zip4jvm/engine/zip/ZipEngine.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ private void removeOriginalZipFiles() throws IOException {
223223

224224
private void moveTempZipFiles() throws IOException {
225225
for (int diskNo = 0; diskNo <= tempZipModel.getTotalDisks(); diskNo++) {
226-
Path src = tempZipModel.getDiskPath(diskNo);
226+
Path src = tempZipModel.getDisk(diskNo);
227227
Path dest = zip.getParent().resolve(src.getFileName());
228228
Files.move(src, dest);
229229
}

src/main/java/ru/olegcherednik/zip4jvm/io/writers/entry/ZipEntryWithoutDataDescriptorWriter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void write(DataOutput out) throws IOException {
5252
Path tempFile = tempDir.resolve(zipEntry.getFileName());
5353
Files.deleteIfExists(tempFile);
5454

55-
zipEntry.setChecksum(ChecksumUtils.crc32(zipEntry.createInputStream()));
55+
zipEntry.setChecksum(ChecksumUtils.crc32(zipEntry.createInputStream(null)));
5656

5757
try (SolidDataOutput tmpOut = new SolidDataOutput(out.getByteOrder(), tempFile)) {
5858
writePayload(tmpOut);

src/main/java/ru/olegcherednik/zip4jvm/io/writers/entry/ZipEntryWriter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ protected final void writePayload(DataOutput out) throws IOException {
8686
out = SizeCalcDataOutput.uncompressedSize(zipEntry, out);
8787
out = ChecksumCalcDataOutput.checksum(zipEntry, out);
8888

89-
ZipUtils.copyLarge(zipEntry.createInputStream(), out);
89+
ZipUtils.copyLarge(zipEntry.createInputStream(null), out);
9090
}
9191

9292
// ---------- Writer ----------

src/main/java/ru/olegcherednik/zip4jvm/model/ZipModel.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ public final class ZipModel {
8989
Comparator.comparingInt(ZipEntry::getDiskNo)
9090
.thenComparing(ZipEntry::getLocalFileHeaderDiskOffs);
9191

92-
public Iterator<ZipEntry> offsAscIterator() {
92+
// @NotNull
93+
public Iterator<ZipEntry> absOffsAscIterator() {
9394
if (fileNameEntry.isEmpty())
9495
return EmptyIterator.emptyIterator();
9596

@@ -129,6 +130,7 @@ public Collection<ZipEntry> getZipEntries() {
129130
return isEmpty() ? Collections.emptyList() : Collections.unmodifiableCollection(fileNameEntry.values());
130131
}
131132

133+
// @NotNull
132134
public ZipEntry getZipEntryByFileName(String fileName) {
133135
if (fileNameEntry.containsKey(fileName))
134136
return fileNameEntry.get(fileName);
@@ -143,7 +145,7 @@ public Set<String> getEntryNames() {
143145
return isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(fileNameEntry.keySet());
144146
}
145147

146-
public Path getDiskPath(int diskNo) {
148+
public Path getDisk(int diskNo) {
147149
return diskNo >= totalDisks ? srcZip.getPath() : srcZip.getDiskPath(diskNo + 1);
148150
}
149151

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

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
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;
2829
import ru.olegcherednik.zip4jvm.utils.function.LocalSupplier;
2930

3031
import lombok.Getter;
@@ -98,4 +99,5 @@ public void copyLarge(ZipModel zipModel, Path out) throws IOException {
9899
public String toString() {
99100
return String.format("offs: %d, size: %s, disk: %d", diskOffs, size, diskNo);
100101
}
102+
101103
}

src/main/java/ru/olegcherednik/zip4jvm/model/entry/ZipEntry.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,6 @@ public final boolean isEncrypted() {
101101
return encryptionMethod != EncryptionMethod.OFF;
102102
}
103103

104-
public InputStream createInputStream() throws IOException {
105-
return inputStreamFunction.create(this, null);
106-
}
107-
108104
public InputStream createInputStream(DataInput in) throws IOException {
109105
return inputStreamFunction.create(this, in);
110106
}
@@ -134,7 +130,7 @@ public ZipFile.Entry createImmutableEntry() {
134130
if (isDirectory())
135131
return ZipFile.Entry.directory(fileName, lastModifiedTime, externalFileAttributes);
136132

137-
return ZipFile.Entry.regularFile(this::createInputStream,
133+
return ZipFile.Entry.regularFile(() -> createInputStream(null),
138134
fileName,
139135
lastModifiedTime,
140136
uncompressedSize,

src/test/java/ru/olegcherednik/zip4jvm/io/out/SplitZipDataOutputTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,16 @@ public void shouldWriteStreamWhenUsingDataOutput() throws IOException {
8888

8989
zipModel.setTotalDisks(5);
9090

91-
byte[] buf = FileUtils.readFileToByteArray(zipModel.getDiskPath(0).toFile());
91+
byte[] buf = FileUtils.readFileToByteArray(zipModel.getDisk(0).toFile());
9292
assertThat(Arrays.copyOfRange(buf, 0, 4)).isEqualTo(new byte[] { 0x50, 0x4B, 0x7, 0x8 });
9393
assertThat(Arrays.copyOfRange(buf, 4, 6)).isEqualTo(new byte[] { 0x1, 0x2 });
9494
assertThat(Arrays.copyOfRange(buf, 6, 10)).isEqualTo(new byte[] { 0x3, 0x4, 0x5, 0x6 });
9595

96-
buf = FileUtils.readFileToByteArray(zipModel.getDiskPath(1).toFile());
96+
buf = FileUtils.readFileToByteArray(zipModel.getDisk(1).toFile());
9797
assertThat(Arrays.copyOfRange(buf, 0, 8)).isEqualTo(new byte[] { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE });
9898
assertThat(new String(Arrays.copyOfRange(buf, 8, 10), Charsets.UTF_8)).isEqualTo("ol");
9999

100-
buf = FileUtils.readFileToByteArray(zipModel.getDiskPath(2).toFile());
100+
buf = FileUtils.readFileToByteArray(zipModel.getDisk(2).toFile());
101101
assertThat(new String(Arrays.copyOfRange(buf, 0, 2), Charsets.UTF_8)).isEqualTo("eg");
102102
assertThat(Arrays.copyOfRange(buf, 2, 3)).isEqualTo(new byte[] { 0x11 });
103103
assertThat(Arrays.copyOfRange(buf, 3, 6)).isEqualTo(new byte[] { 0x12, 0x13, 0x14 });
@@ -120,12 +120,12 @@ public void shouldMoveToNextDiskWhenNotEnoughSpaceToWriteSignature() throws IOEx
120120

121121
zipModel.setTotalDisks(5);
122122

123-
byte[] buf = FileUtils.readFileToByteArray(zipModel.getDiskPath(0).toFile());
123+
byte[] buf = FileUtils.readFileToByteArray(zipModel.getDisk(0).toFile());
124124
assertThat(Arrays.copyOfRange(buf, 0, 4)).isEqualTo(new byte[] { 0x50, 0x4B, 0x7, 0x8 });
125125
assertThat(Arrays.copyOfRange(buf, 4, 8)).isEqualTo(new byte[] { 0x4, 0x3, 0x2, 0x1 });
126126
assertThat(buf).hasSize(8);
127127

128-
buf = FileUtils.readFileToByteArray(zipModel.getDiskPath(1).toFile());
128+
buf = FileUtils.readFileToByteArray(zipModel.getDisk(1).toFile());
129129
assertThat(Arrays.copyOfRange(buf, 0, 4)).isEqualTo(new byte[] { 0x8, 0x7, 0x6, 0x5 });
130130
}
131131

@@ -135,7 +135,7 @@ public void shouldThrowExceptionWhenSplitFileExists() throws IOException {
135135
zipModel.setSplitSize(10);
136136

137137
zipModel.setTotalDisks(5);
138-
FileUtils.writeByteArrayToFile(zipModel.getDiskPath(0).toFile(), new byte[] { 0x1, 0x2 }, true);
138+
FileUtils.writeByteArrayToFile(zipModel.getDisk(0).toFile(), new byte[] { 0x1, 0x2 }, true);
139139
zipModel.setTotalDisks(0);
140140

141141
assertThatThrownBy(() -> {

0 commit comments

Comments
 (0)