package org.jabref.logic.exporter;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import org.jabref.logic.util.MetadataSerializationConfiguration;
import org.jabref.model.groups.AbstractGroup;
import org.jabref.model.groups.AllEntriesGroup;
import org.jabref.model.groups.AutomaticGroup;
import org.jabref.model.groups.AutomaticKeywordGroup;
import org.jabref.model.groups.AutomaticPersonsGroup;
import org.jabref.model.groups.ExplicitGroup;
import org.jabref.model.groups.GroupTreeNode;
import org.jabref.model.groups.KeywordGroup;
import org.jabref.model.groups.RegexKeywordGroup;
import org.jabref.model.groups.SearchGroup;
import org.jabref.model.strings.StringUtil;
public class GroupSerializer {
private static String serializeAllEntriesGroup(AllEntriesGroup group) {
return MetadataSerializationConfiguration.ALL_ENTRIES_GROUP_ID;
}
private String serializeExplicitGroup(ExplicitGroup group) {
StringBuilder sb = new StringBuilder();
sb.append(MetadataSerializationConfiguration.EXPLICIT_GROUP_ID);
sb.append(StringUtil.quote(group.getName(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(group.getHierarchicalContext().ordinal());
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
appendGroupDetails(sb, group);
return sb.toString();
}
private String serializeKeywordGroup(KeywordGroup group) {
Boolean isRegex = group instanceof RegexKeywordGroup;
StringBuilder sb = new StringBuilder();
sb.append(MetadataSerializationConfiguration.KEYWORD_GROUP_ID);
sb.append(StringUtil.quote(group.getName(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(group.getHierarchicalContext().ordinal());
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.quote(group.getSearchField(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.quote(group.getSearchExpression(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.booleanToBinaryString(group.isCaseSensitive()));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.booleanToBinaryString(isRegex));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
appendGroupDetails(sb, group);
return sb.toString();
}
private String serializeSearchGroup(SearchGroup group) {
StringBuilder sb = new StringBuilder();
sb.append(MetadataSerializationConfiguration.SEARCH_GROUP_ID);
sb.append(StringUtil.quote(group.getName(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(group.getHierarchicalContext().ordinal());
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.quote(group.getSearchExpression(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.booleanToBinaryString(group.isCaseSensitive()));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(StringUtil.booleanToBinaryString(group.isRegularExpression()));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
appendGroupDetails(sb, group);
return sb.toString();
}
private void appendGroupDetails(StringBuilder builder, AbstractGroup group) {
builder.append(StringUtil.booleanToBinaryString(group.isExpanded()));
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
builder.append(group.getColor().map(Color::toString).orElse(""));
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
builder.append(group.getIconCode().orElse(""));
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
builder.append(group.getDescription().orElse(""));
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
}
/**
* Returns a textual representation of this node and its children. This
* representation contains both the tree structure and the textual
* representations of the group associated with each node.
* Every node is one entry in the list of strings.
*
* @return a representation of the tree based at this node as a list of strings
*/
public List<String> serializeTree(GroupTreeNode node) {
List<String> representation = new ArrayList<>();
// Append current node
representation.add(String.valueOf(node.getLevel()) + ' ' + serializeGroup(node.getGroup()));
// Append children
for (GroupTreeNode child : node.getChildren()) {
representation.addAll(serializeTree(child));
}
return representation;
}
private String serializeGroup(AbstractGroup group) {
if (group instanceof AllEntriesGroup) {
return serializeAllEntriesGroup((AllEntriesGroup)group);
} else if (group instanceof ExplicitGroup) {
return serializeExplicitGroup((ExplicitGroup)group);
} else if (group instanceof KeywordGroup) {
return serializeKeywordGroup((KeywordGroup)group);
} else if (group instanceof SearchGroup) {
return serializeSearchGroup((SearchGroup)group);
} else if (group instanceof AutomaticKeywordGroup) {
return serializeAutomaticKeywordGroup((AutomaticKeywordGroup)group);
} else if (group instanceof AutomaticPersonsGroup) {
return serializeAutomaticPersonsGroup((AutomaticPersonsGroup)group);
} else {
throw new UnsupportedOperationException("Don't know how to serialize group" + group.getClass().getName());
}
}
private String serializeAutomaticPersonsGroup(AutomaticPersonsGroup group) {
StringBuilder sb = new StringBuilder();
sb.append(MetadataSerializationConfiguration.AUTOMATIC_PERSONS_GROUP_ID);
appendAutomaticGroupDetails(sb, group);
sb.append(StringUtil.quote(group.getField(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
appendGroupDetails(sb, group);
return sb.toString();
}
private void appendAutomaticGroupDetails(StringBuilder builder, AutomaticGroup group) {
builder.append(StringUtil.quote(group.getName(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
builder.append(group.getHierarchicalContext().ordinal());
builder.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
}
private String serializeAutomaticKeywordGroup(AutomaticKeywordGroup group) {
StringBuilder sb = new StringBuilder();
sb.append(MetadataSerializationConfiguration.AUTOMATIC_KEYWORD_GROUP_ID);
appendAutomaticGroupDetails(sb, group);
sb.append(StringUtil.quote(group.getField(), MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR, MetadataSerializationConfiguration.GROUP_QUOTE_CHAR));
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(group.getKeywordDelimiter());
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
sb.append(group.getKeywordHierarchicalDelimiter());
sb.append(MetadataSerializationConfiguration.GROUP_UNIT_SEPARATOR);
appendGroupDetails(sb, group);
return sb.toString();
}
}