From 2eb8aa50963c6fab6446996431439429ead45ba8 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Sat, 17 Feb 2024 11:36:34 +0100 Subject: [PATCH 1/2] Wrap new methods in `libkiwix::Bookmark`. - setBookName, getBookName - setBookFlavour, getBookFlavour --- lib/src/main/cpp/libkiwix/bookmark.cpp | 12 ++++++++++++ .../main/java/org/kiwix/libkiwix/Bookmark.java | 4 ++++ .../org/kiwix/test/libkiwix/TestBookmark.java | 4 ++++ lib/src/test/test.java | 16 ++++++++++------ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/src/main/cpp/libkiwix/bookmark.cpp b/lib/src/main/cpp/libkiwix/bookmark.cpp index fe61d18..146f90d 100644 --- a/lib/src/main/cpp/libkiwix/bookmark.cpp +++ b/lib/src/main/cpp/libkiwix/bookmark.cpp @@ -39,6 +39,10 @@ GETTER(jstring, getBookId) GETTER(jstring, getBookTitle) +GETTER(jstring, getBookName) + +GETTER(jstring, getBookFlavour) + GETTER(jstring, getUrl) GETTER(jstring, getTitle) @@ -55,6 +59,14 @@ METHOD(void, setBookTitle, jstring bookTitle) { THIS->setBookTitle(TO_C(bookTitle)); } CATCH_EXCEPTION() +METHOD(void, setBookName, jstring bookName) { + THIS->setBookName(TO_C(bookName)); +} CATCH_EXCEPTION() + +METHOD(void, setBookFlavour, jstring bookFlavour) { + THIS->setBookFlavour(TO_C(bookFlavour)); +} CATCH_EXCEPTION() + METHOD(void, setUrl, jstring url) { THIS->setUrl(TO_C(url)); } CATCH_EXCEPTION() diff --git a/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java b/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java index 936ab57..e6db70d 100644 --- a/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java +++ b/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java @@ -31,6 +31,8 @@ private Bookmark(long handle) { public native void setBookId(String bookId); public native void setBookTitle(String bookTitle); + public native void setBookName(String bookName); + public native void setBookFlavour(String bookFlavour); public native void setUrl(String url); public native void setTitle(String title); public native void setLanguage(String language); @@ -38,6 +40,8 @@ private Bookmark(long handle) { public native String getBookId(); public native String getBookTitle(); + public native String getBookName(); + public native String getBookFlavour(); public native String getUrl(); public native String getTitle(); public native String getLanguage(); diff --git a/lib/src/test/org/kiwix/test/libkiwix/TestBookmark.java b/lib/src/test/org/kiwix/test/libkiwix/TestBookmark.java index ed71704..5b911d5 100644 --- a/lib/src/test/org/kiwix/test/libkiwix/TestBookmark.java +++ b/lib/src/test/org/kiwix/test/libkiwix/TestBookmark.java @@ -30,6 +30,8 @@ public class TestBookmark public void setBookId(String bookId) { inner.setBookId(bookId); } public void setBookTitle(String bookTitle) { inner.setBookTitle(bookTitle); } + public void setBookName(String bookName) { inner.setBookName(bookName); } + public void setBookFlavour(String bookFlavour) { inner.setBookFlavour(bookFlavour); } public void setUrl(String url) { inner.setUrl(url); } public void setTitle(String title) { inner.setTitle(title); } public void setLanguage(String language) { inner.setLanguage(language); } @@ -37,6 +39,8 @@ public class TestBookmark public String getBookId() { return inner.getBookId(); } public String getBookTitle() { return inner.getBookTitle(); } + public String getBookName() { return inner.getBookName(); } + public String getBookFlavour() { return inner.getBookFlavour(); } public String getUrl() { return inner.getUrl(); } public String getTitle() { return inner.getTitle(); } public String getLanguage() { return inner.getLanguage(); } diff --git a/lib/src/test/test.java b/lib/src/test/test.java index c5c8705..7567971 100644 --- a/lib/src/test/test.java +++ b/lib/src/test/test.java @@ -463,11 +463,13 @@ public void testBookMark() throws ZimFileFormatException, JNIKiwixException { lib.addBook(book); TestBookmark bookmark = new TestBookmark(); bookmark.setBookId(book.getId()); - bookmark.setTitle(book.getTitle()); - bookmark.setUrl(book.getUrl()); + bookmark.setTitle("A title for an article"); + bookmark.setUrl("foo/bar.html"); bookmark.setLanguage(book.getLanguage()); bookmark.setDate(book.getDate()); - bookmark.setBookTitle(book.getName()); + bookmark.setBookTitle(book.getTitle()); + bookmark.setBookName(book.getName()); + bookmark.setBookFlavour(book.getFlavour()); // add bookmark to library lib.addBookmark(bookmark); TestBookmark[] bookmarkArray = lib.getBookmarks(true); @@ -475,11 +477,13 @@ public void testBookMark() throws ZimFileFormatException, JNIKiwixException { bookmark = bookmarkArray[0]; // test saved bookmark assertEquals(bookmark.getBookId(), book.getId()); - assertEquals(bookmark.getTitle(), book.getTitle()); - assertEquals(bookmark.getUrl(), book.getUrl()); + assertEquals(bookmark.getTitle(), "A title for an article"); + assertEquals(bookmark.getUrl(), "foo/bar.html"); assertEquals(bookmark.getLanguage(), book.getLanguage()); assertEquals(bookmark.getDate(), book.getDate()); - assertEquals(bookmark.getBookTitle(), book.getName()); + assertEquals(bookmark.getBookTitle(), book.getTitle()); + assertEquals(bookmark.getBookName(), book.getName()); + assertEquals(bookmark.getBookFlavour(), book.getFlavour()); // remove bookmark from library lib.removeBookmark(bookmark.getBookId(), bookmark.getUrl()); bookmarkArray = lib.getBookmarks(true); From fa44690eb7a973db0dd0c75ae9ecb25233a1f35f Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Mon, 26 Feb 2024 13:46:40 +0100 Subject: [PATCH 2/2] Wrap new methods in `kiwix::Library`. - migrateBookmarks - getBestTargetBookId --- lib/build.gradle | 1 + lib/src/main/cpp/libkiwix/library.cpp | 33 +++++++++++++++++++ lib/src/main/cpp/utils.h | 9 +++++ .../libkiwix/BookmarkMigrationResult.java | 26 +++++++++++++++ .../main/java/org/kiwix/libkiwix/Library.java | 13 ++++++++ .../org/kiwix/test/libkiwix/TestLibrary.java | 9 +++++ lib/src/test/test.java | 15 ++++++++- 7 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 lib/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java diff --git a/lib/build.gradle b/lib/build.gradle index 3ce3d97..a44f8b3 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -328,6 +328,7 @@ task buildHeaders(type: Exec) { String getLibkiwixFiles() { return "${projectDir}/src/main/java/org/kiwix/libkiwix/Book.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/Bookmark.java " + + "${projectDir}/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/Filter.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/JNIICU.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/Illustration.java " + diff --git a/lib/src/main/cpp/libkiwix/library.cpp b/lib/src/main/cpp/libkiwix/library.cpp index 20dc842..6c74561 100644 --- a/lib/src/main/cpp/libkiwix/library.cpp +++ b/lib/src/main/cpp/libkiwix/library.cpp @@ -91,6 +91,27 @@ METHOD(jboolean, removeBookmark, jstring zimId, jstring url) { return TO_JNI(THIS->removeBookmark(TO_C(zimId), TO_C(url))); } CATCH_EXCEPTION(false) +METHOD(jobject, migrateBookmarks__Z, jboolean allowDowngrade) { + jobject migrationResult = newObject("org/kiwix/libkiwix/BookmarkMigrationResult", env); + int nbMigrated, nbTotal; + std::tie(nbMigrated, nbTotal) = THIS->migrateBookmarks( + TO_C(allowDowngrade) ? kiwix::ALLOW_DOWNGRADE : kiwix::UPGRADE_ONLY + ); + setMigrationResultValue(nbMigrated, nbTotal, migrationResult, env); + return migrationResult; +} CATCH_EXCEPTION(nullptr) + +METHOD(jint, migrateBookmarks__Ljava_lang_String_2Z, jstring sourceBookId, jboolean allowDowngrade) { + return TO_JNI(THIS->migrateBookmarks( + TO_C(sourceBookId), + allowDowngrade? kiwix::ALLOW_DOWNGRADE : kiwix::UPGRADE_ONLY + )); +} CATCH_EXCEPTION(0) + +METHOD(jint, migrateBookmarks__Ljava_lang_String_2Ljava_lang_String_2, jstring sourceBookId, jstring targetBookId) { + return TO_JNI(THIS->migrateBookmarks(TO_C(sourceBookId), TO_C(targetBookId))); +} CATCH_EXCEPTION(0) + METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) { auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks)); jobjectArray retArray = createArray(env, bookmarks.size(), "org/kiwix/libkiwix/Bookmark"); @@ -108,3 +129,15 @@ METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) { } return retArray; } CATCH_EXCEPTION(nullptr) + +METHOD(jstring, getBestTargetBookId__Lorg_kiwix_libkiwix_Bookmark_2Z, jobject bookmark, jboolean allowDowngrade) { + auto cBookmark = getPtr(env, bookmark); + return TO_JNI(THIS->getBestTargetBookId( + *cBookmark, + allowDowngrade ? kiwix::ALLOW_DOWNGRADE : kiwix::UPGRADE_ONLY + )); +} CATCH_EXCEPTION(nullptr) + +METHOD(jstring, getBestTargetBookId__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2, jstring bookName, jstring preferedFlavour, jstring minDate) { + return TO_JNI(THIS->getBestTargetBookId(TO_C(bookName), TO_C(preferedFlavour), TO_C(minDate))); +} CATCH_EXCEPTION(nullptr) diff --git a/lib/src/main/cpp/utils.h b/lib/src/main/cpp/utils.h index f2c9e60..9324adf 100644 --- a/lib/src/main/cpp/utils.h +++ b/lib/src/main/cpp/utils.h @@ -401,6 +401,15 @@ inline void setDaiObjValue(const std::string& filename, const long offset, env->SetLongField(obj, offsetFid, offset); } +inline void setMigrationResultValue(long nbMigrated, long nbTotalInvalid, const jobject obj, JNIEnv* env) +{ + jclass objClass = env->GetObjectClass(obj); + jfieldID nbMigratedFid = env->GetFieldID(objClass, "nbMigratedBookmarks", "J"); + env->SetLongField(obj, nbMigratedFid, nbMigrated); + jfieldID nbTotalFid = env->GetFieldID(objClass, "nbInvalidBookmarks", "J"); + env->SetLongField(obj, nbTotalFid, nbTotalInvalid); +} + inline int throwException(JNIEnv* env, const char* exception, const char* message) { return env->ThrowNew(env->FindClass(exception), message); } diff --git a/lib/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java b/lib/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java new file mode 100644 index 0000000..c87a823 --- /dev/null +++ b/lib/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 Matthieu Gautier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package org.kiwix.libkiwix; + +public class BookmarkMigrationResult +{ + public long nbMigratedBookmarks; + public long nbInvalidBookmarks; +} diff --git a/lib/src/main/java/org/kiwix/libkiwix/Library.java b/lib/src/main/java/org/kiwix/libkiwix/Library.java index e9f4c47..150f572 100644 --- a/lib/src/main/java/org/kiwix/libkiwix/Library.java +++ b/lib/src/main/java/org/kiwix/libkiwix/Library.java @@ -24,6 +24,7 @@ import org.kiwix.libkiwix.Book; import org.kiwix.libkiwix.JNIKiwixException; import org.kiwix.libkiwix.Bookmark; +import org.kiwix.libkiwix.BookmarkMigrationResult; public class Library { @@ -56,8 +57,20 @@ public Library() public native void addBookmark(Bookmark bookmark); public native boolean removeBookmark(String zimId, String url); + public native BookmarkMigrationResult migrateBookmarks(boolean allowDowngrade); + public native int migrateBookmarks(String sourceBookId, boolean allowDowngrade); + public native int migrateBookmarks(String sourceBookId, String targetBookId); public native Bookmark[] getBookmarks(boolean onlyValidBookmarks); + public native String getBestTargetBookId(Bookmark bookmark, boolean allowDowngrade); + public String getBestTargetBookId(String bookName) { + return getBestTargetBookId(bookName, "", ""); + } + public String getBestTargetBookId(String bookName, String preferedFlavour) { + return getBestTargetBookId(bookName, preferedFlavour, ""); + } + public native String getBestTargetBookId(String bookName, String preferedFlavour, String minDate); + @Override protected void finalize() { dispose(); } private native void setNativeHandler(); diff --git a/lib/src/test/org/kiwix/test/libkiwix/TestLibrary.java b/lib/src/test/org/kiwix/test/libkiwix/TestLibrary.java index 3402354..d5ce4cc 100644 --- a/lib/src/test/org/kiwix/test/libkiwix/TestLibrary.java +++ b/lib/src/test/org/kiwix/test/libkiwix/TestLibrary.java @@ -25,6 +25,7 @@ import org.kiwix.libzim.Searcher; import org.kiwix.libkiwix.Filter; import org.kiwix.libkiwix.JNIKiwixException; +import org.kiwix.libkiwix.BookmarkMigrationResult; import java.util.stream.Stream; public class TestLibrary @@ -58,5 +59,13 @@ public class TestLibrary public void addBookmark(TestBookmark bookmark) { inner.addBookmark(bookmark.inner()); } public boolean removeBookmark(String zimId, String url) { return inner.removeBookmark(zimId, url); } + public BookmarkMigrationResult migrateBookmarks(boolean allowDowngrade) { return inner.migrateBookmarks(allowDowngrade); } + public int migrateBookmarks(String sourceBookId, boolean allowDowngrade) { return inner.migrateBookmarks(sourceBookId, allowDowngrade); } + public int migrateBookmarks(String sourceBookId, String targetBookId) { return inner.migrateBookmarks(sourceBookId, targetBookId); } public TestBookmark[] getBookmarks(boolean onlyValidBookmarks) { return Stream.of(inner.getBookmarks(onlyValidBookmarks)).map(b -> new TestBookmark(b)).toArray(TestBookmark[]::new); } + + public String getBestTargetBookId(TestBookmark bookmark, boolean allowDowngrade) { return inner.getBestTargetBookId(bookmark.inner(), allowDowngrade); } + public String getBestTargetBookId(String bookname) { return inner.getBestTargetBookId(bookname); } + public String getBestTargetBookId(String bookname, String preferedFlavour) { return inner.getBestTargetBookId(bookname, preferedFlavour); } + public String getBestTargetBookId(String bookname, String preferedFlavour, String minDate) { return inner.getBestTargetBookId(bookname, preferedFlavour, minDate); } } diff --git a/lib/src/test/test.java b/lib/src/test/test.java index 7567971..458882f 100644 --- a/lib/src/test/test.java +++ b/lib/src/test/test.java @@ -484,8 +484,21 @@ public void testBookMark() throws ZimFileFormatException, JNIKiwixException { assertEquals(bookmark.getBookTitle(), book.getTitle()); assertEquals(bookmark.getBookName(), book.getName()); assertEquals(bookmark.getBookFlavour(), book.getFlavour()); + + BookmarkMigrationResult result = lib.migrateBookmarks(true); + assertEquals(result.nbMigratedBookmarks, 0); + assertEquals(result.nbInvalidBookmarks, 0); + + assertEquals(lib.migrateBookmarks(book.getId(), true), 0); + assertEquals(lib.migrateBookmarks(book.getId(), "new-id"), 1); + + assertEquals(lib.getBestTargetBookId(bookmark, true), book.getId()); + assertEquals(lib.getBestTargetBookId(book.getName()), book.getId()); + assertEquals(lib.getBestTargetBookId(book.getName(), "someflavour"), book.getId()); + assertEquals(lib.getBestTargetBookId(book.getName(), "someflavour", "20230105"), ""); + assertEquals(lib.getBestTargetBookId(book.getName(), "someflavour", "20190105"), book.getId()); // remove bookmark from library - lib.removeBookmark(bookmark.getBookId(), bookmark.getUrl()); + lib.removeBookmark("new-id", bookmark.getUrl()); bookmarkArray = lib.getBookmarks(true); assertEquals(0, bookmarkArray.length); }