package org.jabref.preferences; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; public class JabRefPreferencesFilter { private final JabRefPreferences preferences; public JabRefPreferencesFilter(JabRefPreferences preferences) { this.preferences = preferences; } public List<PreferenceOption> getPreferenceOptions() { Map<String, Object> defaults = new HashMap<>(preferences.defaults); Map<String, Object> prefs = preferences.getPreferences(); return prefs.entrySet().stream() .map(entry -> new PreferenceOption(entry.getKey(), entry.getValue(), defaults.get(entry.getKey()))) .collect(Collectors.toList()); } public List<PreferenceOption> getDeviatingPreferences() { return getPreferenceOptions().stream() .filter(PreferenceOption::isChanged) .sorted() .collect(Collectors.toList()); } public enum PreferenceType { BOOLEAN, INTEGER, STRING } public static class PreferenceOption implements Comparable<PreferenceOption> { private final String key; private final Object value; private final Optional<Object> defaultValue; private final PreferenceType type; public PreferenceOption(String key, Object value, Object defaultValue) { this.key = Objects.requireNonNull(key); this.value = Objects.requireNonNull(value); this.defaultValue = Optional.ofNullable(defaultValue); this.type = Objects.requireNonNull(getType(value)); if ((defaultValue != null) && !Objects.equals(this.type, getType(defaultValue))) { throw new IllegalStateException("types must match between default value and value"); } } private PreferenceType getType(Object value) { if (value instanceof Boolean) { return PreferenceType.BOOLEAN; } else if (value instanceof Integer) { return PreferenceType.INTEGER; } else { return PreferenceType.STRING; } } public boolean isUnchanged() { return Objects.equals(value, defaultValue.orElse(null)); } public boolean isChanged() { return !isUnchanged(); } @Override public String toString() { return String.format("%s: %s=%s (%s)", type, key, value, defaultValue.orElse("NULL")); } public String getKey() { return key; } public Object getValue() { return value; } public Optional<Object> getDefaultValue() { return defaultValue; } public PreferenceType getType() { return type; } @Override public int compareTo(PreferenceOption o) { return Objects.compare(this.key, o.key, String::compareTo); } } }