Merge pull request #85 from kiwix/bookmarks_migrations

This commit is contained in:
Matthieu Gautier 2024-02-26 13:51:40 +01:00 committed by GitHub
commit 0e6ef846d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 135 additions and 7 deletions

View File

@ -328,6 +328,7 @@ task buildHeaders(type: Exec) {
String getLibkiwixFiles() { String getLibkiwixFiles() {
return "${projectDir}/src/main/java/org/kiwix/libkiwix/Book.java " + 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/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/Filter.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/JNIICU.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/JNIICU.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/Illustration.java " + "${projectDir}/src/main/java/org/kiwix/libkiwix/Illustration.java " +

View File

@ -39,6 +39,10 @@ GETTER(jstring, getBookId)
GETTER(jstring, getBookTitle) GETTER(jstring, getBookTitle)
GETTER(jstring, getBookName)
GETTER(jstring, getBookFlavour)
GETTER(jstring, getUrl) GETTER(jstring, getUrl)
GETTER(jstring, getTitle) GETTER(jstring, getTitle)
@ -55,6 +59,14 @@ METHOD(void, setBookTitle, jstring bookTitle) {
THIS->setBookTitle(TO_C(bookTitle)); THIS->setBookTitle(TO_C(bookTitle));
} CATCH_EXCEPTION() } 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) { METHOD(void, setUrl, jstring url) {
THIS->setUrl(TO_C(url)); THIS->setUrl(TO_C(url));
} CATCH_EXCEPTION() } CATCH_EXCEPTION()

View File

@ -91,6 +91,27 @@ METHOD(jboolean, removeBookmark, jstring zimId, jstring url) {
return TO_JNI(THIS->removeBookmark(TO_C(zimId), TO_C(url))); return TO_JNI(THIS->removeBookmark(TO_C(zimId), TO_C(url)));
} CATCH_EXCEPTION(false) } 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) { METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) {
auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks)); auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks));
jobjectArray retArray = createArray(env, bookmarks.size(), "org/kiwix/libkiwix/Bookmark"); jobjectArray retArray = createArray(env, bookmarks.size(), "org/kiwix/libkiwix/Bookmark");
@ -108,3 +129,15 @@ METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) {
} }
return retArray; return retArray;
} CATCH_EXCEPTION(nullptr) } CATCH_EXCEPTION(nullptr)
METHOD(jstring, getBestTargetBookId__Lorg_kiwix_libkiwix_Bookmark_2Z, jobject bookmark, jboolean allowDowngrade) {
auto cBookmark = getPtr<kiwix::Bookmark>(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)

View File

@ -401,6 +401,15 @@ inline void setDaiObjValue(const std::string& filename, const long offset,
env->SetLongField(obj, offsetFid, 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) { inline int throwException(JNIEnv* env, const char* exception, const char* message) {
return env->ThrowNew(env->FindClass(exception), message); return env->ThrowNew(env->FindClass(exception), message);
} }

View File

@ -31,6 +31,8 @@ public class Bookmark
public native void setBookId(String bookId); public native void setBookId(String bookId);
public native void setBookTitle(String bookTitle); 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 setUrl(String url);
public native void setTitle(String title); public native void setTitle(String title);
public native void setLanguage(String language); public native void setLanguage(String language);
@ -38,6 +40,8 @@ public class Bookmark
public native String getBookId(); public native String getBookId();
public native String getBookTitle(); public native String getBookTitle();
public native String getBookName();
public native String getBookFlavour();
public native String getUrl(); public native String getUrl();
public native String getTitle(); public native String getTitle();
public native String getLanguage(); public native String getLanguage();

View File

@ -0,0 +1,26 @@
/*
* Copyright (C) 2024 Matthieu Gautier <mgautier@kymeria.fr>
*
* 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;
}

View File

@ -24,6 +24,7 @@ import org.kiwix.libzim.Searcher;
import org.kiwix.libkiwix.Book; import org.kiwix.libkiwix.Book;
import org.kiwix.libkiwix.JNIKiwixException; import org.kiwix.libkiwix.JNIKiwixException;
import org.kiwix.libkiwix.Bookmark; import org.kiwix.libkiwix.Bookmark;
import org.kiwix.libkiwix.BookmarkMigrationResult;
public class Library public class Library
{ {
@ -56,8 +57,20 @@ public class Library
public native void addBookmark(Bookmark bookmark); public native void addBookmark(Bookmark bookmark);
public native boolean removeBookmark(String zimId, String url); 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 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 @Override
protected void finalize() { dispose(); } protected void finalize() { dispose(); }
private native void setNativeHandler(); private native void setNativeHandler();

View File

@ -30,6 +30,8 @@ public class TestBookmark
public void setBookId(String bookId) { inner.setBookId(bookId); } public void setBookId(String bookId) { inner.setBookId(bookId); }
public void setBookTitle(String bookTitle) { inner.setBookTitle(bookTitle); } 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 setUrl(String url) { inner.setUrl(url); }
public void setTitle(String title) { inner.setTitle(title); } public void setTitle(String title) { inner.setTitle(title); }
public void setLanguage(String language) { inner.setLanguage(language); } public void setLanguage(String language) { inner.setLanguage(language); }
@ -37,6 +39,8 @@ public class TestBookmark
public String getBookId() { return inner.getBookId(); } public String getBookId() { return inner.getBookId(); }
public String getBookTitle() { return inner.getBookTitle(); } 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 getUrl() { return inner.getUrl(); }
public String getTitle() { return inner.getTitle(); } public String getTitle() { return inner.getTitle(); }
public String getLanguage() { return inner.getLanguage(); } public String getLanguage() { return inner.getLanguage(); }

View File

@ -25,6 +25,7 @@ import org.kiwix.test.libkiwix.TestBookmark;
import org.kiwix.libzim.Searcher; import org.kiwix.libzim.Searcher;
import org.kiwix.libkiwix.Filter; import org.kiwix.libkiwix.Filter;
import org.kiwix.libkiwix.JNIKiwixException; import org.kiwix.libkiwix.JNIKiwixException;
import org.kiwix.libkiwix.BookmarkMigrationResult;
import java.util.stream.Stream; import java.util.stream.Stream;
public class TestLibrary public class TestLibrary
@ -58,5 +59,13 @@ public class TestLibrary
public void addBookmark(TestBookmark bookmark) { inner.addBookmark(bookmark.inner()); } public void addBookmark(TestBookmark bookmark) { inner.addBookmark(bookmark.inner()); }
public boolean removeBookmark(String zimId, String url) { return inner.removeBookmark(zimId, url); } 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 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); }
} }

View File

@ -463,11 +463,13 @@ public class test {
lib.addBook(book); lib.addBook(book);
TestBookmark bookmark = new TestBookmark(); TestBookmark bookmark = new TestBookmark();
bookmark.setBookId(book.getId()); bookmark.setBookId(book.getId());
bookmark.setTitle(book.getTitle()); bookmark.setTitle("A title for an article");
bookmark.setUrl(book.getUrl()); bookmark.setUrl("foo/bar.html");
bookmark.setLanguage(book.getLanguage()); bookmark.setLanguage(book.getLanguage());
bookmark.setDate(book.getDate()); bookmark.setDate(book.getDate());
bookmark.setBookTitle(book.getName()); bookmark.setBookTitle(book.getTitle());
bookmark.setBookName(book.getName());
bookmark.setBookFlavour(book.getFlavour());
// add bookmark to library // add bookmark to library
lib.addBookmark(bookmark); lib.addBookmark(bookmark);
TestBookmark[] bookmarkArray = lib.getBookmarks(true); TestBookmark[] bookmarkArray = lib.getBookmarks(true);
@ -475,13 +477,28 @@ public class test {
bookmark = bookmarkArray[0]; bookmark = bookmarkArray[0];
// test saved bookmark // test saved bookmark
assertEquals(bookmark.getBookId(), book.getId()); assertEquals(bookmark.getBookId(), book.getId());
assertEquals(bookmark.getTitle(), book.getTitle()); assertEquals(bookmark.getTitle(), "A title for an article");
assertEquals(bookmark.getUrl(), book.getUrl()); assertEquals(bookmark.getUrl(), "foo/bar.html");
assertEquals(bookmark.getLanguage(), book.getLanguage()); assertEquals(bookmark.getLanguage(), book.getLanguage());
assertEquals(bookmark.getDate(), book.getDate()); 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());
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 // remove bookmark from library
lib.removeBookmark(bookmark.getBookId(), bookmark.getUrl()); lib.removeBookmark("new-id", bookmark.getUrl());
bookmarkArray = lib.getBookmarks(true); bookmarkArray = lib.getBookmarks(true);
assertEquals(0, bookmarkArray.length); assertEquals(0, bookmarkArray.length);
} }