package er.examples.textsearchdemo.components.sections;
import java.io.File;
import java.net.URL;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.spell.Dictionary;
import org.apache.lucene.search.spell.PlainTextDictionary;
import org.apache.lucene.search.spell.SpellChecker;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import webobjectsexamples.businesslogic.movies.common.Movie;
import com.webobjects.appserver.WOActionResults;
import com.webobjects.appserver.WOContext;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSLog;
import er.examples.textsearchdemo.components.shared.TSCommonComponent;
import er.extensions.foundation.ERXProperties;
import er.indexing.ERDocument;
import er.indexing.ERIndex;
public class SpellCheck extends TSCommonComponent {
private ERIndex _moviesIndex;
public String searchString;
private SpellChecker _spellChecker;
public ScoreDoc[] foundScoreDocs;
public int foundSetIndex;
public NSArray<String> suggestions;
public boolean isIncorrect = false;
public String suggestionItem;
public SpellCheck(WOContext context) {
super(context);
}
// ACTIONS
public WOActionResults createSpellingIndexAction() {
URL wordFilePath = application().resourceManager().pathURLForResourceNamed("englishwordlist.txt", "app", null);
try {
File wordDir = new File(wordFilePath.getPath());
Dictionary dictionary = new PlainTextDictionary(wordDir);
spellChecker().indexDictionary(dictionary);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public WOActionResults searchAction() {
suggestions = null;
isIncorrect = false;
if (searchString != null && searchString.length() > 0) {
try {
int maxSuggetions = 5;
if (spellChecker().exist(searchString)) {
isIncorrect = false;
} else {
isIncorrect = true;
}
suggestions = new NSArray<String>(spellChecker().suggestSimilar(searchString, maxSuggetions));
NSLog.out.appendln( "SpellCheck.searchAction: " + isIncorrect + " suggestions: " + suggestions);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
// ACCESSORS
public ERDocument currentDocument() {
ERDocument doc = null;
int docId = foundScoreDocs[foundSetIndex].doc;
float score = foundScoreDocs[foundSetIndex].score;
doc = moviesIndex().documentForId(docId, score);
NSLog.out.appendln( "SimpleSearch.currentDocument: " + doc + " score: " + score);
return doc;
}
public int foundScoreDocsCount() {
int result = 0;
if (foundScoreDocs != null) {
result = foundScoreDocs.length;
}
return result;
}
public SpellChecker spellChecker() {
if (_spellChecker == null) {
String spellIndexDirectory = ERXProperties.stringForKey("er.examples.textsearchdemo.spellCheckIndexPath");
File spellingDir = new File(spellIndexDirectory);
try {
Directory spellingDirectory = FSDirectory.open(spellingDir);
_spellChecker = new SpellChecker(spellingDirectory);
} catch (Exception e) {
e.printStackTrace();
}
}
return _spellChecker;
}
public ERIndex moviesIndex() {
if (_moviesIndex == null) {
_moviesIndex = ERIndex.indexNamed(Movie.ENTITY_NAME);
}
return _moviesIndex;
}
public void setMoviesIndex(ERIndex index) {
_moviesIndex = index;
}
}