Skip to content

Commit 93c15b3

Browse files
committed
Replace Jazzlib with Zip4j for zip file handling
This commit updates the codebase to utilize Zip4j instead of Jazzlib for handling zip files, enhancing functionality and reliability. It includes changes in dependency addition and modifications across several files to adapt to the new library, ensuring compatibility and fixing related test expectations.
1 parent b0a3bba commit 93c15b3

File tree

5 files changed

+43
-58
lines changed

5 files changed

+43
-58
lines changed

epub4j-core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ plugins {
1212
dependencies {
1313
implementation("net.sf.kxml:kxml2:2.3.0")
1414
implementation("xmlpull:xmlpull:1.1.3.4d_b4_min")
15+
implementation("net.lingala.zip4j:zip4j:2.11.5")
1516
}
1617

1718
gversion {

epub4j-core/src/main/java/io/documentnode/epub4j/epub/EpubReader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
import java.io.InputStream;
1414
import java.util.Arrays;
1515
import java.util.List;
16-
import net.sf.jazzlib.ZipFile;
17-
import net.sf.jazzlib.ZipInputStream;
16+
17+
import net.lingala.zip4j.ZipFile;
18+
import net.lingala.zip4j.io.inputstream.ZipInputStream;
1819
import org.w3c.dom.Document;
1920
import org.w3c.dom.Element;
2021

epub4j-core/src/main/java/io/documentnode/epub4j/epub/ResourcesLoader.java

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,23 @@
11
package io.documentnode.epub4j.epub;
22

3-
import io.documentnode.epub4j.domain.EpubResourceProvider;
4-
import io.documentnode.epub4j.domain.LazyResource;
5-
import io.documentnode.epub4j.domain.LazyResourceProvider;
6-
import io.documentnode.epub4j.domain.MediaType;
7-
import io.documentnode.epub4j.domain.MediaTypes;
8-
import io.documentnode.epub4j.domain.Resource;
9-
import io.documentnode.epub4j.domain.Resources;
3+
import io.documentnode.epub4j.domain.*;
104
import io.documentnode.epub4j.util.CollectionUtil;
115
import io.documentnode.epub4j.util.ResourceUtil;
126
import io.documentnode.minilog.Logger;
7+
import net.lingala.zip4j.ZipFile;
8+
import net.lingala.zip4j.io.inputstream.ZipInputStream;
9+
import net.lingala.zip4j.model.FileHeader;
10+
import net.lingala.zip4j.model.LocalFileHeader;
11+
1312
import java.io.IOException;
1413
import java.util.Collection;
1514
import java.util.Collections;
16-
import java.util.Enumeration;
1715
import java.util.List;
18-
import net.sf.jazzlib.ZipEntry;
19-
import net.sf.jazzlib.ZipException;
20-
import net.sf.jazzlib.ZipFile;
21-
import net.sf.jazzlib.ZipInputStream;
2216

2317
/**
2418
* Loads Resources from inputStreams, ZipFiles, etc
2519
*
2620
* @author paul
27-
*
2821
*/
2922
public class ResourcesLoader {
3023

@@ -48,24 +41,23 @@ public static Resources loadResources(ZipFile zipFile,
4841
List<MediaType> lazyLoadedTypes) throws IOException {
4942

5043
LazyResourceProvider resourceProvider =
51-
new EpubResourceProvider(zipFile.getName());
44+
new EpubResourceProvider(zipFile.getFile().getAbsolutePath());
5245

5346
Resources result = new Resources();
54-
Enumeration<? extends ZipEntry> entries = zipFile.entries();
47+
var entries = zipFile.getFileHeaders();
5548

56-
while (entries.hasMoreElements()) {
57-
ZipEntry zipEntry = entries.nextElement();
49+
for (FileHeader zipEntry : entries) {
5850

5951
if (zipEntry == null || zipEntry.isDirectory()) {
6052
continue;
6153
}
6254

63-
String href = zipEntry.getName();
55+
String href = zipEntry.getFileName();
6456

6557
Resource resource;
6658

6759
if (shouldLoadLazy(href, lazyLoadedTypes)) {
68-
resource = new LazyResource(resourceProvider, zipEntry.getSize(), href);
60+
resource = new LazyResource(resourceProvider, zipEntry.getUncompressedSize(), href);
6961
} else {
7062
resource = ResourceUtil
7163
.createResource(zipEntry, zipFile.getInputStream(zipEntry));
@@ -113,7 +105,7 @@ private static boolean shouldLoadLazy(String href,
113105
public static Resources loadResources(ZipInputStream zipInputStream,
114106
String defaultHtmlEncoding) throws IOException {
115107
Resources result = new Resources();
116-
ZipEntry zipEntry;
108+
LocalFileHeader zipEntry;
117109
do {
118110
// get next valid zipEntry
119111
zipEntry = getNextZipEntry(zipInputStream);
@@ -133,19 +125,16 @@ public static Resources loadResources(ZipInputStream zipInputStream,
133125
}
134126

135127

136-
private static ZipEntry getNextZipEntry(ZipInputStream zipInputStream)
128+
private static LocalFileHeader getNextZipEntry(ZipInputStream zipInputStream)
137129
throws IOException {
138130
try {
139-
return zipInputStream.getNextEntry();
140-
} catch (ZipException e) {
131+
LocalFileHeader nextEntry = zipInputStream.getNextEntry();
132+
return nextEntry;
133+
} catch (IOException e) {
141134
//see <a href="https://github.com/psiegman/epublib/issues/122">Issue #122 Infinite loop</a>.
142135
//when reading a file that is not a real zip archive or a zero length file, zipInputStream.getNextEntry()
143136
//throws an exception and does not advance, so loadResources enters an infinite loop
144137
log.error("Invalid or damaged zip file.", e);
145-
try {
146-
zipInputStream.closeEntry();
147-
} catch (Exception ignored) {
148-
}
149138
throw e;
150139
}
151140
}

epub4j-core/src/main/java/io/documentnode/epub4j/util/ResourceUtil.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,20 @@
22

33
import io.documentnode.epub4j.Constants;
44
import io.documentnode.epub4j.domain.MediaType;
5+
import io.documentnode.epub4j.domain.MediaTypes;
56
import io.documentnode.epub4j.domain.Resource;
67
import io.documentnode.epub4j.epub.EpubProcessorSupport;
7-
import io.documentnode.epub4j.domain.MediaTypes;
8-
import java.io.File;
9-
import java.io.FileInputStream;
10-
import java.io.IOException;
11-
import java.io.InputStream;
12-
import java.io.Reader;
13-
import java.io.UnsupportedEncodingException;
14-
import javax.xml.parsers.DocumentBuilder;
15-
import javax.xml.parsers.ParserConfigurationException;
16-
import net.sf.jazzlib.ZipEntry;
17-
import net.sf.jazzlib.ZipInputStream;
8+
import net.lingala.zip4j.io.inputstream.ZipInputStream;
9+
import net.lingala.zip4j.model.FileHeader;
10+
import net.lingala.zip4j.model.LocalFileHeader;
1811
import org.w3c.dom.Document;
1912
import org.xml.sax.InputSource;
2013
import org.xml.sax.SAXException;
2114

15+
import javax.xml.parsers.DocumentBuilder;
16+
import javax.xml.parsers.ParserConfigurationException;
17+
import java.io.*;
18+
2219
/**
2320
* Various resource utility methods
2421
*
@@ -60,15 +57,14 @@ public static Resource createResource(String title, String href) {
6057
* @return a resource created out of the given zipEntry and zipInputStream.
6158
* @throws IOException
6259
*/
63-
public static Resource createResource(ZipEntry zipEntry,
64-
ZipInputStream zipInputStream) throws IOException {
65-
return new Resource(zipInputStream, zipEntry.getName());
60+
public static Resource createResource(LocalFileHeader zipEntry,
61+
ZipInputStream zipInputStream) throws IOException {
62+
return new Resource(zipInputStream, zipEntry.getFileName());
6663

6764
}
68-
69-
public static Resource createResource(ZipEntry zipEntry,
70-
InputStream zipInputStream) throws IOException {
71-
return new Resource(zipInputStream, zipEntry.getName());
65+
public static Resource createResource(FileHeader zipEntry,
66+
ZipInputStream zipInputStream) throws IOException {
67+
return new Resource(zipInputStream, zipEntry.getFileName());
7268

7369
}
7470

epub4j-core/src/test/java/io/documentnode/epub4j/epub/ResourcesLoaderTest.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package io.documentnode.epub4j.epub;
22

3-
import io.documentnode.epub4j.domain.LazyResource;
4-
import io.documentnode.epub4j.domain.Resource;
5-
import io.documentnode.epub4j.domain.Resources;
6-
import io.documentnode.epub4j.domain.MediaTypes;
3+
import io.documentnode.epub4j.domain.*;
74
import io.documentnode.epub4j.util.IOUtil;
85
import java.io.File;
96
import java.io.FileInputStream;
@@ -14,9 +11,9 @@
1411
import java.util.Arrays;
1512
import java.util.Collections;
1613
import java.util.List;
17-
import net.sf.jazzlib.ZipException;
18-
import net.sf.jazzlib.ZipFile;
19-
import net.sf.jazzlib.ZipInputStream;
14+
15+
import net.lingala.zip4j.ZipFile;
16+
import net.lingala.zip4j.io.inputstream.ZipInputStream;
2017
import org.junit.AfterClass;
2118
import org.junit.Assert;
2219
import org.junit.BeforeClass;
@@ -66,7 +63,7 @@ public void testLoadResources_ZipInputStream() throws IOException {
6663
* Loads the Resources from a zero length file, using ZipInputStream<br/>
6764
* See <a href="https://github.com/psiegman/epublib/issues/122">Issue #122 Infinite loop</a>.
6865
*/
69-
@Test(expected = ZipException.class)
66+
@Test(expected = IOException.class)
7067
public void testLoadResources_ZipInputStream_WithZeroLengthFile()
7168
throws IOException {
7269
// given
@@ -81,15 +78,16 @@ public void testLoadResources_ZipInputStream_WithZeroLengthFile()
8178
* Loads the Resources from a file that is not a valid zip, using ZipInputStream<br/>
8279
* See <a href="https://github.com/psiegman/epublib/issues/122">Issue #122 Infinite loop</a>.
8380
*/
84-
@Test(expected = ZipException.class)
81+
@Test(expected = IOException.class)
8582
public void testLoadResources_ZipInputStream_WithInvalidFile()
8683
throws IOException {
8784
// given
8885
ZipInputStream zipInputStream = new ZipInputStream(
8986
this.getClass().getResourceAsStream("/not_a_zip.epub"));
9087

9188
// when
92-
ResourcesLoader.loadResources(zipInputStream, encoding);
89+
Resources resources = ResourcesLoader.loadResources(zipInputStream, encoding);
90+
resources.getAll().forEach(System.out::println);
9391
}
9492

9593
/**
@@ -148,7 +146,7 @@ public void testLoadResources_ZipFile_partial_lazy() throws IOException {
148146
Assert
149147
.assertEquals(Resource.class, resources.getById("chapter1").getClass());
150148
}
151-
149+
152150
private void verifyResources(Resources resources) throws IOException {
153151
Assert.assertNotNull(resources);
154152
Assert.assertEquals(12, resources.getAll().size());

0 commit comments

Comments
 (0)