package org.jabref.model.cleanup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
import org.jabref.model.FieldChange;
import org.jabref.model.entry.BibEntry;
public class FieldFormatterCleanups {
public static final String ENABLED = "enabled";
public static final String DISABLED = "disabled";
private final List<FieldFormatterCleanup> actions;
private final boolean enabled;
public FieldFormatterCleanups(boolean enabled, List<FieldFormatterCleanup> actions) {
this.enabled = enabled;
this.actions = Objects.requireNonNull(actions);
}
public boolean isEnabled() {
return enabled;
}
public List<FieldFormatterCleanup> getConfiguredActions() {
return Collections.unmodifiableList(actions);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if ((o == null) || (getClass() != o.getClass())) {
return false;
}
FieldFormatterCleanups that = (FieldFormatterCleanups) o;
if (enabled != that.enabled) {
return false;
}
return actions.equals(that.actions);
}
@Override
public int hashCode() {
return Objects.hash(actions, enabled);
}
public List<FieldChange> applySaveActions(BibEntry entry) {
if (enabled) {
return applyAllActions(entry);
} else {
return new ArrayList<>();
}
}
private List<FieldChange> applyAllActions(BibEntry entry) {
List<FieldChange> result = new ArrayList<>();
for (FieldFormatterCleanup action : actions) {
result.addAll(action.cleanup(entry));
}
return result;
}
public List<String> getAsStringList(String newline) {
List<String> stringRepresentation = new ArrayList<>();
if (enabled) {
stringRepresentation.add(ENABLED);
} else {
stringRepresentation.add(DISABLED);
}
String formatterString = getMetaDataString(actions, newline);
stringRepresentation.add(formatterString);
return stringRepresentation;
}
private static String getMetaDataString(List<FieldFormatterCleanup> actionList, String newline) {
//first, group all formatters by the field for which they apply
Map<String, List<String>> groupedByField = new HashMap<>();
for (FieldFormatterCleanup cleanup : actionList) {
String key = cleanup.getField();
// add new list into the hashmap if needed
if (!groupedByField.containsKey(key)) {
groupedByField.put(key, new ArrayList<>());
}
//add the formatter to the map if it is not already there
List<String> formattersForKey = groupedByField.get(key);
if (!formattersForKey.contains(cleanup.getFormatter().getKey())) {
formattersForKey.add(cleanup.getFormatter().getKey());
}
}
// convert the contents of the hashmap into the correct serialization
StringBuilder result = new StringBuilder();
for (Map.Entry<String, List<String>> entry : groupedByField.entrySet()) {
result.append(entry.getKey());
StringJoiner joiner = new StringJoiner(",", "[", "]" + newline);
entry.getValue().forEach(joiner::add);
result.append(joiner.toString());
}
return result.toString();
}
}