package org.jabref.model.groups;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.Keyword;
import org.jabref.model.entry.KeywordList;
import org.jabref.model.util.OptionalUtil;
public class AutomaticKeywordGroup extends AutomaticGroup {
private Character keywordDelimiter;
private Character keywordHierarchicalDelimiter;
private String field;
public AutomaticKeywordGroup(String name, GroupHierarchyType context, String field, Character keywordDelimiter, Character keywordHierarchicalDelimiter) {
super(name, context);
this.field = field;
this.keywordDelimiter = keywordDelimiter;
this.keywordHierarchicalDelimiter = keywordHierarchicalDelimiter;
}
public Character getKeywordHierarchicalDelimiter() {
return keywordHierarchicalDelimiter;
}
public Character getKeywordDelimiter() {
return keywordDelimiter;
}
public String getField() {
return field;
}
@Override
public AbstractGroup deepCopy() {
return new AutomaticKeywordGroup(this.name, this.context, field, this.keywordDelimiter, keywordHierarchicalDelimiter);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AutomaticKeywordGroup that = (AutomaticKeywordGroup) o;
return Objects.equals(keywordDelimiter, that.keywordDelimiter) &&
Objects.equals(field, that.field);
}
@Override
public int hashCode() {
return Objects.hash(keywordDelimiter, field);
}
@Override
public Set<GroupTreeNode> createSubgroups(BibEntry entry) {
Optional<KeywordList> keywordList = entry.getLatexFreeField(field)
.map(fieldValue -> KeywordList.parse(fieldValue, keywordDelimiter));
return OptionalUtil.toStream(keywordList)
.flatMap(KeywordList::stream)
.map(this::createGroup)
.collect(Collectors.toSet());
}
private GroupTreeNode createGroup(Keyword keywordChain) {
WordKeywordGroup rootGroup = new WordKeywordGroup(
keywordChain.get(),
GroupHierarchyType.INCLUDING,
field,
keywordChain.getPathFromRootAsString(keywordHierarchicalDelimiter),
true,
keywordDelimiter,
true);
GroupTreeNode root = new GroupTreeNode(rootGroup);
keywordChain.getChild()
.map(this::createGroup)
.ifPresent(root::addChild);
return root;
}
}