Skip to content

Commit

Permalink
Merge pull request #85 from kiwix/bookmarks_migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
mgautierfr authored Feb 26, 2024
2 parents 1aeb144 + fa44690 commit 0e6ef84
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 7 deletions.
1 change: 1 addition & 0 deletions lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 " +
Expand Down
12 changes: 12 additions & 0 deletions lib/src/main/cpp/libkiwix/bookmark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ GETTER(jstring, getBookId)

GETTER(jstring, getBookTitle)

GETTER(jstring, getBookName)

GETTER(jstring, getBookFlavour)

GETTER(jstring, getUrl)

GETTER(jstring, getTitle)
Expand All @@ -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()
Expand Down
33 changes: 33 additions & 0 deletions lib/src/main/cpp/libkiwix/library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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<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)
9 changes: 9 additions & 0 deletions lib/src/main/cpp/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 4 additions & 0 deletions lib/src/main/java/org/kiwix/libkiwix/Bookmark.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,17 @@ 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);
public native void setDate(String Date);

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();
Expand Down
26 changes: 26 additions & 0 deletions lib/src/main/java/org/kiwix/libkiwix/BookmarkMigrationResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (C) 2024 Matthieu Gautier <[email protected]>
*
* 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;
}
13 changes: 13 additions & 0 deletions lib/src/main/java/org/kiwix/libkiwix/Library.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions lib/src/test/org/kiwix/test/libkiwix/TestBookmark.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,17 @@ 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); }
public void setDate(String date) { inner.setDate(date); }

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(); }
Expand Down
9 changes: 9 additions & 0 deletions lib/src/test/org/kiwix/test/libkiwix/TestLibrary.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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); }
}
31 changes: 24 additions & 7 deletions lib/src/test/test.java
Original file line number Diff line number Diff line change
Expand Up @@ -463,25 +463,42 @@ 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);
assertEquals(1, bookmarkArray.length);
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());

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);
}
Expand Down

0 comments on commit 0e6ef84

Please sign in to comment.