package org.jabref.preferences; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.TreeMap; import org.jabref.logic.exporter.ExportFormat; import org.jabref.logic.exporter.SavePreferences; import org.jabref.logic.journals.JournalAbbreviationLoader; import org.jabref.logic.layout.LayoutFormatterPreferences; import ca.odell.glazedlists.BasicEventList; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.SortedList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * This class handles user defined custom export formats. They are initially * read from Preferences, and kept alphabetically (sorted by name). Formats can * be added or removed. When modified, the sort() method must be called to make * sure the formats stay properly sorted. When the method store() is called, * export formats are written to Preferences. */ public class CustomExportList { private static final Log LOGGER = LogFactory.getLog(CustomExportList.class); private final EventList<List<String>> list; private final SortedList<List<String>> sorted; private final Map<String, ExportFormat> formats = new TreeMap<>(); public CustomExportList(Comparator<List<String>> comp) { list = new BasicEventList<>(); sorted = new SortedList<>(list, comp); } public Map<String, ExportFormat> getCustomExportFormats(JabRefPreferences prefs, JournalAbbreviationLoader loader) { Objects.requireNonNull(prefs); Objects.requireNonNull(loader); formats.clear(); readPrefs(prefs, loader); return formats; } public int size() { return list.size(); } public EventList<List<String>> getSortedList() { return sorted; } private void readPrefs(JabRefPreferences prefs, JournalAbbreviationLoader loader) { Objects.requireNonNull(prefs); Objects.requireNonNull(loader); formats.clear(); list.clear(); int i = 0; List<String> s; LayoutFormatterPreferences layoutPreferences = prefs.getLayoutFormatterPreferences(loader); SavePreferences savePreferences = SavePreferences.loadForExportFromPreferences(prefs); while (!((s = prefs.getStringList(JabRefPreferences.CUSTOM_EXPORT_FORMAT + i)).isEmpty())) { Optional<ExportFormat> format = createFormat(s, layoutPreferences, savePreferences); if (format.isPresent()) { formats.put(format.get().getConsoleName(), format.get()); list.add(s); } else { String customExportFormat = prefs.get(JabRefPreferences.CUSTOM_EXPORT_FORMAT + i); LOGGER.error("Error initializing custom export format from string " + customExportFormat); } i++; } } private Optional<ExportFormat> createFormat(List<String> s, LayoutFormatterPreferences layoutPreferences, SavePreferences savePreferences) { if (s.size() < 3) { return Optional.empty(); } String lfFileName; if (s.get(1).endsWith(".layout")) { lfFileName = s.get(1).substring(0, s.get(1).length() - 7); } else { lfFileName = s.get(1); } ExportFormat format = new ExportFormat(s.get(0), s.get(0), lfFileName, null, s.get(2), layoutPreferences, savePreferences); format.setCustomExport(true); return Optional.of(format); } public void addFormat(List<String> s, LayoutFormatterPreferences layoutPreferences, SavePreferences savePreferences) { createFormat(s, layoutPreferences, savePreferences).ifPresent(format -> { formats.put(format.getConsoleName(), format); list.add(s); }); } public void remove(List<String> toRemove, LayoutFormatterPreferences layoutPreferences, SavePreferences savePreferences) { createFormat(toRemove, layoutPreferences, savePreferences).ifPresent(format -> { formats.remove(format.getConsoleName()); list.remove(toRemove); }); } public void store(JabRefPreferences prefs) { if (list.isEmpty()) { purge(0, prefs); } else { for (int i = 0; i < list.size(); i++) { prefs.putStringList(JabRefPreferences.CUSTOM_EXPORT_FORMAT + i, list.get(i)); } purge(list.size(), prefs); } } private void purge(int from, JabRefPreferences prefs) { int i = from; while (!prefs.getStringList(JabRefPreferences.CUSTOM_EXPORT_FORMAT + i).isEmpty()) { prefs.remove(JabRefPreferences.CUSTOM_EXPORT_FORMAT + i); i++; } } }