Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions checkstyle.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">

<module name="Checker">
<module name="TreeWalker">
<!-- Disable the NoFinalizerCheck so finalize() is allowed -->
<module name="NoFinalizer">
<property name="severity" value="ignore" />
</module>
</module>
</module>
3 changes: 2 additions & 1 deletion lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,8 @@ String getLibkiwixFiles() {
"${projectDir}/src/main/java/org/kiwix/libkiwix/JNIKiwixException.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/Library.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/Manager.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/Server.java"
"${projectDir}/src/main/java/org/kiwix/libkiwix/Server.java " +
"${projectDir}/src/main/java/org/kiwix/libkiwix/SpellingsDB.java"
}

String getLibzimFiles() {
Expand Down
1 change: 1 addition & 0 deletions lib/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ add_library(kiwix_wrapper
libkiwix/bookmark.cpp
libkiwix/manager.cpp
libkiwix/illustration.cpp
libkiwix/spellingdb.cpp
)

# Linux target
Expand Down
51 changes: 51 additions & 0 deletions lib/src/main/cpp/libkiwix/spellingdb.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright (C) 2025 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.
*/

#include <jni.h>
#include "org_kiwix_libkiwix_SpellingsDB.h"
#include "spelling_correction.h"
#include <zim/archive.h>
#include "utils.h"

#define NATIVE_TYPE kiwix::SpellingsDB
#define TYPENAME libkiwix_SpellingsDB

#include <macros.h>

METHOD(void, setNativeSpellingsDB, jobject archive, jstring cacheDirPath) {
auto archive1 = getPtr<zim::Archive>(env, archive);
std::string cPath = TO_C(cacheDirPath);

auto spellingsDB = std::make_shared<kiwix::SpellingsDB>(*archive1, cPath);
SET_PTR(spellingsDB);
} CATCH_EXCEPTION()

DISPOSE

METHOD(jobjectArray, getSpellingCorrections, jstring jWord, jint maxCount) {
auto results = THIS->getSpellingCorrections(TO_C(jWord), TO_C(maxCount));
jclass stringClass = env->FindClass("java/lang/String");
jobjectArray jArray = env->NewObjectArray(results.size(), stringClass, nullptr);

for (size_t i = 0; i < results.size(); ++i) {
env->SetObjectArrayElement(jArray, i, TO_JNI(results[i]));
}

return jArray;
} CATCH_EXCEPTION(nullptr)
21 changes: 21 additions & 0 deletions lib/src/main/java/org/kiwix/libkiwix/SpellingsDB.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.kiwix.libkiwix;

import org.kiwix.libzim.Archive;

public class SpellingsDB {
public SpellingsDB(Archive archive, String cacheDirPath) {
setNativeSpellingsDB(archive, cacheDirPath);
}

private native void setNativeSpellingsDB(Archive archive, String cacheDirPath);
public native String[] getSpellingCorrections(String word, int maxCount);

@Override
protected void finalize() { dispose(); }

///--------- The wrapper thing
// To delete our native wrapper
public native void dispose();
// A pointer (as a long) to a native Handle
private long nativeHandle;
}
36 changes: 36 additions & 0 deletions lib/src/test/org/kiwix/test/libkiwix/TestSpellingsDB.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright (C) 2025 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.test.libkiwix;

import org.kiwix.libkiwix.SpellingsDB;
import org.kiwix.libzim.Archive;
import org.kiwix.test.libzim.TestArchive;

public class TestSpellingsDB {
private SpellingsDB inner;

public TestSpellingsDB(TestArchive archive, String cacheDirPath) {
inner = new SpellingsDB(archive.inner(), cacheDirPath);
}

public String[] getSpellingCorrections(String word, int maxCount) {
return inner.getSpellingCorrections(word, maxCount);
}
}
11 changes: 11 additions & 0 deletions lib/src/test/test.java
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,17 @@ public void testSearcher() throws Exception, ZimFileFormatException, JNIKiwixExc
assertEquals("main.html", suggestionItem.getPath());
assertTrue(suggestionItem.hasSnippet());
assertEquals("<b>Test</b> ZIM file", suggestionItem.getSnippet());

File cacheDir = new File("build/test-cache");
if (cacheDir.exists()) {
cacheDir.delete();
}
cacheDir.mkdirs();
TestSpellingsDB testSpellingsDB = new TestSpellingsDB(archive, cacheDir.getAbsolutePath());
String[] spellingCorrections = testSpellingsDB.getSpellingCorrections("Test ZIM fileeee", 1);
assertEquals("Test ZIM file", spellingCorrections[0]);
String[] spellingCorrections1 = testSpellingsDB.getSpellingCorrections("Test ZIM f", 1);
assertEquals("Test ZIM file", spellingCorrections1[0]);
Comment on lines +792 to +796
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A fraud implementation of getSpellingCorrections() always returning the string "Test ZIM file" packaged into a single element array will pass this test. In fact, it may return an array containing more than one element and the test will still pass.

Tests should be written in a way ruling out such temporary implementations (acceptable in TDD approach). At a minimum, you should cover the case when no spelling correction is returned.

}
System.gc();
System.runFinalization();
Expand Down