package org.jabref.model.groups;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Pattern;
import org.jabref.model.entry.BibEntry;
/**
* Matches entries if the content of a given field is matched by a regular expression.
*/
public class RegexKeywordGroup extends KeywordGroup {
private Pattern pattern;
public RegexKeywordGroup(String name, GroupHierarchyType context, String searchField,
String searchExpression, boolean caseSensitive) {
super(name, context, searchField, searchExpression, caseSensitive);
this.pattern = compilePattern(searchExpression, caseSensitive);
}
private static Pattern compilePattern(String searchExpression, boolean caseSensitive) {
return caseSensitive ? Pattern.compile("\\b" + searchExpression + "\\b") : Pattern.compile(
"\\b" + searchExpression + "\\b", Pattern.CASE_INSENSITIVE);
}
@Override
public boolean contains(BibEntry entry) {
Optional<String> content = entry.getField(searchField);
return content.map(value -> pattern.matcher(value).find()).orElse(false);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof RegexKeywordGroup)) {
return false;
}
RegexKeywordGroup other = (RegexKeywordGroup) o;
return getName().equals(other.getName())
&& (getHierarchicalContext() == other.getHierarchicalContext())
&& searchField.equals(other.searchField)
&& searchExpression.equals(other.searchExpression)
&& (caseSensitive == other.caseSensitive);
}
@Override
public AbstractGroup deepCopy() {
return new RegexKeywordGroup(getName(), getHierarchicalContext(), searchField, searchExpression,
caseSensitive);
}
@Override
public int hashCode() {
return Objects.hash(getName(),
getHierarchicalContext(),
searchField,
searchExpression,
caseSensitive);
}
}