package org.jabref.model.search.rules;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.jabref.model.entry.BibEntry;
/**
* Search rule for contain-based search.
*/
public class ContainBasedSearchRule implements SearchRule {
private final boolean caseSensitive;
public ContainBasedSearchRule(boolean caseSensitive) {
this.caseSensitive = caseSensitive;
}
public boolean isCaseSensitive() {
return caseSensitive;
}
@Override
public boolean validateSearchStrings(String query) {
return true;
}
@Override
public boolean applyRule(String query, BibEntry bibEntry) {
String searchString = query;
if (!caseSensitive) {
searchString = searchString.toLowerCase(Locale.ROOT);
}
List<String> unmatchedWords = new SentenceAnalyzer(searchString).getWords();
for (String fieldKey : bibEntry.getFieldNames()) {
String formattedFieldContent = bibEntry.getLatexFreeField(fieldKey).get();
if (!caseSensitive) {
formattedFieldContent = formattedFieldContent.toLowerCase(Locale.ROOT);
}
Iterator<String> unmatchedWordsIterator = unmatchedWords.iterator();
while (unmatchedWordsIterator.hasNext()) {
String word = unmatchedWordsIterator.next();
if (formattedFieldContent.contains(word)) {
unmatchedWordsIterator.remove();
}
}
if (unmatchedWords.isEmpty()) {
return true;
}
}
return false; // Didn't match all words.
}
}