From 1a0639f806b4c1a916c2b479a7c3e98e3b740cdf Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sun, 2 Jul 2023 00:48:33 +0200 Subject: [PATCH 01/23] Rename ALL to WITH_JABREF_META_DATA --- .../java/org/jabref/gui/exporter/SaveDatabaseAction.java | 2 +- .../java/org/jabref/logic/exporter/BibDatabaseWriter.java | 6 +++--- .../java/org/jabref/logic/exporter/SaveConfiguration.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 1a57b1f2bd5..b73c2bb85a1 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -210,7 +210,7 @@ private boolean save(Path targetPath, SaveDatabaseMode mode) { libraryTab.getBibDatabaseContext().getMetaData().setEncoding(encoding, ChangePropagation.DO_NOT_POST_EVENT); // Save the database - boolean success = saveDatabase(targetPath, false, encoding, BibDatabaseWriter.SaveType.ALL); + boolean success = saveDatabase(targetPath, false, encoding, BibDatabaseWriter.SaveType.WITH_JABREF_META_DATA); if (success) { libraryTab.getUndoManager().markUnchanged(); diff --git a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java index 37c447017fc..533f1c71826 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -54,7 +54,7 @@ */ public abstract class BibDatabaseWriter { - public enum SaveType { ALL, PLAIN_BIBTEX } + public enum SaveType { WITH_JABREF_META_DATA, PLAIN_BIBTEX } private static final Pattern REFERENCE_PATTERN = Pattern.compile("(#[A-Za-z]+#)"); // Used to detect string references in strings protected final BibWriter bibWriter; @@ -190,7 +190,7 @@ public void savePartOfDatabase(BibDatabaseContext bibDatabaseContext, List writeDatabaseID(id))); // Some file formats write something at the start of the file (like the encoding) - if (saveConfiguration.getSaveType() != SaveType.PLAIN_BIBTEX) { + if (saveConfiguration.getSaveType() == SaveType.WITH_JABREF_META_DATA) { Charset charset = bibDatabaseContext.getMetaData().getEncoding().orElse(StandardCharsets.UTF_8); writeProlog(bibDatabaseContext, charset); } @@ -228,7 +228,7 @@ public void savePartOfDatabase(BibDatabaseContext bibDatabaseContext, List Date: Sun, 2 Jul 2023 00:55:59 +0200 Subject: [PATCH 02/23] Remove "Config" suffix --- .../java/org/jabref/gui/exporter/SaveDatabaseAction.java | 2 +- .../libraryproperties/saving/SavingPropertiesViewModel.java | 6 +++--- .../org/jabref/logic/bibtex/comparator/MetaDataDiff.java | 2 +- .../java/org/jabref/logic/exporter/MetaDataSerializer.java | 2 +- .../java/org/jabref/logic/importer/util/MetaDataParser.java | 2 +- src/main/java/org/jabref/model/metadata/MetaData.java | 6 +++--- .../org/jabref/logic/exporter/BibtexDatabaseWriterTest.java | 4 ++-- .../jabref/logic/importer/fileformat/BibtexParserTest.java | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index b73c2bb85a1..1a887ef1c43 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -233,7 +233,7 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, SaveConfiguration saveConfiguration = new SaveConfiguration() .withSaveType(saveType) - .withMetadataSaveOrder(true) + .withSaveOrder() .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); BibDatabaseContext bibDatabaseContext = libraryTab.getBibDatabaseContext(); synchronized (bibDatabaseContext) { diff --git a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index 15955183f52..970e69ca051 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -48,7 +48,7 @@ public SavingPropertiesViewModel(BibDatabaseContext databaseContext, Preferences this.databaseContext = databaseContext; this.preferencesService = preferencesService; this.initialMetaData = databaseContext.getMetaData(); - this.exportSaveOrder = initialMetaData.getSaveOrderConfig() + this.exportSaveOrder = initialMetaData.getSaveOrder() .orElseGet(() -> preferencesService.getExportPreferences().getExportSaveOrder()); } @@ -122,9 +122,9 @@ public void storeSettings() { if (!newSaveOrder.equals(exportSaveOrder)) { if (newSaveOrder.equals(SaveOrder.getDefaultSaveOrder())) { - newMetaData.clearSaveOrderConfig(); + newMetaData.clearSaveOrder(); } else { - newMetaData.setSaveOrderConfig(newSaveOrder); + newMetaData.setSaveOrder(newSaveOrder); } } diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java index 5f49073981a..a1805862508 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java @@ -56,7 +56,7 @@ public EnumSet getDifferences(PreferencesService preferences) { if (!Objects.equals(originalMetaData.getEncoding(), newMetaData.getEncoding())) { changes.add(Difference.ENCODING); } - if (!Objects.equals(originalMetaData.getSaveOrderConfig(), newMetaData.getSaveOrderConfig())) { + if (!Objects.equals(originalMetaData.getSaveOrder(), newMetaData.getSaveOrder())) { changes.add(Difference.SAVE_SORT_ORDER); } if (!Objects.equals( diff --git a/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java b/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java index 150dab34e66..60c143dab88 100644 --- a/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java +++ b/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java @@ -42,7 +42,7 @@ public static Map getSerializedStringMap(MetaData metaData, Map> stringyMetaData = new HashMap<>(); // First write all meta data except groups - metaData.getSaveOrderConfig().ifPresent( + metaData.getSaveOrder().ifPresent( saveOrderConfig -> stringyMetaData.put(MetaData.SAVE_ORDER_CONFIG, saveOrderConfig.getAsStringList())); metaData.getSaveActions().ifPresent( saveActions -> stringyMetaData.put(MetaData.SAVE_ACTIONS, saveActions.getAsStringList(OS.NEWLINE))); diff --git a/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java b/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java index 57c66e12889..b5b733f7973 100644 --- a/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java +++ b/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java @@ -120,7 +120,7 @@ public MetaData parse(MetaData metaData, Map data, Character key metaData.markAsNotProtected(); } } else if (entry.getKey().equals(MetaData.SAVE_ORDER_CONFIG)) { - metaData.setSaveOrderConfig(SaveOrder.parse(values)); + metaData.setSaveOrder(SaveOrder.parse(values)); } else if (entry.getKey().equals(MetaData.GROUPSTREE) || entry.getKey().equals(MetaData.GROUPSTREE_LEGACY)) { metaData.setGroups(GroupsParser.importGroups(values, keywordSeparator, fileMonitor, metaData)); } else if (entry.getKey().equals(MetaData.VERSION_DB_STRUCT)) { diff --git a/src/main/java/org/jabref/model/metadata/MetaData.java b/src/main/java/org/jabref/model/metadata/MetaData.java index a8ddc4b3d74..faf537a59ef 100644 --- a/src/main/java/org/jabref/model/metadata/MetaData.java +++ b/src/main/java/org/jabref/model/metadata/MetaData.java @@ -81,11 +81,11 @@ public MetaData() { // Do nothing } - public Optional getSaveOrderConfig() { + public Optional getSaveOrder() { return Optional.ofNullable(saveOrder); } - public void setSaveOrderConfig(SaveOrder saveOrder) { + public void setSaveOrder(SaveOrder saveOrder) { this.saveOrder = saveOrder; postChange(); } @@ -270,7 +270,7 @@ public void clearSaveActions() { postChange(); } - public void clearSaveOrderConfig() { + public void clearSaveOrder() { saveOrder = null; postChange(); } diff --git a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java index dd765793e33..a3171ede633 100644 --- a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java +++ b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java @@ -738,7 +738,7 @@ void writeSaveOrderConfig() throws Exception { List.of(new SaveOrder.SortCriterion(StandardField.AUTHOR, false), new SaveOrder.SortCriterion(StandardField.YEAR, true), new SaveOrder.SortCriterion(StandardField.ABSTRACT, false))); - metaData.setSaveOrderConfig(saveOrder); + metaData.setSaveOrder(saveOrder); databaseWriter.savePartOfDatabase(bibtexContext, Collections.emptyList()); @@ -799,7 +799,7 @@ void writeEntriesSorted() throws Exception { List.of(new SaveOrder.SortCriterion(StandardField.AUTHOR, false), new SaveOrder.SortCriterion(StandardField.YEAR, true), new SaveOrder.SortCriterion(StandardField.ABSTRACT, false))); - metaData.setSaveOrderConfig(saveOrder); + metaData.setSaveOrder(saveOrder); BibEntry firstEntry = new BibEntry(StandardEntryType.Article) .withField(StandardField.AUTHOR, "A") diff --git a/src/test/java/org/jabref/logic/importer/fileformat/BibtexParserTest.java b/src/test/java/org/jabref/logic/importer/fileformat/BibtexParserTest.java index 3017bb603a8..bdfc7a8718c 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/BibtexParserTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/BibtexParserTest.java @@ -1322,7 +1322,7 @@ void integrationTestSaveOrderConfig() throws IOException { new StringReader( "@Comment{jabref-meta: saveOrderConfig:specified;author;false;year;true;abstract;false;}")); - Optional saveOrderConfig = result.getMetaData().getSaveOrderConfig(); + Optional saveOrderConfig = result.getMetaData().getSaveOrder(); assertEquals(new SaveOrder(SaveOrder.OrderType.SPECIFIED, List.of( new SaveOrder.SortCriterion(StandardField.AUTHOR, false), From 6102b4e5040b71f907684d56dfd00638e2048799 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sun, 2 Jul 2023 01:34:43 +0200 Subject: [PATCH 03/23] WIP - SaveOrder needs to become observable --- .../org/jabref/cli/ArgumentProcessor.java | 2 - .../SaveOrderConfigPanelViewModel.java | 3 +- .../SortCriterionViewModel.java | 6 ++ .../logic/exporter/BibDatabaseWriter.java | 38 ++----- .../logic/exporter/SaveConfiguration.java | 13 --- .../logic/exporter/TemplateExporter.java | 27 ++--- .../org/jabref/model/metadata/SaveOrder.java | 100 +++++++++--------- 7 files changed, 74 insertions(+), 115 deletions(-) diff --git a/src/main/java/org/jabref/cli/ArgumentProcessor.java b/src/main/java/org/jabref/cli/ArgumentProcessor.java index b3bd9cf2603..da360c59f89 100644 --- a/src/main/java/org/jabref/cli/ArgumentProcessor.java +++ b/src/main/java/org/jabref/cli/ArgumentProcessor.java @@ -605,9 +605,7 @@ private void saveDatabase(BibDatabase newBase, String subName) { try (AtomicFileWriter fileWriter = new AtomicFileWriter(Path.of(subName), StandardCharsets.UTF_8)) { BibWriter bibWriter = new BibWriter(fileWriter, OS.NEWLINE); SaveConfiguration saveConfiguration = new SaveConfiguration() - .withMetadataSaveOrder(true) .withReformatOnSave(preferencesService.getLibraryPreferences().shouldAlwaysReformatOnSave()); - BibDatabaseWriter databaseWriter = new BibtexDatabaseWriter( bibWriter, saveConfiguration, diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/SaveOrderConfigPanelViewModel.java b/src/main/java/org/jabref/gui/commonfxcontrols/SaveOrderConfigPanelViewModel.java index 5407edbcccd..6776df54e47 100644 --- a/src/main/java/org/jabref/gui/commonfxcontrols/SaveOrderConfigPanelViewModel.java +++ b/src/main/java/org/jabref/gui/commonfxcontrols/SaveOrderConfigPanelViewModel.java @@ -9,7 +9,6 @@ import javafx.collections.FXCollections; import org.jabref.model.entry.field.Field; -import org.jabref.model.metadata.SaveOrder; public class SaveOrderConfigPanelViewModel { @@ -24,7 +23,7 @@ public SaveOrderConfigPanelViewModel() { } public void addCriterion() { - selectedSortCriteriaProperty.add(new SortCriterionViewModel(new SaveOrder.SortCriterion())); + selectedSortCriteriaProperty.add(new SortCriterionViewModel()); } public void removeCriterion(SortCriterionViewModel sortCriterionViewModel) { diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/SortCriterionViewModel.java b/src/main/java/org/jabref/gui/commonfxcontrols/SortCriterionViewModel.java index 6d1d21a9ee5..19edca1f9d9 100644 --- a/src/main/java/org/jabref/gui/commonfxcontrols/SortCriterionViewModel.java +++ b/src/main/java/org/jabref/gui/commonfxcontrols/SortCriterionViewModel.java @@ -6,6 +6,7 @@ import javafx.beans.property.SimpleObjectProperty; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; import org.jabref.model.metadata.SaveOrder; public class SortCriterionViewModel { @@ -18,6 +19,11 @@ public SortCriterionViewModel(SaveOrder.SortCriterion criterion) { this.descendingProperty.setValue(criterion.descending); } + public SortCriterionViewModel() { + this.fieldProperty.setValue(StandardField.AUTHOR); + this.descendingProperty.setValue(false); + } + public ObjectProperty fieldProperty() { return fieldProperty; } diff --git a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java index 533f1c71826..2b752801b35 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -102,21 +101,19 @@ public static List applySaveActions(BibEntry entry, MetaData metaDa return applySaveActions(Collections.singletonList(entry), metaData); } - private static List> getSaveComparators(MetaData metaData, SaveConfiguration preferences) { + private static List> getSaveComparators(SaveOrder saveOrder) { List> comparators = new ArrayList<>(); - Optional saveOrder = getSaveOrder(metaData, preferences); // Take care, using CrossRefEntry-Comparator, that referred entries occur after referring // ones. This is a necessary requirement for BibTeX to be able to resolve referenced entries correctly. comparators.add(new CrossRefEntryComparator()); - if (saveOrder.isEmpty() || saveOrder.get().getOrderType() == SaveOrder.OrderType.ORIGINAL) { + if (saveOrder.getOrderType() == SaveOrder.OrderType.ORIGINAL) { // entries will be sorted based on their internal IDs comparators.add(new IdComparator()); } else { // use configured sorting strategy - List fieldComparators = saveOrder.get() - .getSortCriteria().stream() + List fieldComparators = saveOrder.getSortCriteria().stream() .map(FieldComparator::new) .toList(); comparators.addAll(fieldComparators); @@ -131,16 +128,10 @@ private static List> getSaveComparators(MetaData metaData, * non-database save operation (such as the exportDatabase call), we do not wish to use the global preference of * saving in standard order. */ - public static List getSortedEntries(BibDatabaseContext bibDatabaseContext, List entriesToSort, SaveConfiguration preferences) { - Objects.requireNonNull(bibDatabaseContext); + public static List getSortedEntries(List entriesToSort, SaveOrder saveOrder) { Objects.requireNonNull(entriesToSort); - // if no meta data are present, simply return in original order - if (bibDatabaseContext.getMetaData() == null) { - return new LinkedList<>(entriesToSort); - } - - List> comparators = getSaveComparators(bibDatabaseContext.getMetaData(), preferences); + List> comparators = getSaveComparators(saveOrder); FieldComparatorStack comparatorStack = new FieldComparatorStack<>(comparators); List sorted = new ArrayList<>(entriesToSort); @@ -148,23 +139,6 @@ public static List getSortedEntries(BibDatabaseContext bibDatabaseCont return sorted; } - private static Optional getSaveOrder(MetaData metaData, SaveConfiguration saveConfiguration) { - /* two options: - * 1. order specified in metaData - * 2. original order - */ - - if (saveConfiguration.useMetadataSaveOrder()) { - return metaData.getSaveOrderConfig(); - } - - if (saveConfiguration.getSaveOrder().getOrderType() == SaveOrder.OrderType.ORIGINAL) { - return Optional.empty(); - } - - return Optional.ofNullable(saveConfiguration.getSaveOrder()); - } - public List getSaveActionsFieldChanges() { return Collections.unmodifiableList(saveActionsFieldChanges); } @@ -204,7 +178,7 @@ public void savePartOfDatabase(BibDatabaseContext bibDatabaseContext, List sortedEntries = getSortedEntries(bibDatabaseContext, entries, saveConfiguration); + List sortedEntries = getSortedEntries(entries, saveConfiguration); List saveActionChanges = applySaveActions(sortedEntries, bibDatabaseContext.getMetaData()); saveActionsFieldChanges.addAll(saveActionChanges); if (keyPatternPreferences.shouldGenerateCiteKeysBeforeSaving()) { diff --git a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java index 3956967249a..9a93467390f 100644 --- a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java +++ b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java @@ -11,17 +11,14 @@ public class SaveConfiguration { private SaveOrder saveOrder; private boolean makeBackup; private BibDatabaseWriter.SaveType saveType; - private boolean useMetadataSaveOrder; public SaveConfiguration(SaveOrder saveOrder, Boolean makeBackup, BibDatabaseWriter.SaveType saveType, - Boolean useMetadataSaveOrder, Boolean reformatFile) { this.saveOrder = saveOrder; this.makeBackup = makeBackup; this.saveType = saveType; - this.useMetadataSaveOrder = useMetadataSaveOrder; this.reformatFile = reformatFile; } @@ -29,19 +26,9 @@ public SaveConfiguration() { this(SaveOrder.getDefaultSaveOrder(), false, BibDatabaseWriter.SaveType.WITH_JABREF_META_DATA, - true, false); } - public boolean useMetadataSaveOrder() { - return useMetadataSaveOrder; - } - - public SaveConfiguration withMetadataSaveOrder(boolean newTakeMetadataSaveOrderInAccount) { - this.useMetadataSaveOrder = newTakeMetadataSaveOrderInAccount; - return this; - } - public SaveOrder getSaveOrder() { return saveOrder; } diff --git a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java index d05d99212a3..cdafca1e175 100644 --- a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java +++ b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java @@ -28,6 +28,7 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.types.EntryType; +import org.jabref.model.metadata.SaveOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,7 +50,7 @@ public class TemplateExporter extends Exporter { private final String lfFileName; private final String directory; private final LayoutFormatterPreferences layoutPreferences; - private final SaveConfiguration saveConfiguration; + private final SaveOrder saveOrder; private boolean customExport; private BlankLineBehaviour blankLineBehaviour; @@ -76,21 +77,19 @@ public TemplateExporter(String displayName, * @param name to display to the user and to call this format in the console. * @param lfFileName Name of the main layout file. * @param extension May or may not contain the . (for instance .txt). - * @param layoutPreferences Preferences for the layout - * @param saveConfiguration Preferences for saving */ public TemplateExporter(String name, String lfFileName, String extension, LayoutFormatterPreferences layoutPreferences, - SaveConfiguration saveConfiguration) { + SaveOrder saveOrder) { this(name, name, lfFileName, null, StandardFileType.fromExtensions(extension), layoutPreferences, - saveConfiguration); + saveOrder); } /** @@ -101,8 +100,6 @@ public TemplateExporter(String name, * @param lfFileName Name of the main layout file. * @param directory Directory in which to find the layout file. * @param extension Should contain the . (for instance .txt). - * @param layoutPreferences Preferences for layout - * @param saveConfiguration Preferences for saving */ public TemplateExporter(String displayName, String consoleName, @@ -110,7 +107,7 @@ public TemplateExporter(String displayName, String directory, FileType extension, LayoutFormatterPreferences layoutPreferences, - SaveConfiguration saveConfiguration) { + SaveOrder saveOrder) { super(consoleName, displayName, extension); if (Objects.requireNonNull(lfFileName).endsWith(LAYOUT_EXTENSION)) { this.lfFileName = lfFileName.substring(0, lfFileName.length() - LAYOUT_EXTENSION.length()); @@ -119,7 +116,7 @@ public TemplateExporter(String displayName, } this.directory = directory; this.layoutPreferences = layoutPreferences; - this.saveConfiguration = saveConfiguration; + this.saveOrder = saveOrder; } /** @@ -131,7 +128,6 @@ public TemplateExporter(String displayName, * @param directory Directory in which to find the layout file. * @param extension Should contain the . (for instance .txt). * @param layoutPreferences Preferences for layout - * @param saveConfiguration Preferences for saving * @param blankLineBehaviour how to behave regarding blank lines. */ public TemplateExporter(String displayName, @@ -140,7 +136,7 @@ public TemplateExporter(String displayName, String directory, FileType extension, LayoutFormatterPreferences layoutPreferences, - SaveConfiguration saveConfiguration, + SaveOrder saveOrder, BlankLineBehaviour blankLineBehaviour) { super(consoleName, displayName, extension); if (Objects.requireNonNull(lfFileName).endsWith(LAYOUT_EXTENSION)) { @@ -150,7 +146,7 @@ public TemplateExporter(String displayName, } this.directory = directory; this.layoutPreferences = layoutPreferences; - this.saveConfiguration = saveConfiguration; + this.saveOrder = saveOrder; this.blankLineBehaviour = blankLineBehaviour; } @@ -247,12 +243,9 @@ public void export(final BibDatabaseContext databaseContext, /* * Write database entries; entries will be sorted as they appear on the - * screen, or sorted by author, depending on Preferences. We also supply - * the Set entries - if we are to export only certain entries, it will - * be non-null, and be used to choose entries. Otherwise, it will be - * null, and be ignored. + * screen, or sorted by author, depending on Preferences. */ - List sorted = BibDatabaseWriter.getSortedEntries(databaseContext, entries, saveConfiguration); + List sorted = BibDatabaseWriter.getSortedEntries(entries, saveOrder); // Load default layout Layout defLayout; diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 499d9f5d161..066724fe29d 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -4,6 +4,11 @@ import java.util.List; import java.util.Objects; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; @@ -17,45 +22,14 @@ */ public class SaveOrder { - public enum OrderType { - SPECIFIED("specified"), - ORIGINAL("original"), - TABLE("table"); - - private final String name; - - OrderType(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } - - public static SaveOrder.OrderType fromBooleans(boolean saveInSpecifiedOrder, boolean saveInOriginalOrder) { - SaveOrder.OrderType orderType = SaveOrder.OrderType.TABLE; - if (saveInSpecifiedOrder) { - orderType = SaveOrder.OrderType.SPECIFIED; - } else if (saveInOriginalOrder) { - orderType = SaveOrder.OrderType.ORIGINAL; - } - - return orderType; - } - } - private static final Logger LOGGER = LoggerFactory.getLogger(SaveOrder.class); - private final List sortCriteria = new ArrayList<>(); - private OrderType orderType; - - private SaveOrder() { - } + private final ObservableList sortCriteria; + private final ObjectProperty orderType; public SaveOrder(OrderType orderType, List sortCriteria) { - this.orderType = orderType; - this.sortCriteria.addAll(sortCriteria); + this.orderType = new SimpleObjectProperty<>(orderType); + this.sortCriteria = FXCollections.observableArrayList(sortCriteria); } private SaveOrder(List data) { @@ -65,22 +39,27 @@ private SaveOrder(List data) { throw new IllegalArgumentException(); } + OrderType orderType; try { - this.orderType = OrderType.valueOf(data.get(0).toUpperCase()); + orderType = OrderType.valueOf(data.get(0).toUpperCase()); } catch (IllegalArgumentException ex) { if (data.size() > 1 && data.size() % 2 == 1) { LOGGER.warn("Could not parse sort order: {} - trying to parse the sort criteria", data.get(0)); - this.orderType = OrderType.SPECIFIED; + orderType = OrderType.SPECIFIED; } else { LOGGER.warn("Could not parse sort order: {}", data.get(0)); - this.orderType = OrderType.ORIGINAL; + this.sortCriteria = FXCollections.observableArrayList(); + this.orderType = new SimpleObjectProperty<>(OrderType.ORIGINAL); return; } } + this.orderType = new SimpleObjectProperty<>(orderType); + List sortCriteria = new ArrayList<>(data.size() / 2); for (int index = 1; index < data.size(); index = index + 2) { sortCriteria.add(new SortCriterion(FieldFactory.parseField(data.get(index)), data.get(index + 1))); } + this.sortCriteria = FXCollections.observableArrayList(sortCriteria); } public static SaveOrder parse(List orderedData) { @@ -88,16 +67,14 @@ public static SaveOrder parse(List orderedData) { } public static SaveOrder getDefaultSaveOrder() { - SaveOrder standard = new SaveOrder(); - standard.orderType = OrderType.ORIGINAL; - return standard; + return new SaveOrder(OrderType.ORIGINAL, List.of()); } public OrderType getOrderType() { - return orderType; + return orderType.get(); } - public List getSortCriteria() { + public ObservableList getSortCriteria() { return sortCriteria; } @@ -130,7 +107,7 @@ public String toString() { */ public List getAsStringList() { List res = new ArrayList<>(7); - if (orderType == OrderType.ORIGINAL) { + if (orderType.get() == OrderType.ORIGINAL) { res.add(OrderType.ORIGINAL.toString()); } else { res.add(OrderType.SPECIFIED.toString()); @@ -146,9 +123,9 @@ public List getAsStringList() { public static class SortCriterion { - public Field field; + public final Field field; - public boolean descending; + public final boolean descending; /** * @@ -165,9 +142,6 @@ public SortCriterion(Field field, boolean descending) { this.descending = descending; } - public SortCriterion() { - } - @Override public String toString() { return "SortCriterion{" + "field='" + field + '\'' + @@ -193,4 +167,32 @@ public int hashCode() { return Objects.hash(field, descending); } } + + public enum OrderType { + SPECIFIED("specified"), + ORIGINAL("original"), + TABLE("table"); + + private final String name; + + OrderType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public static SaveOrder.OrderType fromBooleans(boolean saveInSpecifiedOrder, boolean saveInOriginalOrder) { + SaveOrder.OrderType orderType = SaveOrder.OrderType.TABLE; + if (saveInSpecifiedOrder) { + orderType = SaveOrder.OrderType.SPECIFIED; + } else if (saveInOriginalOrder) { + orderType = SaveOrder.OrderType.ORIGINAL; + } + + return orderType; + } + } } From c3de1ab00e88c2711770f2d9fee0a479a756bb4a Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:17:43 +0200 Subject: [PATCH 04/23] Fix BibDatabseWriter --- .../java/org/jabref/logic/exporter/BibDatabaseWriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java index 2b752801b35..53151f5fcb9 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -124,7 +124,7 @@ private static List> getSaveComparators(SaveOrder saveOrder } /** - * We have begun to use getSortedEntries() for both database save operations and non-database save operations. In a + * We have begun to use getSortedEntries() for both database save operations and non-database save operations. In a * non-database save operation (such as the exportDatabase call), we do not wish to use the global preference of * saving in standard order. */ @@ -178,7 +178,7 @@ public void savePartOfDatabase(BibDatabaseContext bibDatabaseContext, List sortedEntries = getSortedEntries(entries, saveConfiguration); + List sortedEntries = getSortedEntries(entries, saveConfiguration.getSaveOrder()); List saveActionChanges = applySaveActions(sortedEntries, bibDatabaseContext.getMetaData()); saveActionsFieldChanges.addAll(saveActionChanges); if (keyPatternPreferences.shouldGenerateCiteKeysBeforeSaving()) { From 17c6ab525afec5d425e91c623076f12d22eb15b4 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:18:02 +0200 Subject: [PATCH 05/23] Remove obsolete "WithMetadataSaveOrder" --- src/main/java/org/jabref/preferences/JabRefPreferences.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index dbf46cd5453..d66371df798 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2272,7 +2272,6 @@ public SaveConfiguration getExportConfiguration() { return new SaveConfiguration() .withSaveOrder(saveOrder) - .withMetadataSaveOrder(false) .withReformatOnSave(getLibraryPreferences().shouldAlwaysReformatOnSave()); } From c5f7e7e3f1ad23808786148b8b5d0ac3dc1a7de9 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:18:10 +0200 Subject: [PATCH 06/23] Fix typo --- src/main/java/org/jabref/model/metadata/SaveOrder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 066724fe29d..a0f63d8c30e 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -18,7 +18,7 @@ /** * Stores the save order config from MetaData *

- * Format: <choice>, pair of field + ascending (boolean) + * Format: <choice>, a pair of field + ascending (boolean) */ public class SaveOrder { From faf2bae058268e4029bf95d31c4981266e4abe66 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:18:21 +0200 Subject: [PATCH 07/23] Fix SaveDatabaseAction --- .../gui/exporter/SaveDatabaseAction.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 1a887ef1c43..f56852c25a8 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -37,6 +37,7 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.ChangePropagation; import org.jabref.model.entry.BibEntryTypesManager; +import org.jabref.model.metadata.SaveOrder; import org.jabref.preferences.PreferencesService; import org.slf4j.Logger; @@ -79,7 +80,7 @@ public boolean save(SaveDatabaseMode mode) { } /** - * Asks the user for the path and saves afterwards + * Asks the user for the path and saves afterward */ public void saveAs() { askForSavePath().ifPresent(this::saveAs); @@ -92,7 +93,8 @@ public boolean saveAs(Path file) { public void saveSelectedAsPlain() { askForSavePath().ifPresent(path -> { try { - saveDatabase(path, true, StandardCharsets.UTF_8, BibDatabaseWriter.SaveType.PLAIN_BIBTEX); + saveDatabase(path, true, StandardCharsets.UTF_8, BibDatabaseWriter.SaveType.PLAIN_BIBTEX, + libraryTab.getBibDatabaseContext().getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())); frame.getFileHistory().newFile(path); dialogService.notify(Localization.lang("Saved selected to '%0'.", path.toString())); } catch (SaveException ex) { @@ -210,7 +212,8 @@ private boolean save(Path targetPath, SaveDatabaseMode mode) { libraryTab.getBibDatabaseContext().getMetaData().setEncoding(encoding, ChangePropagation.DO_NOT_POST_EVENT); // Save the database - boolean success = saveDatabase(targetPath, false, encoding, BibDatabaseWriter.SaveType.WITH_JABREF_META_DATA); + boolean success = saveDatabase(targetPath, false, encoding, BibDatabaseWriter.SaveType.WITH_JABREF_META_DATA, + libraryTab.getBibDatabaseContext().getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())); if (success) { libraryTab.getUndoManager().markUnchanged(); @@ -228,12 +231,12 @@ private boolean save(Path targetPath, SaveDatabaseMode mode) { } } - private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, BibDatabaseWriter.SaveType saveType) throws SaveException { + private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, BibDatabaseWriter.SaveType saveType, SaveOrder saveOrder) throws SaveException { // if this code is adapted, please also adapt org.jabref.logic.autosaveandbackup.BackupManager.performBackup SaveConfiguration saveConfiguration = new SaveConfiguration() .withSaveType(saveType) - .withSaveOrder() + .withSaveOrder(saveOrder) .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); BibDatabaseContext bibDatabaseContext = libraryTab.getBibDatabaseContext(); synchronized (bibDatabaseContext) { @@ -255,7 +258,7 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, libraryTab.registerUndoableChanges(databaseWriter.getSaveActionsFieldChanges()); if (fileWriter.hasEncodingProblems()) { - saveWithDifferentEncoding(file, selectedOnly, encoding, fileWriter.getEncodingProblems(), saveType); + saveWithDifferentEncoding(file, selectedOnly, encoding, fileWriter.getEncodingProblems(), saveType, saveOrder); } } catch (UnsupportedCharsetException ex) { throw new SaveException(Localization.lang("Character encoding '%0' is not supported.", encoding.displayName()), ex); @@ -266,7 +269,7 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, } } - private void saveWithDifferentEncoding(Path file, boolean selectedOnly, Charset encoding, Set encodingProblems, BibDatabaseWriter.SaveType saveType) throws SaveException { + private void saveWithDifferentEncoding(Path file, boolean selectedOnly, Charset encoding, Set encodingProblems, BibDatabaseWriter.SaveType saveType, SaveOrder saveOrder) throws SaveException { DialogPane pane = new DialogPane(); VBox vbox = new VBox(); vbox.getChildren().addAll( @@ -288,7 +291,7 @@ private void saveWithDifferentEncoding(Path file, boolean selectedOnly, Charset // Make sure to remember which encoding we used. libraryTab.getBibDatabaseContext().getMetaData().setEncoding(newEncoding.get(), ChangePropagation.DO_NOT_POST_EVENT); - saveDatabase(file, selectedOnly, newEncoding.get(), saveType); + saveDatabase(file, selectedOnly, newEncoding.get(), saveType, saveOrder); } } } From 8479fe5a3f631468eaf0073537a13ab64e9ca265 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:57:02 +0200 Subject: [PATCH 08/23] =?UTF-8?q?=C3=8Anable=20jspecify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ src/main/java/module-info.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index d6b73e6e994..1f6253aa9b8 100644 --- a/build.gradle +++ b/build.gradle @@ -214,6 +214,8 @@ dependencies { implementation group: 'org.jooq', name: 'jool', version: '0.9.15' + compileOnly 'org.jspecify:jspecify:0.3.0' + testImplementation 'io.github.classgraph:classgraph:4.8.162' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' testImplementation 'org.junit.platform:junit-platform-launcher:1.10.0' diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index e286e123119..432eb848118 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -123,4 +123,6 @@ requires org.eclipse.jgit; uses org.eclipse.jgit.transport.SshSessionFactory; uses org.eclipse.jgit.lib.GpgSigner; + + requires static org.jspecify; } From 22411507a08203152ea80ec79a96162038c64820 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:57:10 +0200 Subject: [PATCH 09/23] Try some jspecify annotations --- src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java index 53151f5fcb9..bb4b81cd528 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -42,6 +42,7 @@ import org.jabref.model.strings.StringUtil; import org.jooq.lambda.Unchecked; +import org.jspecify.annotations.NullMarked; /** * A generic writer for our database. This is independent of the concrete serialization format. @@ -51,6 +52,7 @@ *

* The opposite class is {@link org.jabref.logic.importer.fileformat.BibtexParser} */ +@NullMarked public abstract class BibDatabaseWriter { public enum SaveType { WITH_JABREF_META_DATA, PLAIN_BIBTEX } @@ -130,6 +132,7 @@ private static List> getSaveComparators(SaveOrder saveOrder */ public static List getSortedEntries(List entriesToSort, SaveOrder saveOrder) { Objects.requireNonNull(entriesToSort); + Objects.requireNonNull(saveOrder); List> comparators = getSaveComparators(saveOrder); FieldComparatorStack comparatorStack = new FieldComparatorStack<>(comparators); From 55e85ec0df4edb8b9bc69ab31dfbc433cbc5e116 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 22:57:27 +0200 Subject: [PATCH 10/23] Fix TemplateExporter saveOrder --- .../logic/exporter/TemplateExporter.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java index cdafca1e175..3334ba094ea 100644 --- a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java +++ b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java @@ -30,6 +30,8 @@ import org.jabref.model.entry.types.EntryType; import org.jabref.model.metadata.SaveOrder; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -101,22 +103,14 @@ public TemplateExporter(String name, * @param directory Directory in which to find the layout file. * @param extension Should contain the . (for instance .txt). */ - public TemplateExporter(String displayName, - String consoleName, - String lfFileName, - String directory, - FileType extension, + public TemplateExporter(@NonNull String displayName, + @NonNull String consoleName, + @NonNull String lfFileName, + @Nullable String directory, + @NonNull FileType extension, LayoutFormatterPreferences layoutPreferences, SaveOrder saveOrder) { - super(consoleName, displayName, extension); - if (Objects.requireNonNull(lfFileName).endsWith(LAYOUT_EXTENSION)) { - this.lfFileName = lfFileName.substring(0, lfFileName.length() - LAYOUT_EXTENSION.length()); - } else { - this.lfFileName = lfFileName; - } - this.directory = directory; - this.layoutPreferences = layoutPreferences; - this.saveOrder = saveOrder; + this(displayName, consoleName, lfFileName, directory, extension, layoutPreferences, saveOrder, null); } /** @@ -146,7 +140,7 @@ public TemplateExporter(String displayName, } this.directory = directory; this.layoutPreferences = layoutPreferences; - this.saveOrder = saveOrder; + this.saveOrder = saveOrder == null ? SaveOrder.getDefaultSaveOrder() : saveOrder; this.blankLineBehaviour = blankLineBehaviour; } From 0e4adb3ef773e33779df1520ae25b63c8880c01a Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:11:53 +0200 Subject: [PATCH 11/23] Final fixes --- .../CreateModifyExporterDialogViewModel.java | 2 +- .../autosaveandbackup/BackupManager.java | 3 +- .../jabref/logic/crawler/StudyRepository.java | 9 ++++- .../logic/exporter/ExporterFactory.java | 37 ++++++++++--------- .../jabref/preferences/JabRefPreferences.java | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/CreateModifyExporterDialogViewModel.java b/src/main/java/org/jabref/gui/exporter/CreateModifyExporterDialogViewModel.java index 0fcc7b12fde..7d279d9a609 100644 --- a/src/main/java/org/jabref/gui/exporter/CreateModifyExporterDialogViewModel.java +++ b/src/main/java/org/jabref/gui/exporter/CreateModifyExporterDialogViewModel.java @@ -67,7 +67,7 @@ public ExporterViewModel saveExporter() { layoutFile.get(), extension.get(), preferences.getLayoutFormatterPreferences(), - preferences.getExportConfiguration()); + preferences.getExportConfiguration().getSaveOrder()); format.setCustomExport(true); return new ExporterViewModel(format); } diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index e4d9c3e29db..e3e5805df78 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -30,6 +30,7 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.BibDatabaseContextChangedEvent; import org.jabref.model.entry.BibEntryTypesManager; +import org.jabref.model.metadata.SaveOrder; import org.jabref.preferences.PreferencesService; import com.google.common.eventbus.Subscribe; @@ -225,7 +226,7 @@ void performBackup(Path backupPath) { // code similar to org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase SaveConfiguration saveConfiguration = new SaveConfiguration() .withMakeBackup(false) - .withMetadataSaveOrder(true) + .withSaveOrder(bibDatabaseContext.getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())) .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); Charset encoding = bibDatabaseContext.getMetaData().getEncoding().orElse(StandardCharsets.UTF_8); diff --git a/src/main/java/org/jabref/logic/crawler/StudyRepository.java b/src/main/java/org/jabref/logic/crawler/StudyRepository.java index eac8c5d11c9..6291b94cbbf 100644 --- a/src/main/java/org/jabref/logic/crawler/StudyRepository.java +++ b/src/main/java/org/jabref/logic/crawler/StudyRepository.java @@ -27,6 +27,8 @@ import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntryTypesManager; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.metadata.SaveOrder; import org.jabref.model.study.FetchResult; import org.jabref.model.study.QueryResult; import org.jabref.model.study.Study; @@ -60,6 +62,11 @@ public class StudyRepository { private static final String WORK_BRANCH = "work"; private static final String SEARCH_BRANCH = "search"; + private static final SaveOrder SAVE_ORDER = new SaveOrder(SaveOrder.OrderType.SPECIFIED, + List.of(new SaveOrder.SortCriterion(StandardField.AUTHOR, false), + new SaveOrder.SortCriterion(StandardField.YEAR, true), + new SaveOrder.SortCriterion(StandardField.TITLE, false))); + private final Path repositoryPath; private final Path studyDefinitionFile; private final SlrGitHandler gitHandler; @@ -426,7 +433,7 @@ private void generateCiteKeys(BibDatabaseContext existingEntries, BibDatabase ta private void writeResultToFile(Path pathToFile, BibDatabase entries) throws SaveException { try (AtomicFileWriter fileWriter = new AtomicFileWriter(pathToFile, StandardCharsets.UTF_8)) { SaveConfiguration saveConfiguration = new SaveConfiguration() - .withMetadataSaveOrder(true) + .withSaveOrder(SAVE_ORDER) .withReformatOnSave(preferencesService.getLibraryPreferences().shouldAlwaysReformatOnSave()); BibWriter bibWriter = new BibWriter(fileWriter, OS.NEWLINE); BibtexDatabaseWriter databaseWriter = new BibtexDatabaseWriter( diff --git a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java index 7893a2455c0..59603deaa2a 100644 --- a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java +++ b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java @@ -13,6 +13,7 @@ import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntryTypesManager; +import org.jabref.model.metadata.SaveOrder; import org.jabref.preferences.PreferencesService; public class ExporterFactory { @@ -28,7 +29,7 @@ public static ExporterFactory create(PreferencesService preferencesService, List customFormats = preferencesService.getExportPreferences().getCustomExporters(); LayoutFormatterPreferences layoutPreferences = preferencesService.getLayoutFormatterPreferences(); - SaveConfiguration saveConfiguration = preferencesService.getExportConfiguration(); + SaveOrder saveOrder = preferencesService.getExportConfiguration().getSaveOrder(); XmpPreferences xmpPreferences = preferencesService.getXmpPreferences(); FieldPreferences fieldPreferences = preferencesService.getFieldPreferences(); BibDatabaseMode bibDatabaseMode = preferencesService.getLibraryPreferences().getDefaultBibDatabaseMode(); @@ -36,23 +37,23 @@ public static ExporterFactory create(PreferencesService preferencesService, List exporters = new ArrayList<>(); // Initialize build-in exporters - exporters.add(new TemplateExporter("HTML", "html", "html", null, StandardFileType.HTML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter(Localization.lang("Simple HTML"), "simplehtml", "simplehtml", null, StandardFileType.HTML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("DocBook 5.1", "docbook5", "docbook5", null, StandardFileType.XML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("DocBook 4", "docbook4", "docbook4", null, StandardFileType.XML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("DIN 1505", "din1505", "din1505winword", "din1505", StandardFileType.RTF, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("BibO RDF", "bibordf", "bibordf", null, StandardFileType.RDF, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter(Localization.lang("HTML table"), "tablerefs", "tablerefs", "tablerefs", StandardFileType.HTML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter(Localization.lang("HTML list"), "listrefs", "listrefs", "listrefs", StandardFileType.HTML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter(Localization.lang("HTML table (with Abstract & BibTeX)"), "tablerefsabsbib", "tablerefsabsbib", "tablerefsabsbib", StandardFileType.HTML, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("Harvard RTF", "harvard", "harvard", "harvard", StandardFileType.RTF, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("ISO 690 RTF", "iso690rtf", "iso690RTF", "iso690rtf", StandardFileType.RTF, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("ISO 690", "iso690txt", "iso690", "iso690txt", StandardFileType.TXT, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("Endnote", "endnote", "EndNote", "endnote", StandardFileType.TXT, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("OpenOffice/LibreOffice CSV", "oocsv", "openoffice-csv", "openoffice", StandardFileType.CSV, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("RIS", "ris", "ris", "ris", StandardFileType.RIS, layoutPreferences, saveConfiguration, BlankLineBehaviour.DELETE_BLANKS)); - exporters.add(new TemplateExporter("MIS Quarterly", "misq", "misq", "misq", StandardFileType.RTF, layoutPreferences, saveConfiguration)); - exporters.add(new TemplateExporter("CSL YAML", "yaml", "yaml", null, StandardFileType.YAML, layoutPreferences, saveConfiguration, BlankLineBehaviour.DELETE_BLANKS)); + exporters.add(new TemplateExporter("HTML", "html", "html", null, StandardFileType.HTML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter(Localization.lang("Simple HTML"), "simplehtml", "simplehtml", null, StandardFileType.HTML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("DocBook 5.1", "docbook5", "docbook5", null, StandardFileType.XML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("DocBook 4", "docbook4", "docbook4", null, StandardFileType.XML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("DIN 1505", "din1505", "din1505winword", "din1505", StandardFileType.RTF, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("BibO RDF", "bibordf", "bibordf", null, StandardFileType.RDF, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter(Localization.lang("HTML table"), "tablerefs", "tablerefs", "tablerefs", StandardFileType.HTML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter(Localization.lang("HTML list"), "listrefs", "listrefs", "listrefs", StandardFileType.HTML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter(Localization.lang("HTML table (with Abstract & BibTeX)"), "tablerefsabsbib", "tablerefsabsbib", "tablerefsabsbib", StandardFileType.HTML, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("Harvard RTF", "harvard", "harvard", "harvard", StandardFileType.RTF, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("ISO 690 RTF", "iso690rtf", "iso690RTF", "iso690rtf", StandardFileType.RTF, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("ISO 690", "iso690txt", "iso690", "iso690txt", StandardFileType.TXT, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("Endnote", "endnote", "EndNote", "endnote", StandardFileType.TXT, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("OpenOffice/LibreOffice CSV", "oocsv", "openoffice-csv", "openoffice", StandardFileType.CSV, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("RIS", "ris", "ris", "ris", StandardFileType.RIS, layoutPreferences, saveOrder, BlankLineBehaviour.DELETE_BLANKS)); + exporters.add(new TemplateExporter("MIS Quarterly", "misq", "misq", "misq", StandardFileType.RTF, layoutPreferences, saveOrder)); + exporters.add(new TemplateExporter("CSL YAML", "yaml", "yaml", null, StandardFileType.YAML, layoutPreferences, saveOrder, BlankLineBehaviour.DELETE_BLANKS)); exporters.add(new OpenOfficeDocumentCreator()); exporters.add(new OpenDocumentSpreadsheetCreator()); exporters.add(new MSBibExporter()); diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index d66371df798..1f3d80c2bef 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2287,7 +2287,7 @@ private List getCustomExportFormats() { formatData.get(EXPORTER_FILENAME_INDEX), formatData.get(EXPORTER_EXTENSION_INDEX), layoutPreferences, - saveConfiguration); + saveConfiguration.getSaveOrder()); format.setCustomExport(true); formats.add(format); } From d1c4f24236808b9048f60d6d62e8aa9e099577c5 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:13:56 +0200 Subject: [PATCH 12/23] Fix test --- .../java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java index a3171ede633..88b1273843a 100644 --- a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java +++ b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java @@ -84,7 +84,6 @@ void setUp() { fieldPreferences = new FieldPreferences(true, Collections.emptyList(), Collections.emptyList()); saveConfiguration = mock(SaveConfiguration.class, Answers.RETURNS_DEEP_STUBS); when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - when(saveConfiguration.useMetadataSaveOrder()).thenReturn(true); citationKeyPatternPreferences = mock(CitationKeyPatternPreferences.class, Answers.RETURNS_DEEP_STUBS); entryTypesManager = new BibEntryTypesManager(); stringWriter = new StringWriter(); From a0f78a4a53b96bdc956a536deb4826d82d727822 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:33:38 +0200 Subject: [PATCH 13/23] Compile fixes --- build.gradle | 1 + .../org/jabref/logic/crawler/CrawlerTest.java | 1 - .../StudyCatalogToFetcherConverterTest.java | 1 - .../logic/exporter/CsvExportFormatTest.java | 9 +++------ .../logic/exporter/DocBook5ExporterTest.java | 18 +++++++----------- .../logic/exporter/DocbookExporterTest.java | 5 +---- .../logic/exporter/HtmlExportFormatTest.java | 5 +---- .../logic/exporter/YamlExporterTest.java | 5 +---- 8 files changed, 14 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index 1f6253aa9b8..3f47d9ac3d9 100644 --- a/build.gradle +++ b/build.gradle @@ -215,6 +215,7 @@ dependencies { implementation group: 'org.jooq', name: 'jool', version: '0.9.15' compileOnly 'org.jspecify:jspecify:0.3.0' + testCompileOnly 'org.jspecify:jspecify:0.3.0' testImplementation 'io.github.classgraph:classgraph:4.8.162' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' diff --git a/src/test/java/org/jabref/logic/crawler/CrawlerTest.java b/src/test/java/org/jabref/logic/crawler/CrawlerTest.java index fe63cc22dba..3bb915cf568 100644 --- a/src/test/java/org/jabref/logic/crawler/CrawlerTest.java +++ b/src/test/java/org/jabref/logic/crawler/CrawlerTest.java @@ -72,7 +72,6 @@ public void setUp() throws Exception { importerPreferences = mock(ImporterPreferences.class); saveConfiguration = mock(SaveConfiguration.class, Answers.RETURNS_DEEP_STUBS); when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - when(saveConfiguration.useMetadataSaveOrder()).thenReturn(true); when(importerPreferences.getApiKeys()).thenReturn(FXCollections.emptyObservableSet()); when(importFormatPreferences.bibEntryPreferences().getKeywordSeparator()).thenReturn(','); diff --git a/src/test/java/org/jabref/logic/crawler/StudyCatalogToFetcherConverterTest.java b/src/test/java/org/jabref/logic/crawler/StudyCatalogToFetcherConverterTest.java index 9b73a8ad2d9..e3bee090ebf 100644 --- a/src/test/java/org/jabref/logic/crawler/StudyCatalogToFetcherConverterTest.java +++ b/src/test/java/org/jabref/logic/crawler/StudyCatalogToFetcherConverterTest.java @@ -40,7 +40,6 @@ void setUpMocks() { preferencesService = mock(PreferencesService.class, Answers.RETURNS_DEEP_STUBS); saveConfiguration = mock(SaveConfiguration.class, Answers.RETURNS_DEEP_STUBS); when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - when(saveConfiguration.useMetadataSaveOrder()).thenReturn(true); when(preferencesService.getBibEntryPreferences().getKeywordSeparator()).thenReturn(','); when(preferencesService.getImporterPreferences().getApiKeys()).thenReturn(FXCollections.emptyObservableSet()); diff --git a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java index f551cdec9b0..aaae4763f15 100644 --- a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java @@ -29,9 +29,6 @@ public class CsvExportFormatTest { @BeforeEach public void setUp() { - SaveConfiguration saveConfiguration = mock(SaveConfiguration.class); - when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - exportFormat = new TemplateExporter( "OpenOffice/LibreOffice CSV", "oocsv", @@ -39,7 +36,7 @@ public void setUp() { "openoffice", StandardFileType.CSV, mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS), - saveConfiguration); + SaveOrder.getDefaultSaveOrder()); databaseContext = new BibDatabaseContext(); } @@ -101,8 +98,8 @@ public void testPerformExportForSingleEditor(@TempDir Path testFolder) throws Ex public void testPerformExportForMultipleEditors(@TempDir Path testFolder) throws Exception { Path path = testFolder.resolve("ThisIsARandomlyNamedFile"); File tmpFile = path.toFile(); - BibEntry entry = new BibEntry(); - entry.setField(StandardField.EDITOR, "von Neumann, John and Smith, John and Black Brown, Peter"); + BibEntry entry = new BibEntry() + .withField(StandardField.EDITOR, "von Neumann, John and Smith, John and Black Brown, Peter"); List entries = List.of(entry); exportFormat.export(databaseContext, tmpFile.toPath(), entries); diff --git a/src/test/java/org/jabref/logic/exporter/DocBook5ExporterTest.java b/src/test/java/org/jabref/logic/exporter/DocBook5ExporterTest.java index b46b12c7fdf..da3308f2a96 100644 --- a/src/test/java/org/jabref/logic/exporter/DocBook5ExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/DocBook5ExporterTest.java @@ -29,7 +29,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class DocBook5ExporterTest { @@ -42,9 +41,6 @@ public class DocBook5ExporterTest { @BeforeEach void setUp() throws URISyntaxException { - SaveConfiguration saveConfiguration = mock(SaveConfiguration.class); - when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - exporter = new TemplateExporter( "DocBook 5.1", "docbook5", @@ -52,19 +48,19 @@ void setUp() throws URISyntaxException { null, StandardFileType.XML, mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS), - saveConfiguration); + SaveOrder.getDefaultSaveOrder()); LocalDate myDate = LocalDate.of(2018, 1, 1); xmlFile = Path.of(DocBook5ExporterTest.class.getResource("Docbook5ExportFormat.xml").toURI()); databaseContext = new BibDatabaseContext(); charset = StandardCharsets.UTF_8; - BibEntry entry = new BibEntry(StandardEntryType.Book); - entry.setField(StandardField.TITLE, "my paper title"); - entry.setField(StandardField.AUTHOR, "Stefan Kolb and Tobias Diez"); - entry.setField(StandardField.ISBN, "1-2-34"); - entry.setCitationKey("mykey"); - entry.setDate(new org.jabref.model.entry.Date(myDate)); + BibEntry entry = new BibEntry(StandardEntryType.Book) + .withField(StandardField.TITLE, "my paper title") + .withField(StandardField.AUTHOR, "Stefan Kolb and Tobias Diez") + .withField(StandardField.ISBN, "1-2-34") + .withCitationKey("mykey") + .withDate(new org.jabref.model.entry.Date(myDate)); entries = Collections.singletonList(entry); } diff --git a/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java b/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java index e3b38e8918f..9b6c0cb74f0 100644 --- a/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java @@ -32,9 +32,6 @@ public class DocbookExporterTest { @BeforeEach public void setUp() { - SaveConfiguration saveConfiguration = mock(SaveConfiguration.class); - when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - exportFormat = new TemplateExporter( "DocBook 4", "docbook4", @@ -42,7 +39,7 @@ public void setUp() { null, StandardFileType.XML, mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS), - saveConfiguration); + SaveOrder.getDefaultSaveOrder()); } @Test diff --git a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java index 3f18d4704b1..4b36efedee7 100644 --- a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java @@ -31,16 +31,13 @@ public class HtmlExportFormatTest { @BeforeEach public void setUp() { - SaveConfiguration saveConfiguration = mock(SaveConfiguration.class); - when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - exportFormat = new TemplateExporter("HTML", "html", "html", null, StandardFileType.HTML, mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS), - saveConfiguration); + SaveOrder.getDefaultSaveOrder()); databaseContext = new BibDatabaseContext(); charset = StandardCharsets.UTF_8; diff --git a/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java b/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java index 36f9665b094..ccd648cf840 100644 --- a/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java @@ -29,9 +29,6 @@ public class YamlExporterTest { @BeforeAll static void setUp() { - SaveConfiguration saveConfiguration = mock(SaveConfiguration.class); - when(saveConfiguration.getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); - yamlExporter = new TemplateExporter( "CSL YAML", "yaml", @@ -39,7 +36,7 @@ static void setUp() { null, StandardFileType.YAML, mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS), - saveConfiguration, + SaveOrder.getDefaultSaveOrder(), BlankLineBehaviour.DELETE_BLANKS); databaseContext = new BibDatabaseContext(); From 7a1267b58d3a274492d5e036cd30901ffef1e276 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:42:26 +0200 Subject: [PATCH 14/23] Add CHANGELOG.md entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 212fafd96b1..7bfa87ce439 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -134,6 +134,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We fixed an issue where the ACM Portal search sometimes would not return entries for some search queries when the article author had no given name [#10107](https://github.com/JabRef/jabref/issues/10107) - We fixed an issue that caused high CPU usage and a zombie process after quitting JabRef because of author names autocompletion [#10159](https://github.com/JabRef/jabref/pull/10159) - We fixed an issue where files with illegal characters in the filename could be added to JabRef. [#10182](https://github.com/JabRef/jabref/issues/10182) +- We fixed an issue with JabRef respecting the save order. [#9869](https://github.com/JabRef/jabref/issues/9869) ### Removed From 5efe493fbc8fb2d8de83b227010948ca5db0392c Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:43:07 +0200 Subject: [PATCH 15/23] Fix checkstyle --- src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java | 1 - src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java | 1 - .../java/org/jabref/logic/exporter/HtmlExportFormatTest.java | 1 - src/test/java/org/jabref/logic/exporter/YamlExporterTest.java | 1 - 4 files changed, 4 deletions(-) diff --git a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java index aaae4763f15..53342e7d7fa 100644 --- a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java @@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class CsvExportFormatTest { diff --git a/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java b/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java index 9b6c0cb74f0..23221d0311a 100644 --- a/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/DocbookExporterTest.java @@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class DocbookExporterTest { diff --git a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java index 4b36efedee7..b684e84a2e4 100644 --- a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java @@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class HtmlExportFormatTest { public BibDatabaseContext databaseContext; diff --git a/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java b/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java index ccd648cf840..db42e79dbbc 100644 --- a/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/YamlExporterTest.java @@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class YamlExporterTest { From 99b910014a5bf1110b05b85b45e8d3f5b112e55b Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 28 Aug 2023 23:44:49 +0200 Subject: [PATCH 16/23] Add hint on SLR functionality change --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bfa87ce439..75e1b4d878a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We changed the behavior of group addition/edit, so that sorting by alphabetical order is not performed by default after the modification [#10017](https://github.com/JabRef/jabref/issues/10017) - We fixed an issue with spacing in the cleanup dialogue. [#10081](https://github.com/JabRef/jabref/issues/10081) - The GVK fetcher now uses the new [K10plus](https://www.bszgbv.de/services/k10plus/) database [#10189](https://github.com/JabRef/jabref/pull/10189) +- The SLR feature adds new entries sorted into the new bib file (and not at the end). ### Fixed From d8cdb4e7847d6c48b867581298913eda90836c6e Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:05:26 +0200 Subject: [PATCH 17/23] Refine comment --- src/main/java/org/jabref/gui/auximport/NewSubLibraryAction.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jabref/gui/auximport/NewSubLibraryAction.java b/src/main/java/org/jabref/gui/auximport/NewSubLibraryAction.java index 36c426afb17..65cc37abfd9 100644 --- a/src/main/java/org/jabref/gui/auximport/NewSubLibraryAction.java +++ b/src/main/java/org/jabref/gui/auximport/NewSubLibraryAction.java @@ -11,6 +11,8 @@ /** * The action concerned with generate a new (sub-)database from latex AUX file. + * + * A new library is created by {@link org.jabref.gui.importer.NewDatabaseAction} */ public class NewSubLibraryAction extends SimpleCommand { From 9a0fdc8c93a8adc672a6f9a494a70a4762352855 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:06:00 +0200 Subject: [PATCH 18/23] Fix default selection at library properties --- .../saving/SavingPropertiesViewModel.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index 970e69ca051..b2eb29ee294 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -41,24 +41,23 @@ public class SavingPropertiesViewModel implements PropertiesTabViewModel { private final BibDatabaseContext databaseContext; private final MetaData initialMetaData; - private final SaveOrder exportSaveOrder; + private final SaveOrder saveOrder; private final PreferencesService preferencesService; public SavingPropertiesViewModel(BibDatabaseContext databaseContext, PreferencesService preferencesService) { this.databaseContext = databaseContext; this.preferencesService = preferencesService; this.initialMetaData = databaseContext.getMetaData(); - this.exportSaveOrder = initialMetaData.getSaveOrder() - .orElseGet(() -> preferencesService.getExportPreferences().getExportSaveOrder()); + this.saveOrder = initialMetaData.getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder()); } @Override public void setValues() { libraryProtectedProperty.setValue(initialMetaData.isProtected()); - // SaveOrderConfigPanel + // SaveOrderConfigPanel, included via ?Import - switch (exportSaveOrder.getOrderType()) { + switch (saveOrder.getOrderType()) { case SPECIFIED -> saveInSpecifiedOrderProperty.setValue(true); case ORIGINAL -> saveInOriginalProperty.setValue(true); case TABLE -> saveInTableOrderProperty.setValue(true); @@ -74,11 +73,11 @@ public void setValues() { sortableFieldsProperty.addAll(FieldFactory.getStandardFieldsWithCitationKey()); sortCriteriaProperty.clear(); - sortCriteriaProperty.addAll(exportSaveOrder.getSortCriteria().stream() - .map(SortCriterionViewModel::new) - .toList()); + sortCriteriaProperty.addAll(saveOrder.getSortCriteria().stream() + .map(SortCriterionViewModel::new) + .toList()); - // FieldFormatterCleanupsPanel + // FieldFormatterCleanupsPanel, included via ?Import Optional saveActions = initialMetaData.getSaveActions(); saveActions.ifPresentOrElse(value -> { @@ -120,7 +119,7 @@ public void storeSettings() { SaveOrder.OrderType.fromBooleans(saveInSpecifiedOrderProperty.getValue(), saveInOriginalProperty.getValue()), sortCriteriaProperty.stream().map(SortCriterionViewModel::getCriterion).toList()); - if (!newSaveOrder.equals(exportSaveOrder)) { + if (!newSaveOrder.equals(saveOrder)) { if (newSaveOrder.equals(SaveOrder.getDefaultSaveOrder())) { newMetaData.clearSaveOrder(); } else { From 297b366df14d62a4d18091dc4a13f7166dc8647c Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:11:29 +0200 Subject: [PATCH 19/23] Title should also be ascending --- src/main/java/org/jabref/preferences/JabRefPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 2800b48ca0c..bbeb11005b5 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -587,7 +587,7 @@ private JabRefPreferences() { defaults.put(EXPORT_SECONDARY_SORT_FIELD, StandardField.AUTHOR.getName()); defaults.put(EXPORT_SECONDARY_SORT_DESCENDING, Boolean.FALSE); defaults.put(EXPORT_TERTIARY_SORT_FIELD, StandardField.TITLE.getName()); - defaults.put(EXPORT_TERTIARY_SORT_DESCENDING, Boolean.TRUE); + defaults.put(EXPORT_TERTIARY_SORT_DESCENDING, Boolean.FALSE); defaults.put(NEWLINE, System.lineSeparator()); From 587b40a1cb201c3e7c914b2ba96c66b467ae6384 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:19:39 +0200 Subject: [PATCH 20/23] Nice UI defaults --- .../saving/SavingPropertiesViewModel.java | 12 +++++++++++- .../java/org/jabref/model/metadata/SaveOrder.java | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index b2eb29ee294..3454a83411f 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -1,6 +1,7 @@ package org.jabref.gui.libraryproperties.saving; import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.Set; @@ -18,6 +19,7 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.field.InternalField; +import org.jabref.model.entry.field.StandardField; import org.jabref.model.metadata.MetaData; import org.jabref.model.metadata.SaveOrder; import org.jabref.preferences.CleanupPreferences; @@ -25,6 +27,14 @@ public class SavingPropertiesViewModel implements PropertiesTabViewModel { + private static final SaveOrder UI_DEFAULT_SAVE_ORDER = new SaveOrder(SaveOrder.OrderType.ORIGINAL, List.of( + new SaveOrder.SortCriterion(StandardField.AUTHOR), + new SaveOrder.SortCriterion(StandardField.YEAR), + new SaveOrder.SortCriterion(StandardField.TITLE), + // Pro users generate their citation keys well. They can just delete the above three proposals and get a well-sorted library. + new SaveOrder.SortCriterion(InternalField.KEY_FIELD) + )); + private final BooleanProperty protectDisableProperty = new SimpleBooleanProperty(); private final BooleanProperty libraryProtectedProperty = new SimpleBooleanProperty(); @@ -48,7 +58,7 @@ public SavingPropertiesViewModel(BibDatabaseContext databaseContext, Preferences this.databaseContext = databaseContext; this.preferencesService = preferencesService; this.initialMetaData = databaseContext.getMetaData(); - this.saveOrder = initialMetaData.getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder()); + this.saveOrder = initialMetaData.getSaveOrder().orElse(UI_DEFAULT_SAVE_ORDER); } @Override diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index a0f63d8c30e..8d263d68d2d 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -128,7 +128,13 @@ public static class SortCriterion { public final boolean descending; /** - * + * Given field sorted ascending + */ + public SortCriterion(Field field) { + this(field, false); + } + + /** * @param field The field * @param descending Must be a boolean value as string, e.g. "true", "false" */ From 7d59614af1fa823e334a065ca5305ea5343f91e0 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:31:21 +0200 Subject: [PATCH 21/23] Refine comment --- .../libraryproperties/saving/SavingPropertiesViewModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index 3454a83411f..074f92fbb54 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -65,7 +65,7 @@ public SavingPropertiesViewModel(BibDatabaseContext databaseContext, Preferences public void setValues() { libraryProtectedProperty.setValue(initialMetaData.isProtected()); - // SaveOrderConfigPanel, included via ?Import + // SaveOrderConfigPanel, included via in FXML switch (saveOrder.getOrderType()) { case SPECIFIED -> saveInSpecifiedOrderProperty.setValue(true); @@ -87,7 +87,7 @@ public void setValues() { .map(SortCriterionViewModel::new) .toList()); - // FieldFormatterCleanupsPanel, included via ?Import + // FieldFormatterCleanupsPanel, included via in FXML Optional saveActions = initialMetaData.getSaveActions(); saveActions.ifPresentOrElse(value -> { From 4565b7fc2cb85413a03e938a3963c627088d2527 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 00:32:17 +0200 Subject: [PATCH 22/23] Fix typo --- .../libraryproperties/saving/SavingPropertiesViewModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index 074f92fbb54..9e01a3a76eb 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -65,7 +65,7 @@ public SavingPropertiesViewModel(BibDatabaseContext databaseContext, Preferences public void setValues() { libraryProtectedProperty.setValue(initialMetaData.isProtected()); - // SaveOrderConfigPanel, included via in FXML + // SaveOrderConfigPanel, included via in FXML switch (saveOrder.getOrderType()) { case SPECIFIED -> saveInSpecifiedOrderProperty.setValue(true); @@ -87,7 +87,7 @@ public void setValues() { .map(SortCriterionViewModel::new) .toList()); - // FieldFormatterCleanupsPanel, included via in FXML + // FieldFormatterCleanupsPanel, included via in FXML Optional saveActions = initialMetaData.getSaveActions(); saveActions.ifPresentOrElse(value -> { From f7979881b431f49f811dd35258cef87c843a279e Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 01:02:09 +0200 Subject: [PATCH 23/23] Revert observability of SaveOrder --- .../org/jabref/model/metadata/SaveOrder.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 8d263d68d2d..2161d7526c5 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -4,11 +4,6 @@ import java.util.List; import java.util.Objects; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; - import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; @@ -24,12 +19,12 @@ public class SaveOrder { private static final Logger LOGGER = LoggerFactory.getLogger(SaveOrder.class); - private final ObservableList sortCriteria; - private final ObjectProperty orderType; + private final OrderType orderType; + private final List sortCriteria; public SaveOrder(OrderType orderType, List sortCriteria) { - this.orderType = new SimpleObjectProperty<>(orderType); - this.sortCriteria = FXCollections.observableArrayList(sortCriteria); + this.orderType = orderType; + this.sortCriteria = sortCriteria; } private SaveOrder(List data) { @@ -48,18 +43,18 @@ private SaveOrder(List data) { orderType = OrderType.SPECIFIED; } else { LOGGER.warn("Could not parse sort order: {}", data.get(0)); - this.sortCriteria = FXCollections.observableArrayList(); - this.orderType = new SimpleObjectProperty<>(OrderType.ORIGINAL); + this.sortCriteria = List.of(); + this.orderType = OrderType.ORIGINAL; return; } } - this.orderType = new SimpleObjectProperty<>(orderType); + this.orderType = orderType; List sortCriteria = new ArrayList<>(data.size() / 2); for (int index = 1; index < data.size(); index = index + 2) { sortCriteria.add(new SortCriterion(FieldFactory.parseField(data.get(index)), data.get(index + 1))); } - this.sortCriteria = FXCollections.observableArrayList(sortCriteria); + this.sortCriteria = sortCriteria; } public static SaveOrder parse(List orderedData) { @@ -71,10 +66,10 @@ public static SaveOrder getDefaultSaveOrder() { } public OrderType getOrderType() { - return orderType.get(); + return orderType; } - public ObservableList getSortCriteria() { + public List getSortCriteria() { return sortCriteria; } @@ -107,7 +102,7 @@ public String toString() { */ public List getAsStringList() { List res = new ArrayList<>(7); - if (orderType.get() == OrderType.ORIGINAL) { + if (orderType == OrderType.ORIGINAL) { res.add(OrderType.ORIGINAL.toString()); } else { res.add(OrderType.SPECIFIED.toString());