From a798e0c0a1313a058e16cc246f2cc475096e99ac Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 29 Nov 2020 20:24:30 +0400 Subject: [PATCH 01/10] Made the java wrapper unit test run & pass The kiwixlib java wrapper unit test can be run manually via the src/wrapper/java/org/kiwix/testing/compile_test.sh script. The test ZIM files in src/wrapper/java/org/kiwix/testing were created using the create_test_zimfiles. They must be updated/re-generated and committed in git whenever their source data or the create_test_zimfiles script changes. Note: small.zim.embedded is not used at this point, it was created for testing the enhancement coming in a few commits. --- .../java/org/kiwix/testing/catalog.xml | 19 ++++++++++++ .../java/org/kiwix/testing/compile_test.sh | 27 ++++++++++++----- .../org/kiwix/testing/create_test_zimfiles | 28 ++++++++++++++++++ src/wrapper/java/org/kiwix/testing/small.zim | Bin 0 -> 46144 bytes .../java/org/kiwix/testing/small.zim.embedded | Bin 0 -> 46158 bytes .../testing/small_zimfile_data/favicon.png | Bin 0 -> 3201 bytes .../testing/small_zimfile_data/main.html | 11 +++++++ src/wrapper/java/org/kiwix/testing/test.java | 14 ++++----- 8 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/wrapper/java/org/kiwix/testing/catalog.xml create mode 100755 src/wrapper/java/org/kiwix/testing/create_test_zimfiles create mode 100644 src/wrapper/java/org/kiwix/testing/small.zim create mode 100644 src/wrapper/java/org/kiwix/testing/small.zim.embedded create mode 100644 src/wrapper/java/org/kiwix/testing/small_zimfile_data/favicon.png create mode 100644 src/wrapper/java/org/kiwix/testing/small_zimfile_data/main.html diff --git a/src/wrapper/java/org/kiwix/testing/catalog.xml b/src/wrapper/java/org/kiwix/testing/catalog.xml new file mode 100644 index 000000000..3e2f6ac20 --- /dev/null +++ b/src/wrapper/java/org/kiwix/testing/catalog.xml @@ -0,0 +1,19 @@ + + 00000000-0000-0000-0000-000000000000 + + Test ZIM file + urn:uuid:86c91e51-55bf-8882-464e-072aca37a3e8 + /meta?name=favicon&content=small + 2020-11-27:00::00:Z + en + This is a ZIM file used in libzim unit-tests + unit;test + + + Kiwix + + + + + + diff --git a/src/wrapper/java/org/kiwix/testing/compile_test.sh b/src/wrapper/java/org/kiwix/testing/compile_test.sh index a98569935..41899afaa 100755 --- a/src/wrapper/java/org/kiwix/testing/compile_test.sh +++ b/src/wrapper/java/org/kiwix/testing/compile_test.sh @@ -1,26 +1,37 @@ #!/usr/bin/bash -# This script compile the unit test to test the java wrapper. +# This script compiles and runs the unit test to test the java wrapper. # This is not integrated in meson because ... this is not so easy. +die() +{ + echo >&2 "!!! ERROR: $*" + exit 1 +} + KIWIX_LIB_JAR=$1 if [ -z $KIWIX_LIB_JAR ] then - echo "You must give the path to the kiwixlib.jar as first argument" - exit 1 + die "You must give the path to the kiwixlib.jar as first argument" fi KIWIX_LIB_DIR=$2 if [ -z $KIWIX_LIB_DIR ] then - echo "You must give the path to directory containing libkiwix.so as second argument" - exit 1 + die "You must give the path to directory containing libkiwix.so as second argument" fi -TEST_SOURCE_DIR=$(dirname $(readlink -f $0)) +KIWIX_LIB_JAR=$(readlink -f "$KIWIX_LIB_JAR") +KIWIX_LIB_DIR=$(readlink -f "$KIWIX_LIB_DIR") +TEST_SOURCE_DIR=$(dirname "$(readlink -f $0)") -javac -g -d . -s . -cp $TEST_SOURCE_DIR/junit-4.13.jar:$KIWIX_LIB_JAR $TEST_SOURCE_DIR/test.java +cd "$TEST_SOURCE_DIR" -java -Djava.library.path=$KIWIX_LIB_DIR -cp $TEST_SOURCE_DIR/junit-4.13.jar:$TEST_SOURCE_DIR/hamcrest-core-1.3.jar:$KIWIX_LIB_JAR:. org.junit.runner.JUnitCore test +javac -g -d . -s . -cp "junit-4.13.jar:$KIWIX_LIB_JAR" test.java \ + || die "Compilation failed" +java -Djava.library.path="$KIWIX_LIB_DIR" \ + -cp "junit-4.13.jar:hamcrest-core-1.3.jar:$KIWIX_LIB_JAR:." \ + org.junit.runner.JUnitCore test \ + || die "Unit test failed" diff --git a/src/wrapper/java/org/kiwix/testing/create_test_zimfiles b/src/wrapper/java/org/kiwix/testing/create_test_zimfiles new file mode 100755 index 000000000..4610b7da2 --- /dev/null +++ b/src/wrapper/java/org/kiwix/testing/create_test_zimfiles @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +die() +{ + echo >&2 "!!! ERROR: $*" + exit 1 +} + +cd "$(dirname "$0")" +rm -f small.zim +zimwriterfs --withoutFTIndex \ + -w main.html \ + -f favicon.png \ + -l en \ + -t "Test ZIM file" \ + -d "N/A" \ + -c "N/A" \ + -p "N/A" \ + small_zimfile_data \ + small.zim \ +&& echo 'small.zim was successfully created' \ +|| die 'Failed to create small.zim' + +printf "BEGINZIM" > small.zim.embedded \ +&& cat small.zim >> small.zim.embedded \ +&& printf "ENDZIM" >> small.zim.embedded \ +&& echo 'small.zim.embedded was successfully created' \ +|| die 'Failed to create small.zim.embedded' diff --git a/src/wrapper/java/org/kiwix/testing/small.zim b/src/wrapper/java/org/kiwix/testing/small.zim new file mode 100644 index 0000000000000000000000000000000000000000..bce4fc57aafff42fa0e571603454fed51ec3f801 GIT binary patch literal 46144 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 D$!J79 literal 0 HcmV?d00001 diff --git a/src/wrapper/java/org/kiwix/testing/small_zimfile_data/favicon.png b/src/wrapper/java/org/kiwix/testing/small_zimfile_data/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..809454352935ccdc7bcbd91aacc89e0e48eb82a6 GIT binary patch literal 3201 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 + + + Test ZIM file + + + + + Test ZIM file + + diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index 671b0b46e..502d8c85d 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -31,15 +31,15 @@ throws IOException Library lib = new Library(); Manager manager = new Manager(lib); String content = getCatalogContent(); - manager.readOpds(content, "https://library.kiwix.org"); - assertEquals(lib.getBookCount(true, true), 10); + manager.readOpds(content, "http://localhost"); + assertEquals(lib.getBookCount(true, true), 1); String[] bookIds = lib.getBooksIds(); - assertEquals(bookIds.length, 10); + assertEquals(bookIds.length, 1); Book book = lib.getBookById(bookIds[0]); - assertEquals(book.getTitle(), "Wikisource"); - assertEquals(book.getTags(), "wikisource;_category:wikisource;_pictures:no;_videos:no;_details:yes;_ftindex:yes"); - assertEquals(book.getFaviconUrl(), "https://library.kiwix.org/meta?name=favicon&content=wikisource_fr_all_nopic_2020-01"); - assertEquals(book.getUrl(), "http://download.kiwix.org/zim/wikisource/wikisource_fr_all_nopic_2020-01.zim.meta4"); + assertEquals(book.getTitle(), "Test ZIM file"); + assertEquals(book.getTags(), "unit;test"); + assertEquals(book.getFaviconUrl(), "http://localhost/meta?name=favicon&content=small"); + assertEquals(book.getUrl(), "http://localhost/small.zim"); } static From e40827fbac7177fe8bb7f8b7101f6e8097f1bc91 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Thu, 3 Dec 2020 13:21:12 +0400 Subject: [PATCH 02/10] Renamed the java wrapper unit test runner script --- .../kiwix/testing/{compile_test.sh => compile_and_run_test.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/wrapper/java/org/kiwix/testing/{compile_test.sh => compile_and_run_test.sh} (100%) diff --git a/src/wrapper/java/org/kiwix/testing/compile_test.sh b/src/wrapper/java/org/kiwix/testing/compile_and_run_test.sh similarity index 100% rename from src/wrapper/java/org/kiwix/testing/compile_test.sh rename to src/wrapper/java/org/kiwix/testing/compile_and_run_test.sh From 98d69ef59b03a00d4d6441017901827aee557f48 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 29 Nov 2020 21:27:22 +0400 Subject: [PATCH 03/10] Added testReader unit-test for the java wrapper --- src/wrapper/java/org/kiwix/testing/test.java | 25 ++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index 502d8c85d..cc0879fda 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -10,10 +10,10 @@ static { System.loadLibrary("kiwix"); } -private static String getCatalogContent() +private static String getFileContent(String path) throws IOException { - BufferedReader reader = new BufferedReader(new FileReader("catalog.xml")); + BufferedReader reader = new BufferedReader(new FileReader(path)); String line; StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) @@ -25,12 +25,29 @@ throws IOException } @Test -public void testSome() +public void testReader() +throws JNIKiwixException, IOException +{ + JNIKiwixReader reader = new JNIKiwixReader("small.zim"); + assertEquals("Test ZIM file", reader.getTitle()); + assertEquals(45, reader.getFileSize()); // The file size is in KiB + assertEquals("A/main.html", reader.getMainPage()); + String s = getFileContent("small_zimfile_data/main.html"); + byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertEquals(s, new String(c)); + +} + +@Test +public void testLibrary() throws IOException { Library lib = new Library(); Manager manager = new Manager(lib); - String content = getCatalogContent(); + String content = getFileContent("catalog.xml"); manager.readOpds(content, "http://localhost"); assertEquals(lib.getBookCount(true, true), 1); String[] bookIds = lib.getBooksIds(); From 4d23e44de7c0d95cebed58accc639858ae93cf62 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 29 Nov 2020 23:38:34 +0400 Subject: [PATCH 04/10] JNIKiwixReader ctor taking a file descriptor ... and a corresponding unit test --- include/reader.h | 3 +- src/reader.cpp | 9 ++++++ src/wrapper/java/kiwixreader.cpp | 29 +++++++++++++++++++ .../org/kiwix/kiwixlib/JNIKiwixReader.java | 11 +++++++ src/wrapper/java/org/kiwix/testing/test.java | 18 ++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/include/reader.h b/include/reader.h index d36e44da9..263617c9d 100644 --- a/include/reader.h +++ b/include/reader.h @@ -55,7 +55,8 @@ class Reader * unsplitted path as if the file were not splitted * (.zim extesion). */ - Reader(const string zimFilePath); + explicit Reader(const string zimFilePath); + explicit Reader(int fd); ~Reader() = default; /** diff --git a/src/reader.cpp b/src/reader.cpp index 173dbbb93..51bdaf28d 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -86,6 +86,15 @@ Reader::Reader(const string zimFilePath) srand(time(nullptr)); } +Reader::Reader(int fd) + : zimArchive(new zim::Archive(fd)), + zimFilePath("") +{ + + /* initialize random seed: */ + srand(time(nullptr)); +} + zim::Archive* Reader::getZimArchive() const { return zimArchive.get(); diff --git a/src/wrapper/java/kiwixreader.cpp b/src/wrapper/java/kiwixreader.cpp index e55d54f8d..e62eb3084 100644 --- a/src/wrapper/java/kiwixreader.cpp +++ b/src/wrapper/java/kiwixreader.cpp @@ -45,6 +45,35 @@ JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReader( } } +namespace +{ + +int jni2fd(const jobject& fdObj, JNIEnv* env) +{ + jclass class_fdesc = env->FindClass("java/io/FileDescriptor"); + jfieldID field_fd = env->GetFieldID(class_fdesc, "fd", "I"); + return env->GetIntField(fdObj, field_fd); +} + +} // unnamed namespace + +JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderByFD( + JNIEnv* env, jobject obj, jobject fdObj) +{ + int fd = jni2fd(fdObj, env); + + LOG("Attempting to create reader with fd: %d", fd); + Lock l; + try { + kiwix::Reader* reader = new kiwix::Reader(fd); + return reinterpret_cast(new Handle(reader)); + } catch (std::exception& e) { + LOG("Error opening ZIM file"); + LOG(e.what()); + return 0; + } +} + JNIEXPORT void JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_dispose(JNIEnv* env, jobject obj) { diff --git a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java index f94c3dc6f..fe5e39e6c 100644 --- a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java +++ b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java @@ -25,6 +25,7 @@ import org.kiwix.kiwixlib.JNIKiwixString; import org.kiwix.kiwixlib.JNIKiwixInt; import org.kiwix.kiwixlib.JNIKiwixSearcher; import org.kiwix.kiwixlib.Pair; +import java.io.FileDescriptor; public class JNIKiwixReader { @@ -151,11 +152,21 @@ public class JNIKiwixReader throw new JNIKiwixException("Cannot open zimfile "+filename); } } + + public JNIKiwixReader(FileDescriptor fd) throws JNIKiwixException + { + nativeHandle = getNativeReaderByFD(fd); + if (nativeHandle == 0) { + throw new JNIKiwixException("Cannot open zimfile by fd "+fd.toString()); + } + } + public JNIKiwixReader() { } public native void dispose(); private native long getNativeReader(String filename); + private native long getNativeReaderByFD(FileDescriptor fd); private long nativeHandle; } diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index cc0879fda..c0eb7f044 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -41,6 +41,24 @@ throws JNIKiwixException, IOException } +@Test +public void testReaderByFd() +throws JNIKiwixException, IOException +{ + FileInputStream fis = new FileInputStream("small.zim"); + JNIKiwixReader reader = new JNIKiwixReader(fis.getFD()); + assertEquals("Test ZIM file", reader.getTitle()); + assertEquals(45, reader.getFileSize()); // The file size is in KiB + assertEquals("A/main.html", reader.getMainPage()); + String s = getFileContent("small_zimfile_data/main.html"); + byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertEquals(s, new String(c)); + +} + @Test public void testLibrary() throws IOException From 9cdf7a44c025a3e5e1f62be44857448a4ed17133 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Mon, 30 Nov 2020 00:05:22 +0400 Subject: [PATCH 05/10] JNIKiwixReader can open an embedded ZIM archive --- include/reader.h | 1 + src/reader.cpp | 7 +++++++ src/wrapper/java/kiwixreader.cpp | 17 +++++++++++++++++ .../org/kiwix/kiwixlib/JNIKiwixReader.java | 10 ++++++++++ src/wrapper/java/org/kiwix/testing/test.java | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+) diff --git a/include/reader.h b/include/reader.h index 263617c9d..cbeaaad2a 100644 --- a/include/reader.h +++ b/include/reader.h @@ -57,6 +57,7 @@ class Reader */ explicit Reader(const string zimFilePath); explicit Reader(int fd); + Reader(int fd, zim::offset_type offset, zim::size_type size); ~Reader() = default; /** diff --git a/src/reader.cpp b/src/reader.cpp index 51bdaf28d..0278b5033 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -90,7 +90,14 @@ Reader::Reader(int fd) : zimArchive(new zim::Archive(fd)), zimFilePath("") { + /* initialize random seed: */ + srand(time(nullptr)); +} +Reader::Reader(int fd, zim::offset_type offset, zim::size_type size) + : zimArchive(new zim::Archive(fd, offset, size)), + zimFilePath("") +{ /* initialize random seed: */ srand(time(nullptr)); } diff --git a/src/wrapper/java/kiwixreader.cpp b/src/wrapper/java/kiwixreader.cpp index e62eb3084..c3f06ecc5 100644 --- a/src/wrapper/java/kiwixreader.cpp +++ b/src/wrapper/java/kiwixreader.cpp @@ -74,6 +74,23 @@ JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderBy } } +JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderEmbedded( + JNIEnv* env, jobject obj, jobject fdObj, jlong offset, jlong size) +{ + int fd = jni2fd(fdObj, env); + + LOG("Attempting to create reader with fd: %d", fd); + Lock l; + try { + kiwix::Reader* reader = new kiwix::Reader(fd, offset, size); + return reinterpret_cast(new Handle(reader)); + } catch (std::exception& e) { + LOG("Error opening ZIM file"); + LOG(e.what()); + return 0; + } +} + JNIEXPORT void JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_dispose(JNIEnv* env, jobject obj) { diff --git a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java index fe5e39e6c..94b7b39ff 100644 --- a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java +++ b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java @@ -161,6 +161,15 @@ public class JNIKiwixReader } } + public JNIKiwixReader(FileDescriptor fd, long offset, long size) + throws JNIKiwixException + { + nativeHandle = getNativeReaderEmbedded(fd, offset, size); + if (nativeHandle == 0) { + throw new JNIKiwixException(String.format("Cannot open embedded zimfile (fd=%s, offset=%d, size=%d)", fd, offset, size)); + } + } + public JNIKiwixReader() { } @@ -168,5 +177,6 @@ public class JNIKiwixReader private native long getNativeReader(String filename); private native long getNativeReaderByFD(FileDescriptor fd); + private native long getNativeReaderEmbedded(FileDescriptor fd, long offset, long size); private long nativeHandle; } diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index c0eb7f044..594a5e0bf 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -59,6 +59,25 @@ throws JNIKiwixException, IOException } +@Test +public void testReaderWithAnEmbeddedArchive() +throws JNIKiwixException, IOException +{ + File plainArchive = new File("small.zim"); + FileInputStream fis = new FileInputStream("small.zim.embedded"); + JNIKiwixReader reader = new JNIKiwixReader(fis.getFD(), 8, plainArchive.length()); + assertEquals("Test ZIM file", reader.getTitle()); + assertEquals(45, reader.getFileSize()); // The file size is in KiB + assertEquals("A/main.html", reader.getMainPage()); + String s = getFileContent("small_zimfile_data/main.html"); + byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertEquals(s, new String(c)); + +} + @Test public void testLibrary() throws IOException From e028bcbb04767ece227659a3877ea1aa45052c14 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 6 Dec 2020 00:12:52 +0400 Subject: [PATCH 06/10] Android's java.io.FileDescriptor is different --- src/wrapper/java/kiwixreader.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wrapper/java/kiwixreader.cpp b/src/wrapper/java/kiwixreader.cpp index c3f06ecc5..df32595ed 100644 --- a/src/wrapper/java/kiwixreader.cpp +++ b/src/wrapper/java/kiwixreader.cpp @@ -52,6 +52,14 @@ int jni2fd(const jobject& fdObj, JNIEnv* env) { jclass class_fdesc = env->FindClass("java/io/FileDescriptor"); jfieldID field_fd = env->GetFieldID(class_fdesc, "fd", "I"); + if ( field_fd == NULL ) + { + env->ExceptionClear(); + // Under Android the (private) 'fd' field of java.io.FileDescriptor has been + // renamed to 'descriptor'. See, for example, + // https://android.googlesource.com/platform/libcore/+/refs/tags/android-8.1.0_r1/ojluni/src/main/java/java/io/FileDescriptor.java#55 + field_fd = env->GetFieldID(class_fdesc, "descriptor", "I"); + } return env->GetIntField(fdObj, field_fd); } From 5a99634dfd2bc5bd3eaa4cf74517ee187ac33f73 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Mon, 7 Dec 2020 22:45:09 +0400 Subject: [PATCH 07/10] Java wrapper test checks favicon.png too --- src/wrapper/java/org/kiwix/testing/test.java | 53 ++++++++++++++------ 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index 594a5e0bf..0ab2d3959 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -10,18 +10,22 @@ static { System.loadLibrary("kiwix"); } -private static String getFileContent(String path) +private static byte[] getFileContent(String path) throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(path)); - String line; - StringBuilder sb = new StringBuilder(); - while ((line = reader.readLine()) != null) - { - sb.append(line + "\n"); - } - reader.close(); - return sb.toString(); + File file = new File(path); + DataInputStream in = new DataInputStream( + new BufferedInputStream( + new FileInputStream(file))); + byte[] data = new byte[(int)file.length()]; + in.read(data); + return data; +} + +private static String getTextFileContent(String path) +throws IOException +{ + return new String(getFileContent(path)); } @Test @@ -32,13 +36,20 @@ throws JNIKiwixException, IOException assertEquals("Test ZIM file", reader.getTitle()); assertEquals(45, reader.getFileSize()); // The file size is in KiB assertEquals("A/main.html", reader.getMainPage()); - String s = getFileContent("small_zimfile_data/main.html"); + String s = getTextFileContent("small_zimfile_data/main.html"); byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), new JNIKiwixString(), new JNIKiwixString(), new JNIKiwixInt()); assertEquals(s, new String(c)); + byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); + assertEquals(faviconData.length, reader.getArticleSize("I/favicon.png")); + c = reader.getContent(new JNIKiwixString("I/favicon.png"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertTrue(Arrays.equals(faviconData, c)); } @Test @@ -50,13 +61,20 @@ throws JNIKiwixException, IOException assertEquals("Test ZIM file", reader.getTitle()); assertEquals(45, reader.getFileSize()); // The file size is in KiB assertEquals("A/main.html", reader.getMainPage()); - String s = getFileContent("small_zimfile_data/main.html"); + String s = getTextFileContent("small_zimfile_data/main.html"); byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), new JNIKiwixString(), new JNIKiwixString(), new JNIKiwixInt()); assertEquals(s, new String(c)); + byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); + assertEquals(faviconData.length, reader.getArticleSize("I/favicon.png")); + c = reader.getContent(new JNIKiwixString("I/favicon.png"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertTrue(Arrays.equals(faviconData, c)); } @Test @@ -69,13 +87,20 @@ throws JNIKiwixException, IOException assertEquals("Test ZIM file", reader.getTitle()); assertEquals(45, reader.getFileSize()); // The file size is in KiB assertEquals("A/main.html", reader.getMainPage()); - String s = getFileContent("small_zimfile_data/main.html"); + String s = getTextFileContent("small_zimfile_data/main.html"); byte[] c = reader.getContent(new JNIKiwixString("A/main.html"), new JNIKiwixString(), new JNIKiwixString(), new JNIKiwixInt()); assertEquals(s, new String(c)); + byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); + assertEquals(faviconData.length, reader.getArticleSize("I/favicon.png")); + c = reader.getContent(new JNIKiwixString("I/favicon.png"), + new JNIKiwixString(), + new JNIKiwixString(), + new JNIKiwixInt()); + assertTrue(Arrays.equals(faviconData, c)); } @Test @@ -84,7 +109,7 @@ throws IOException { Library lib = new Library(); Manager manager = new Manager(lib); - String content = getFileContent("catalog.xml"); + String content = getTextFileContent("catalog.xml"); manager.readOpds(content, "http://localhost"); assertEquals(lib.getBookCount(true, true), 1); String[] bookIds = lib.getBooksIds(); From 7a465e66d77ae78f81a3595288ed7f31b53c9f18 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Mon, 7 Dec 2020 23:10:07 +0400 Subject: [PATCH 08/10] Renamed org.kiwix.kiwixlib.{Pair->DirectAccessInfo} --- src/wrapper/java/kiwixreader.cpp | 12 ++++++------ src/wrapper/java/meson.build | 2 +- .../kiwixlib/{Pair.java => DirectAccessInfo.java} | 2 +- .../java/org/kiwix/kiwixlib/JNIKiwixReader.java | 6 +++--- src/wrapper/java/utils.h | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) rename src/wrapper/java/org/kiwix/kiwixlib/{Pair.java => DirectAccessInfo.java} (96%) diff --git a/src/wrapper/java/kiwixreader.cpp b/src/wrapper/java/kiwixreader.cpp index df32595ed..b7f968822 100644 --- a/src/wrapper/java/kiwixreader.cpp +++ b/src/wrapper/java/kiwixreader.cpp @@ -379,22 +379,22 @@ JNIEXPORT jobject JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getDirectAccessInformation( JNIEnv* env, jobject obj, jstring url) { - jclass classPair = env->FindClass("org/kiwix/kiwixlib/Pair"); - jmethodID midPairinit = env->GetMethodID(classPair, "", "()V"); - jobject pair = env->NewObject(classPair, midPairinit); - setPairObjValue("", 0, pair, env); + jclass daiClass = env->FindClass("org/kiwix/kiwixlib/DirectAccessInfo"); + jmethodID daiInitMethod = env->GetMethodID(daiClass, "", "()V"); + jobject dai = env->NewObject(daiClass, daiInitMethod); + setDaiObjValue("", 0, dai, env); std::string cUrl = jni2c(url, env); try { auto entry = READER->getEntryFromEncodedPath(cUrl); entry = entry.getFinalEntry(); auto part_info = entry.getDirectAccessInfo(); - setPairObjValue(part_info.first, part_info.second, pair, env); + setDaiObjValue(part_info.first, part_info.second, dai, env); } catch (std::exception& e) { LOG("Unable to get direct access info for url: %s", cUrl.c_str()); LOG(e.what()); } - return pair; + return dai; } JNIEXPORT jboolean JNICALL diff --git a/src/wrapper/java/meson.build b/src/wrapper/java/meson.build index 034173045..de72e49b3 100644 --- a/src/wrapper/java/meson.build +++ b/src/wrapper/java/meson.build @@ -12,7 +12,7 @@ java_sources = files([ 'org/kiwix/kiwixlib/JNIKiwixString.java', 'org/kiwix/kiwixlib/JNIKiwixBool.java', 'org/kiwix/kiwixlib/JNIKiwixException.java', - 'org/kiwix/kiwixlib/Pair.java' + 'org/kiwix/kiwixlib/DirectAccessInfo.java' ]) kiwix_jni = custom_target('jni', diff --git a/src/wrapper/java/org/kiwix/kiwixlib/Pair.java b/src/wrapper/java/org/kiwix/kiwixlib/DirectAccessInfo.java similarity index 96% rename from src/wrapper/java/org/kiwix/kiwixlib/Pair.java rename to src/wrapper/java/org/kiwix/kiwixlib/DirectAccessInfo.java index 05aacb678..4ba137dc4 100644 --- a/src/wrapper/java/org/kiwix/kiwixlib/Pair.java +++ b/src/wrapper/java/org/kiwix/kiwixlib/DirectAccessInfo.java @@ -19,7 +19,7 @@ package org.kiwix.kiwixlib; -public class Pair +public class DirectAccessInfo { public String filename; public long offset; diff --git a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java index 94b7b39ff..e11d72190 100644 --- a/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java +++ b/src/wrapper/java/org/kiwix/kiwixlib/JNIKiwixReader.java @@ -24,7 +24,7 @@ import org.kiwix.kiwixlib.JNIKiwixException; import org.kiwix.kiwixlib.JNIKiwixString; import org.kiwix.kiwixlib.JNIKiwixInt; import org.kiwix.kiwixlib.JNIKiwixSearcher; -import org.kiwix.kiwixlib.Pair; +import org.kiwix.kiwixlib.DirectAccessInfo; import java.io.FileDescriptor; public class JNIKiwixReader @@ -103,13 +103,13 @@ public class JNIKiwixReader * the zim file (or zim part) and directly read the content from it (and so * bypassing the libzim). * - * Return a `Pair` (filename, offset) where the content is located. + * Return a `DirectAccessInfo` (filename, offset) where the content is located. * * If the content cannot be directly accessed (content is compressed or zim * file is cut in the middle of the content), the filename is an empty string * and offset is zero. */ - public native Pair getDirectAccessInformation(String url); + public native DirectAccessInfo getDirectAccessInformation(String url); public native boolean searchSuggestions(String prefix, int count); diff --git a/src/wrapper/java/utils.h b/src/wrapper/java/utils.h index 00b5855a5..232071d54 100644 --- a/src/wrapper/java/utils.h +++ b/src/wrapper/java/utils.h @@ -246,7 +246,7 @@ inline void setBoolObjValue(const bool value, const jobject obj, JNIEnv* env) env->SetIntField(obj, objFid, c2jni(value, env)); } -inline void setPairObjValue(const std::string& filename, const long offset, +inline void setDaiObjValue(const std::string& filename, const long offset, const jobject obj, JNIEnv* env) { jclass objClass = env->GetObjectClass(obj); From 5a8b825c7032dabcd0aef040fdf0e106ad9b4a82 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Mon, 7 Dec 2020 23:11:19 +0400 Subject: [PATCH 09/10] Testing of JNIKiwixReader.getDirectAccessInformation() --- include/entry.h | 2 +- src/wrapper/java/org/kiwix/testing/test.java | 28 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/entry.h b/include/entry.h index e2edf0a9a..c3a01521c 100644 --- a/include/entry.h +++ b/include/entry.h @@ -111,7 +111,7 @@ class Entry * The offset is the offset to read in the file. * Return <"",0> if is not possible to read directly. */ - std::pair getDirectAccessInfo() const { return entry.getItem().getDirectAccessInformation(); } + zim::Item::DirectAccessInfo getDirectAccessInfo() const { return entry.getItem().getDirectAccessInformation(); } /** * Get the size of the entry. diff --git a/src/wrapper/java/org/kiwix/testing/test.java b/src/wrapper/java/org/kiwix/testing/test.java index 0ab2d3959..788729d12 100644 --- a/src/wrapper/java/org/kiwix/testing/test.java +++ b/src/wrapper/java/org/kiwix/testing/test.java @@ -22,6 +22,19 @@ throws IOException return data; } +private static byte[] getFileContentPartial(String path, int offset, int size) +throws IOException +{ + File file = new File(path); + DataInputStream in = new DataInputStream( + new BufferedInputStream( + new FileInputStream(file))); + byte[] data = new byte[size]; + in.skipBytes(offset); + in.read(data, 0, size); + return data; +} + private static String getTextFileContent(String path) throws IOException { @@ -50,6 +63,11 @@ throws JNIKiwixException, IOException new JNIKiwixString(), new JNIKiwixInt()); assertTrue(Arrays.equals(faviconData, c)); + + DirectAccessInfo dai = reader.getDirectAccessInformation("I/favicon.png"); + assertNotEquals("", dai.filename); + c = getFileContentPartial(dai.filename, (int)dai.offset, faviconData.length); + assertTrue(Arrays.equals(faviconData, c)); } @Test @@ -75,6 +93,11 @@ throws JNIKiwixException, IOException new JNIKiwixString(), new JNIKiwixInt()); assertTrue(Arrays.equals(faviconData, c)); + + DirectAccessInfo dai = reader.getDirectAccessInformation("I/favicon.png"); + assertNotEquals("", dai.filename); + c = getFileContentPartial(dai.filename, (int)dai.offset, faviconData.length); + assertTrue(Arrays.equals(faviconData, c)); } @Test @@ -101,6 +124,11 @@ throws JNIKiwixException, IOException new JNIKiwixString(), new JNIKiwixInt()); assertTrue(Arrays.equals(faviconData, c)); + + DirectAccessInfo dai = reader.getDirectAccessInformation("I/favicon.png"); + assertNotEquals("", dai.filename); + c = getFileContentPartial(dai.filename, (int)dai.offset, faviconData.length); + assertTrue(Arrays.equals(faviconData, c)); } @Test From 839fc10a4f44749a85d0b1a564dc7c515f5b7746 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 7 Feb 2021 14:41:23 +0400 Subject: [PATCH 10/10] Fixed the Windows build Opening ZIM archives by file descriptor (as well as embedded ZIM archives) is not supported under Windows. --- include/reader.h | 2 ++ src/reader.cpp | 2 ++ src/wrapper/java/kiwixreader.cpp | 12 ++++++++++++ 3 files changed, 16 insertions(+) diff --git a/include/reader.h b/include/reader.h index cbeaaad2a..94c108f9d 100644 --- a/include/reader.h +++ b/include/reader.h @@ -56,8 +56,10 @@ class Reader * (.zim extesion). */ explicit Reader(const string zimFilePath); +#ifndef _WIN32 explicit Reader(int fd); Reader(int fd, zim::offset_type offset, zim::size_type size); +#endif ~Reader() = default; /** diff --git a/src/reader.cpp b/src/reader.cpp index 0278b5033..523c1f766 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -86,6 +86,7 @@ Reader::Reader(const string zimFilePath) srand(time(nullptr)); } +#ifndef _WIN32 Reader::Reader(int fd) : zimArchive(new zim::Archive(fd)), zimFilePath("") @@ -101,6 +102,7 @@ Reader::Reader(int fd, zim::offset_type offset, zim::size_type size) /* initialize random seed: */ srand(time(nullptr)); } +#endif // #ifndef _WIN32 zim::Archive* Reader::getZimArchive() const { diff --git a/src/wrapper/java/kiwixreader.cpp b/src/wrapper/java/kiwixreader.cpp index b7f968822..cc3c27706 100644 --- a/src/wrapper/java/kiwixreader.cpp +++ b/src/wrapper/java/kiwixreader.cpp @@ -68,6 +68,7 @@ int jni2fd(const jobject& fdObj, JNIEnv* env) JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderByFD( JNIEnv* env, jobject obj, jobject fdObj) { +#ifndef _WIN32 int fd = jni2fd(fdObj, env); LOG("Attempting to create reader with fd: %d", fd); @@ -80,11 +81,17 @@ JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderBy LOG(e.what()); return 0; } +#else + jclass exception = env->FindClass("java/lang/UnsupportedOperationException"); + env->ThrowNew(exception, "org.kiwix.kiwixlib.JNIKiwixReader.getNativeReaderByFD() is not supported under Windows"); + return 0; +#endif } JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderEmbedded( JNIEnv* env, jobject obj, jobject fdObj, jlong offset, jlong size) { +#ifndef _WIN32 int fd = jni2fd(fdObj, env); LOG("Attempting to create reader with fd: %d", fd); @@ -97,6 +104,11 @@ JNIEXPORT jlong JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_getNativeReaderEm LOG(e.what()); return 0; } +#else + jclass exception = env->FindClass("java/lang/UnsupportedOperationException"); + env->ThrowNew(exception, "org.kiwix.kiwixlib.JNIKiwixReader.getNativeReaderEmbedded() is not supported under Windows"); + return 0; +#endif } JNIEXPORT void JNICALL