From 593edda98a969f28b658a2e8ad7d525d370c1f00 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 09:22:35 +0200 Subject: [PATCH 01/31] Inline LOGGER.debug --- .../org/jabref/gui/maintable/MainTable.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.java b/src/main/java/org/jabref/gui/maintable/MainTable.java index 8ea7731ba3d..e9e7ae33964 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.java +++ b/src/main/java/org/jabref/gui/maintable/MainTable.java @@ -144,25 +144,15 @@ public MainTable(MainTableDataModel model, this.getSortOrder().clear(); - /* KEEP for debugging purposes - for (var colModel : mainTablePreferences.getColumnPreferences().getColumnSortOrder()) { - for (var col : this.getColumns()) { - var tablecColModel = ((MainTableColumn) col).getModel(); - if (tablecColModel.equals(colModel)) { - LOGGER.debug("Adding sort order for col {} ", col); - this.getSortOrder().add(col); - break; - } - } - } - */ - mainTablePreferences.getColumnPreferences().getColumnSortOrder().forEach(columnModel -> this.getColumns().stream() .map(column -> (MainTableColumn) column) .filter(column -> column.getModel().equals(columnModel)) .findFirst() - .ifPresent(column -> this.getSortOrder().add(column))); + .ifPresent(column -> { + LOGGER.debug("Adding sort order for col {} ", column); + this.getSortOrder().add(column); + })); if (mainTablePreferences.getResizeColumnsToFit()) { this.setColumnResizePolicy(new SmartConstrainedResizePolicy()); From 2ab1c65e7343a2c62a56e56395477375b8d59d42 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 09:22:49 +0200 Subject: [PATCH 02/31] Move out work in constructor to method --- .../java/org/jabref/gui/maintable/MainTable.java | 2 +- .../maintable/PersistenceVisualStateTable.java | 15 ++++++++++----- .../org/jabref/gui/search/SearchResultsTable.java | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.java b/src/main/java/org/jabref/gui/maintable/MainTable.java index e9e7ae33964..8a70320fc31 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.java +++ b/src/main/java/org/jabref/gui/maintable/MainTable.java @@ -168,7 +168,7 @@ public MainTable(MainTableDataModel model, this.getStylesheets().add(MainTable.class.getResource("MainTable.css").toExternalForm()); // Store visual state - new PersistenceVisualStateTable(this, mainTablePreferences.getColumnPreferences()); + new PersistenceVisualStateTable(this, mainTablePreferences.getColumnPreferences()).addListeners(); setupKeyBindings(keyBindingRepository); diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index eed6c608124..c597be567a0 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -15,19 +15,24 @@ public class PersistenceVisualStateTable { protected final TableView table; protected final ColumnPreferences preferences; - public PersistenceVisualStateTable(final TableView table, ColumnPreferences preferences) { + public PersistenceVisualStateTable(TableView table, ColumnPreferences preferences) { this.table = table; this.preferences = preferences; + } + public void addListeners() { table.getColumns().addListener((InvalidationListener) obs -> updateColumns()); table.getSortOrder().addListener((InvalidationListener) obs -> updateSortOrder()); // As we store the ColumnModels of the MainTable, we need to add the listener to the ColumnModel properties, // since the value is bound to the model after the listener to the column itself is called. - table.getColumns().forEach(col -> - ((MainTableColumn) col).getModel().widthProperty().addListener(obs -> updateColumns())); - table.getColumns().forEach(col -> - ((MainTableColumn) col).getModel().sortTypeProperty().addListener(obs -> updateColumns())); + + table.getColumns().stream() + .map(col -> ((MainTableColumn) col).getModel()) + .forEach(model -> { + model.widthProperty().addListener(obs -> updateColumns()); + model.sortTypeProperty().addListener(obs -> updateColumns()); + }); } /** diff --git a/src/main/java/org/jabref/gui/search/SearchResultsTable.java b/src/main/java/org/jabref/gui/search/SearchResultsTable.java index bfe8aa3d84d..5d839d2a4a1 100644 --- a/src/main/java/org/jabref/gui/search/SearchResultsTable.java +++ b/src/main/java/org/jabref/gui/search/SearchResultsTable.java @@ -66,7 +66,7 @@ public SearchResultsTable(SearchResultsTableDataModel model, this.getStylesheets().add(MainTable.class.getResource("MainTable.css").toExternalForm()); // Store visual state - new PersistenceVisualStateTable(this, preferencesService.getSearchDialogColumnPreferences()); + new PersistenceVisualStateTable(this, preferencesService.getSearchDialogColumnPreferences()).addListeners(); database.getDatabase().registerListener(this); } From e999722c9069effcb98a5beb5a9993ae75acce6f Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 17:26:28 +0200 Subject: [PATCH 03/31] Streamline code --- .../org/jabref/gui/maintable/MainTable.java | 2 +- .../PersistenceVisualStateTable.java | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.java b/src/main/java/org/jabref/gui/maintable/MainTable.java index 8a70320fc31..08347229605 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.java +++ b/src/main/java/org/jabref/gui/maintable/MainTable.java @@ -188,6 +188,7 @@ public MainTable(MainTableDataModel model, libraryTab.getUndoManager(), dialogService, stateManager); + // Enable the header right-click menu. new MainTableHeaderContextMenu(this, rightClickMenuFactory).show(true); } @@ -198,7 +199,6 @@ public MainTable(MainTableDataModel model, * @param sortedColumn The sorted column in {@link MainTable} * @param keyEvent The pressed character */ - private void jumpToSearchKey(TableColumn sortedColumn, KeyEvent keyEvent) { if ((keyEvent.getCharacter() == null) || (sortedColumn == null)) { return; diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index c597be567a0..3613c7bd968 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -1,8 +1,10 @@ package org.jabref.gui.maintable; +import java.util.List; import java.util.stream.Collectors; import javafx.beans.InvalidationListener; +import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import org.jabref.gui.maintable.columns.MainTableColumn; @@ -36,25 +38,28 @@ public void addListeners() { } /** - * Stores shown columns, their width and their sortType in preferences. + * Stores shown columns, their width and their {@link TableColumn.SortType} in preferences. + * The conversion to the "real" string in the preferences is made at + * {@link org.jabref.preferences.JabRefPreferences#getColumnSortTypesAsStringList(ColumnPreferences)} */ private void updateColumns() { - preferences.setColumns( - table.getColumns().stream() - .filter(col -> col instanceof MainTableColumn) - .map(column -> ((MainTableColumn) column).getModel()) - .collect(Collectors.toList())); + preferences.setColumns(toList(table.getColumns())); } /** - * Stores the SortOrder of the Table in the preferences. Cannot be combined with updateColumns, because JavaFX - * would provide just an empty list for the sort order on other changes. + * Stores the SortOrder of the Table in the preferences. This includes {@link TableColumn.SortType}. + *
+ * Cannot be combined with updateColumns, because JavaFX would provide just an empty list for the sort order + * on other changes. */ private void updateSortOrder() { - preferences.setColumnSortOrder( - table.getSortOrder().stream() - .filter(col -> col instanceof MainTableColumn) - .map(column -> ((MainTableColumn) column).getModel()) - .collect(Collectors.toList())); + preferences.setColumnSortOrder(toList(table.getSortOrder())); + } + + private List toList(List> columns) { + return columns.stream() + .filter(col -> col instanceof MainTableColumn) + .map(column -> ((MainTableColumn) column).getModel()) + .collect(Collectors.toList()); } } From 7740b6a8730eae2a707df1b0d38bf4cc4edb1227 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 20:39:33 +0200 Subject: [PATCH 04/31] Same comments --- .../org/jabref/logic/exporter/BibDatabaseWriter.java | 1 + src/main/java/org/jabref/model/metadata/SaveOrder.java | 10 ++++++++-- 2 files changed, 9 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 80be19dcc57..816cb5677c4 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -70,6 +70,7 @@ public BibDatabaseWriter(BibWriter bibWriter, this.saveConfiguration = saveConfiguration; this.keyPatternPreferences = keyPatternPreferences; this.entryTypesManager = entryTypesManager; + assert saveConfiguration.getSaveOrder().getOrderType() != SaveOrder.OrderType.TABLE; } private static List applySaveActions(List toChange, MetaData metaData) { diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 2161d7526c5..8c0143ca0fa 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -11,9 +11,15 @@ import org.slf4j.LoggerFactory; /** - * Stores the save order config from MetaData + * Stores the save order config for a library *

- * Format: <choice>, a pair of field + ascending (boolean) + * Format: <choice> ({@link OrderType}, a pair of {@link Field} + descending (boolean) + *

+ *

+ * Note that {@link OrderType#TABLE} can only be used as "intermediate" setting. When passing SaveOrder + * to {@link org.jabref.logic.exporter.BibDatabaseWriter}, the orderType must be different. Reason: The writer + * does not have access to the UI. + *

*/ public class SaveOrder { From d31f54c2ee08a3442d7d3916dec7eb986684dd0d Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 20:39:46 +0200 Subject: [PATCH 05/31] Fix variable name --- .../org/jabref/logic/autosaveandbackup/BackupManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index e3e5805df78..83725001ee6 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -215,11 +215,11 @@ void performBackup(Path backupPath) { // We opted for "while" to delete backups in case there are more than 10 while (backupFilesQueue.size() >= MAXIMUM_BACKUP_FILE_COUNT) { - Path lessRecentBackupFile = backupFilesQueue.poll(); + Path oldestBackupFile = backupFilesQueue.poll(); try { - Files.delete(lessRecentBackupFile); + Files.delete(oldestBackupFile); } catch (IOException e) { - LOGGER.error("Could not delete backup file {}", lessRecentBackupFile, e); + LOGGER.error("Could not delete backup file {}", oldestBackupFile, e); } } From c93b0c7554bc4cba022770f8a850914e80b87a41 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Aug 2023 20:40:23 +0200 Subject: [PATCH 06/31] "Flatten" SaveOrder if OrderType.TABLE --- .../gui/exporter/SaveDatabaseAction.java | 21 ++++++++++++++----- .../autosaveandbackup/BackupManager.java | 13 +++++++++++- .../jabref/preferences/JabRefPreferences.java | 3 ++- .../preferences/PreferencesService.java | 3 +++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index f56852c25a8..0cd46854056 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -90,11 +90,24 @@ public boolean saveAs(Path file) { return this.saveAs(file, SaveDatabaseMode.NORMAL); } + private SaveOrder getSaveOrder() { + return libraryTab.getBibDatabaseContext() + .getMetaData().getSaveOrder() + .map(so -> { + if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { + // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences + return preferences.getTableSaveOrder(); + } else { + return so; + } + }) + .orElse(SaveOrder.getDefaultSaveOrder()); + } + public void saveSelectedAsPlain() { askForSavePath().ifPresent(path -> { try { - saveDatabase(path, true, StandardCharsets.UTF_8, BibDatabaseWriter.SaveType.PLAIN_BIBTEX, - libraryTab.getBibDatabaseContext().getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())); + saveDatabase(path, true, StandardCharsets.UTF_8, BibDatabaseWriter.SaveType.PLAIN_BIBTEX, getSaveOrder()); frame.getFileHistory().newFile(path); dialogService.notify(Localization.lang("Saved selected to '%0'.", path.toString())); } catch (SaveException ex) { @@ -211,9 +224,7 @@ private boolean save(Path targetPath, SaveDatabaseMode mode) { // Make sure to remember which encoding we used 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, - libraryTab.getBibDatabaseContext().getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())); + boolean success = saveDatabase(targetPath, false, encoding, BibDatabaseWriter.SaveType.WITH_JABREF_META_DATA, getSaveOrder()); if (success) { libraryTab.getUndoManager().markUnchanged(); diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 83725001ee6..6e0c05180b5 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -224,9 +224,20 @@ void performBackup(Path backupPath) { } // code similar to org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase + SaveOrder saveOrder = bibDatabaseContext + .getMetaData().getSaveOrder() + .map(so -> { + if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { + // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences + return preferences.getTableSaveOrder(); + } else { + return so; + } + }) + .orElse(SaveOrder.getDefaultSaveOrder()); SaveConfiguration saveConfiguration = new SaveConfiguration() .withMakeBackup(false) - .withSaveOrder(bibDatabaseContext.getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())) + .withSaveOrder(saveOrder) .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); Charset encoding = bibDatabaseContext.getMetaData().getEncoding().orElse(StandardCharsets.UTF_8); diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index e48e39553c1..f5c47356b19 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2255,7 +2255,8 @@ private void storeExportSaveOrder(SaveOrder saveOrder) { putBoolean(EXPORT_TERTIARY_SORT_DESCENDING, saveOrder.getSortCriteria().get(2).descending); } - private SaveOrder getTableSaveOrder() { + @Override + public SaveOrder getTableSaveOrder() { List sortOrder = mainTableColumnPreferences.getColumnSortOrder(); List criteria = new ArrayList<>(); diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index 0150a4314d2..cea31b66526 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -33,6 +33,7 @@ import org.jabref.logic.util.io.AutoLinkPreferences; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.entry.BibEntryTypesManager; +import org.jabref.model.metadata.SaveOrder; public interface PreferencesService { @@ -70,6 +71,8 @@ public interface PreferencesService { ImportFormatPreferences getImportFormatPreferences(); + SaveOrder getTableSaveOrder(); + SaveConfiguration getExportConfiguration(); BibEntryTypesManager getCustomEntryTypesRepository(); From 4e679dc104defe46441e364b0041c7bad3f64c78 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 30 Aug 2023 10:58:28 +0200 Subject: [PATCH 07/31] WIP: Show diff in UI --- .../MetadataChangeDetailsView.java | 10 +-- .../logic/bibtex/comparator/MetaDataDiff.java | 69 ++++++++----------- .../model/metadata/ContentSelectors.java | 9 +++ 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java b/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java index cddcdf32e2d..954a0e2b867 100644 --- a/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java +++ b/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java @@ -17,8 +17,10 @@ public MetadataChangeDetailsView(MetadataChange metadataChange, PreferencesServi header.getStyleClass().add("sectionHeader"); container.getChildren().add(header); - for (MetaDataDiff.Difference change : metadataChange.getMetaDataDiff().getDifferences(preferencesService)) { - container.getChildren().add(new Label(getDifferenceString(change))); + for (MetaDataDiff.Difference diff : metadataChange.getMetaDataDiff().getDifferences(preferencesService)) { + container.getChildren().add(new Label(getDifferenceString(diff.differenceType()))); + container.getChildren().add(new Label(diff.originalObject().toString())); + container.getChildren().add(new Label(diff.newObject().toString())); } setLeftAnchor(container, 8d); @@ -29,8 +31,8 @@ public MetadataChangeDetailsView(MetadataChange metadataChange, PreferencesServi getChildren().setAll(container); } - private String getDifferenceString(MetaDataDiff.Difference change) { - return switch (change) { + private String getDifferenceString(MetaDataDiff.DifferenceType changeType) { + return switch (changeType) { case PROTECTED -> Localization.lang("Library protection"); case GROUPS_ALTERED -> 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 a1805862508..ef0786bc1dc 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java @@ -1,6 +1,7 @@ package org.jabref.logic.bibtex.comparator; -import java.util.EnumSet; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -8,7 +9,7 @@ import org.jabref.preferences.PreferencesService; public class MetaDataDiff { - public enum Difference { + public enum DifferenceType { PROTECTED, GROUPS_ALTERED, ENCODING, @@ -23,6 +24,9 @@ public enum Difference { CONTENT_SELECTOR } + public record Difference(DifferenceType differenceType, Object originalObject, Object newObject) { + } + private final Optional groupDiff; private final MetaData originalMetaData; private final MetaData newMetaData; @@ -41,50 +45,31 @@ public static Optional compare(MetaData originalMetaData, MetaData } } + private void addToListIfDiff(List changes, DifferenceType differenceType, Object originalObject, Object newObject) { + if (!Objects.equals(originalObject, newObject)) { + changes.add(new Difference(differenceType, originalObject, newObject)); + } + } + /** * Should be kept in sync with {@link MetaData#equals(Object)} */ - public EnumSet getDifferences(PreferencesService preferences) { - EnumSet changes = EnumSet.noneOf(Difference.class); - - if (originalMetaData.isProtected() != newMetaData.isProtected()) { - changes.add(Difference.PROTECTED); - } - if (!Objects.equals(originalMetaData.getGroups(), newMetaData.getGroups())) { - changes.add(Difference.GROUPS_ALTERED); - } - if (!Objects.equals(originalMetaData.getEncoding(), newMetaData.getEncoding())) { - changes.add(Difference.ENCODING); - } - if (!Objects.equals(originalMetaData.getSaveOrder(), newMetaData.getSaveOrder())) { - changes.add(Difference.SAVE_SORT_ORDER); - } - if (!Objects.equals( + public List getDifferences(PreferencesService preferences) { + List changes = new ArrayList<>(); + addToListIfDiff(changes, DifferenceType.PROTECTED, originalMetaData.isProtected(), newMetaData.isProtected()); + addToListIfDiff(changes, DifferenceType.GROUPS_ALTERED, originalMetaData.getGroups(), newMetaData.getGroups()); + addToListIfDiff(changes, DifferenceType.ENCODING, originalMetaData.getEncoding(), newMetaData.getEncoding()); + addToListIfDiff(changes, DifferenceType.SAVE_SORT_ORDER, originalMetaData.getSaveOrder(), newMetaData.getSaveOrder()); + addToListIfDiff(changes, DifferenceType.KEY_PATTERNS, originalMetaData.getCiteKeyPattern(preferences.getCitationKeyPatternPreferences().getKeyPattern()), - newMetaData.getCiteKeyPattern(preferences.getCitationKeyPatternPreferences().getKeyPattern()))) { - changes.add(Difference.KEY_PATTERNS); - } - if (!Objects.equals(originalMetaData.getUserFileDirectories(), newMetaData.getUserFileDirectories())) { - changes.add(Difference.USER_FILE_DIRECTORY); - } - if (!Objects.equals(originalMetaData.getLatexFileDirectories(), newMetaData.getLatexFileDirectories())) { - changes.add(Difference.LATEX_FILE_DIRECTORY); - } - if (!Objects.equals(originalMetaData.getDefaultCiteKeyPattern(), newMetaData.getDefaultCiteKeyPattern())) { - changes.add(Difference.DEFAULT_KEY_PATTERN); - } - if (!Objects.equals(originalMetaData.getSaveActions(), newMetaData.getSaveActions())) { - changes.add(Difference.SAVE_ACTIONS); - } - if (!originalMetaData.getMode().equals(newMetaData.getMode())) { - changes.add(Difference.MODE); - } - if (!Objects.equals(originalMetaData.getDefaultFileDirectory(), newMetaData.getDefaultFileDirectory())) { - changes.add(Difference.GENERAL_FILE_DIRECTORY); - } - if (!Objects.equals(originalMetaData.getContentSelectors(), newMetaData.getContentSelectors())) { - changes.add(Difference.CONTENT_SELECTOR); - } + newMetaData.getCiteKeyPattern(preferences.getCitationKeyPatternPreferences().getKeyPattern())); + addToListIfDiff(changes, DifferenceType.USER_FILE_DIRECTORY, originalMetaData.getUserFileDirectories(), newMetaData.getUserFileDirectories()); + addToListIfDiff(changes, DifferenceType.LATEX_FILE_DIRECTORY, originalMetaData.getLatexFileDirectories(), newMetaData.getLatexFileDirectories()); + addToListIfDiff(changes, DifferenceType.DEFAULT_KEY_PATTERN, originalMetaData.getDefaultCiteKeyPattern(), newMetaData.getDefaultCiteKeyPattern()); + addToListIfDiff(changes, DifferenceType.SAVE_ACTIONS, originalMetaData.getSaveActions(), newMetaData.getSaveActions()); + addToListIfDiff(changes, DifferenceType.MODE, originalMetaData.getMode(), newMetaData.getMode()); + addToListIfDiff(changes, DifferenceType.GENERAL_FILE_DIRECTORY, originalMetaData.getDefaultFileDirectory(), newMetaData.getDefaultFileDirectory()); + addToListIfDiff(changes, DifferenceType.CONTENT_SELECTOR, originalMetaData.getContentSelectors(), newMetaData.getContentSelectors()); return changes; } diff --git a/src/main/java/org/jabref/model/metadata/ContentSelectors.java b/src/main/java/org/jabref/model/metadata/ContentSelectors.java index d8c70e565ee..a59c15169f7 100644 --- a/src/main/java/org/jabref/model/metadata/ContentSelectors.java +++ b/src/main/java/org/jabref/model/metadata/ContentSelectors.java @@ -86,4 +86,13 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(contentSelectors); } + + @Override + public String toString() { + return "ContentSelectors{" + + "contentSelectors=" + contentSelectors + + ", fieldsWithSelectors=" + getFieldsWithSelectors() + + '}'; + } + } From d5a8a6aa92c618a4cdf44d73db7c3d019763508d Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 30 Aug 2023 23:35:09 +0200 Subject: [PATCH 08/31] Make it scrollable Co-authored-by: Christoph Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> --- .../metedatachange/MetadataChangeDetailsView.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java b/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java index 954a0e2b867..3c2a81e3e01 100644 --- a/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java +++ b/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java @@ -1,6 +1,7 @@ package org.jabref.gui.collab.metedatachange; import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import org.jabref.gui.collab.DatabaseChangeDetailsView; @@ -23,12 +24,14 @@ public MetadataChangeDetailsView(MetadataChange metadataChange, PreferencesServi container.getChildren().add(new Label(diff.newObject().toString())); } - setLeftAnchor(container, 8d); - setTopAnchor(container, 8d); - setRightAnchor(container, 8d); - setBottomAnchor(container, 8d); + ScrollPane scrollPane = new ScrollPane(container); + scrollPane.setFitToWidth(true); + getChildren().setAll(scrollPane); - getChildren().setAll(container); + setLeftAnchor(scrollPane, 8d); + setTopAnchor(scrollPane, 8d); + setRightAnchor(scrollPane, 8d); + setBottomAnchor(scrollPane, 8d); } private String getDifferenceString(MetaDataDiff.DifferenceType changeType) { From dad6375eef74c3e425ad08bdfc4fcd31c1f02ef5 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 30 Aug 2023 23:54:38 +0200 Subject: [PATCH 09/31] WIP: Try to fix content selector diff Co-authored-by: Christoph --- .../ContentSelectorViewModel.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/org/jabref/gui/libraryproperties/contentselectors/ContentSelectorViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/contentselectors/ContentSelectorViewModel.java index a397170c92b..db23506e8fd 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/contentselectors/ContentSelectorViewModel.java +++ b/src/main/java/org/jabref/gui/libraryproperties/contentselectors/ContentSelectorViewModel.java @@ -5,6 +5,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -67,12 +68,35 @@ public void setValues() { @Override public void storeSettings() { List metaDataFields = metaData.getContentSelectors().getFieldsWithSelectors(); + + if (isDefaultMap(fieldKeywordsMap)) { + Iterator iterator = metaData.getContentSelectors().getContentSelectors().iterator(); + while (iterator.hasNext()) { + metaData.clearContentSelectors(iterator.next().getField()); + } + } + fieldKeywordsMap.forEach((field, keywords) -> updateMetaDataContentSelector(metaDataFields, field, keywords)); List fieldNamesToRemove = filterFieldsToRemove(); fieldNamesToRemove.forEach(metaData::clearContentSelectors); } + private boolean isDefaultMap(Map> fieldKeywordsMap) { + if (fieldKeywordsMap.size() != DEFAULT_FIELD_NAMES.size()) { + return false; + } + for (Field field : DEFAULT_FIELD_NAMES) { + if (!fieldKeywordsMap.containsKey(field)) { + return false; + } + if (!fieldKeywordsMap.get(field).isEmpty()) { + return false; + } + } + return true; + } + public ListProperty getFieldNamesBackingList() { return fields; } From c6620b2a081c1d85deff3c51029b29436d7a7181 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 14:55:45 +0200 Subject: [PATCH 10/31] Add some debugging --- .../jabref/gui/maintable/PersistenceVisualStateTable.java | 6 ++++++ src/main/resources/tinylog.properties | 1 + 2 files changed, 7 insertions(+) diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index 3613c7bd968..297688486e9 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -8,12 +8,16 @@ import javafx.scene.control.TableView; import org.jabref.gui.maintable.columns.MainTableColumn; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Keep track of changes made to the columns (reordering, resorting, resizing). */ public class PersistenceVisualStateTable { + private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceVisualStateTable.class); + protected final TableView table; protected final ColumnPreferences preferences; @@ -43,6 +47,7 @@ public void addListeners() { * {@link org.jabref.preferences.JabRefPreferences#getColumnSortTypesAsStringList(ColumnPreferences)} */ private void updateColumns() { + LOGGER.debug("Updating columns"); preferences.setColumns(toList(table.getColumns())); } @@ -53,6 +58,7 @@ private void updateColumns() { * on other changes. */ private void updateSortOrder() { + LOGGER.debug("Updating sort order"); preferences.setColumnSortOrder(toList(table.getSortOrder())); } diff --git a/src/main/resources/tinylog.properties b/src/main/resources/tinylog.properties index b4340fa32e9..9eecb7934bd 100644 --- a/src/main/resources/tinylog.properties +++ b/src/main/resources/tinylog.properties @@ -7,3 +7,4 @@ writerAzure = application insights exception = strip: jdk.internal #level@org.jabref.model.entry.BibEntry = debug +level@org.jabref.gui.maintable.PersistenceVisualStateTable = debug From 5aa691784d4403684097d4f19f05928f12831fb3 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 15:45:08 +0200 Subject: [PATCH 11/31] Update preferences immediatly after change (and not sometime later) --- .../org/jabref/gui/maintable/PersistenceVisualStateTable.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index 297688486e9..3288928a32d 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import javafx.beans.InvalidationListener; +import javafx.collections.ListChangeListener; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; @@ -28,7 +29,7 @@ public PersistenceVisualStateTable(TableView table, Colu public void addListeners() { table.getColumns().addListener((InvalidationListener) obs -> updateColumns()); - table.getSortOrder().addListener((InvalidationListener) obs -> updateSortOrder()); + table.getSortOrder().addListener((ListChangeListener) obs -> updateSortOrder()); // As we store the ColumnModels of the MainTable, we need to add the listener to the ColumnModel properties, // since the value is bound to the model after the listener to the column itself is called. From 81bddcf91c07696a477129c4a6b99c5a4bc89201 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 15:51:39 +0200 Subject: [PATCH 12/31] Fix serialization of SaveOrder --- src/main/java/org/jabref/model/metadata/SaveOrder.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 8c0143ca0fa..5da5767f558 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -108,11 +108,7 @@ public String toString() { */ public List getAsStringList() { List res = new ArrayList<>(7); - if (orderType == OrderType.ORIGINAL) { - res.add(OrderType.ORIGINAL.toString()); - } else { - res.add(OrderType.SPECIFIED.toString()); - } + res.add(orderType.toString()); for (SortCriterion sortCriterion : sortCriteria) { res.add(sortCriterion.field.getName()); From fec58652a3a264f5d69d3bce1126945f3f6dafac Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 16:12:46 +0200 Subject: [PATCH 13/31] Add CHANGELOG.md entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be578c2ac74..41fea0ac8a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -136,6 +136,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - 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 that when editing groups, checked-out properties such as case sensitive and regular expression (under "Free search expression") were not displayed checked. [#10108](https://github.com/JabRef/jabref/issues/10108) +- It is possible again to use "current table sort order" for the order of entries when saving. [#](isDebugEnabled) ### Removed From ac512d9d57722fcbd023d418a7319700e070bb10 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 16:22:52 +0200 Subject: [PATCH 14/31] Fix mapping of SaveOrderConfig --- src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java | 2 +- .../java/org/jabref/logic/autosaveandbackup/BackupManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 0cd46854056..873ebccdd5e 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -96,7 +96,7 @@ private SaveOrder getSaveOrder() { .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return preferences.getTableSaveOrder(); + return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); } else { return so; } diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 6e0c05180b5..7eaa077dcd4 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -229,7 +229,7 @@ void performBackup(Path backupPath) { .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return preferences.getTableSaveOrder(); + return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); } else { return so; } From 8190d96f2115765ead715760b423416658ceaac0 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 18:30:58 +0200 Subject: [PATCH 15/31] Introduce SelfContainedSaveOrder --- .../jabref/gui/exporter/SaveDatabaseAction.java | 5 ++++- .../jabref/logic/exporter/BibDatabaseWriter.java | 3 ++- .../java/org/jabref/model/metadata/SaveOrder.java | 4 ++-- .../model/metadata/SelfContainedSaveOrder.java | 15 +++++++++++++++ .../bibtex/comparator/FieldComparatorTest.java | 5 +++++ 5 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 873ebccdd5e..eff2c2ca41a 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -6,6 +6,7 @@ import java.nio.charset.UnsupportedCharsetException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -36,8 +37,10 @@ import org.jabref.logic.util.StandardFileType; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.ChangePropagation; +import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.preferences.PreferencesService; import org.slf4j.Logger; @@ -242,7 +245,7 @@ private boolean save(Path targetPath, SaveDatabaseMode mode) { } } - private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, BibDatabaseWriter.SaveType saveType, SaveOrder saveOrder) throws SaveException { + private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, BibDatabaseWriter.SaveType saveType, SelfContainedSaveOrder saveOrder) throws SaveException { // if this code is adapted, please also adapt org.jabref.logic.autosaveandbackup.BackupManager.performBackup SaveConfiguration saveConfiguration = new SaveConfiguration() diff --git a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java index 816cb5677c4..e8c417b157d 100644 --- a/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java +++ b/src/main/java/org/jabref/logic/exporter/BibDatabaseWriter.java @@ -39,6 +39,7 @@ import org.jabref.model.entry.field.InternalField; import org.jabref.model.metadata.MetaData; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.model.strings.StringUtil; import org.jooq.lambda.Unchecked; @@ -129,7 +130,7 @@ private static List> getSaveComparators(SaveOrder saveOrder * 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(List entriesToSort, SaveOrder saveOrder) { + public static List getSortedEntries(List entriesToSort, SelfContainedSaveOrder saveOrder) { Objects.requireNonNull(entriesToSort); Objects.requireNonNull(saveOrder); diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 5da5767f558..8186a2514c3 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -67,8 +67,8 @@ public static SaveOrder parse(List orderedData) { return new SaveOrder(orderedData); } - public static SaveOrder getDefaultSaveOrder() { - return new SaveOrder(OrderType.ORIGINAL, List.of()); + public static SelfContainedSaveOrder getDefaultSaveOrder() { + return new SelfContainedSaveOrder(OrderType.ORIGINAL, List.of()); } public OrderType getOrderType() { diff --git a/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java new file mode 100644 index 00000000000..6a80766cffe --- /dev/null +++ b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java @@ -0,0 +1,15 @@ +package org.jabref.model.metadata; + +import java.util.List; + +/** + * With this class, the user of an instance can directly sort things. Without looking up anything in the preferences or in the UI. + */ +public class SelfContainedSaveOrder extends SaveOrder { + public SelfContainedSaveOrder(OrderType orderType, List sortCriteria) { + super(orderType, sortCriteria); + if (orderType == OrderType.TABLE) { + throw new IllegalArgumentException("TABLE requires external lookup."); + } + } +} diff --git a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java index 59c9d116132..b07932d73a5 100644 --- a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java +++ b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java @@ -16,6 +16,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class FieldComparatorTest { + + @Test void OrField() { + + } + @Test public void compareMonthFieldIdentity() throws Exception { FieldComparator comparator = new FieldComparator(StandardField.MONTH); From 581be07596a5fde86182ec08026a520d869796f1 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 19:31:55 +0200 Subject: [PATCH 16/31] More SelfContainedSaveOrder --- .../org/jabref/gui/exporter/SaveDatabaseAction.java | 8 ++++---- .../logic/autosaveandbackup/BackupManager.java | 7 ++++--- .../org/jabref/logic/crawler/StudyRepository.java | 3 ++- .../org/jabref/logic/exporter/ExporterFactory.java | 3 ++- .../org/jabref/logic/exporter/SaveConfiguration.java | 9 +++++---- .../org/jabref/logic/exporter/TemplateExporter.java | 9 +++++---- .../model/metadata/SelfContainedSaveOrder.java | 12 ++++++++++++ .../org/jabref/preferences/JabRefPreferences.java | 3 ++- .../org/jabref/preferences/PreferencesService.java | 3 +++ 9 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index eff2c2ca41a..bd75ba25b3c 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -93,15 +93,15 @@ public boolean saveAs(Path file) { return this.saveAs(file, SaveDatabaseMode.NORMAL); } - private SaveOrder getSaveOrder() { + private SelfContainedSaveOrder getSaveOrder() { return libraryTab.getBibDatabaseContext() .getMetaData().getSaveOrder() .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); + return new SelfContainedSaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); } else { - return so; + return SelfContainedSaveOrder.of(so); } }) .orElse(SaveOrder.getDefaultSaveOrder()); @@ -283,7 +283,7 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, } } - private void saveWithDifferentEncoding(Path file, boolean selectedOnly, Charset encoding, Set encodingProblems, BibDatabaseWriter.SaveType saveType, SaveOrder saveOrder) throws SaveException { + private void saveWithDifferentEncoding(Path file, boolean selectedOnly, Charset encoding, Set encodingProblems, BibDatabaseWriter.SaveType saveType, SelfContainedSaveOrder saveOrder) throws SaveException { DialogPane pane = new DialogPane(); VBox vbox = new VBox(); vbox.getChildren().addAll( diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 7eaa077dcd4..f7bf97cfebf 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -31,6 +31,7 @@ import org.jabref.model.database.event.BibDatabaseContextChangedEvent; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.preferences.PreferencesService; import com.google.common.eventbus.Subscribe; @@ -224,14 +225,14 @@ void performBackup(Path backupPath) { } // code similar to org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase - SaveOrder saveOrder = bibDatabaseContext + SelfContainedSaveOrder saveOrder = bibDatabaseContext .getMetaData().getSaveOrder() .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); + return new SelfContainedSaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); } else { - return so; + return SelfContainedSaveOrder.of(so); } }) .orElse(SaveOrder.getDefaultSaveOrder()); diff --git a/src/main/java/org/jabref/logic/crawler/StudyRepository.java b/src/main/java/org/jabref/logic/crawler/StudyRepository.java index 0911fa3d943..9e3abbe0804 100644 --- a/src/main/java/org/jabref/logic/crawler/StudyRepository.java +++ b/src/main/java/org/jabref/logic/crawler/StudyRepository.java @@ -28,6 +28,7 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.model.study.FetchResult; import org.jabref.model.study.QueryResult; import org.jabref.model.study.Study; @@ -427,7 +428,7 @@ private void generateCiteKeys(BibDatabaseContext existingEntries, BibDatabase ta private void writeResultToFile(Path pathToFile, BibDatabaseContext context) throws SaveException { try (AtomicFileWriter fileWriter = new AtomicFileWriter(pathToFile, StandardCharsets.UTF_8)) { SaveConfiguration saveConfiguration = new SaveConfiguration() - .withSaveOrder(context.getMetaData().getSaveOrder().orElse(SaveOrder.getDefaultSaveOrder())) + .withSaveOrder(context.getMetaData().getSaveOrder().map(so -> SelfContainedSaveOrder.of(so)).orElse(SaveOrder.getDefaultSaveOrder())) .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 59603deaa2a..a1deae5c128 100644 --- a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java +++ b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java @@ -14,6 +14,7 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.preferences.PreferencesService; public class ExporterFactory { @@ -29,7 +30,7 @@ public static ExporterFactory create(PreferencesService preferencesService, List customFormats = preferencesService.getExportPreferences().getCustomExporters(); LayoutFormatterPreferences layoutPreferences = preferencesService.getLayoutFormatterPreferences(); - SaveOrder saveOrder = preferencesService.getExportConfiguration().getSaveOrder(); + SelfContainedSaveOrder saveOrder = SelfContainedSaveOrder.of(preferencesService.getExportConfiguration().getSaveOrder()); XmpPreferences xmpPreferences = preferencesService.getXmpPreferences(); FieldPreferences fieldPreferences = preferencesService.getFieldPreferences(); BibDatabaseMode bibDatabaseMode = preferencesService.getLibraryPreferences().getDefaultBibDatabaseMode(); diff --git a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java index 9a93467390f..5729abad6ac 100644 --- a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java +++ b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java @@ -1,6 +1,7 @@ package org.jabref.logic.exporter; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; public class SaveConfiguration { @@ -8,11 +9,11 @@ public class SaveConfiguration { public static final String ENCODING_PREFIX = "Encoding: "; private boolean reformatFile; - private SaveOrder saveOrder; + private SelfContainedSaveOrder saveOrder; private boolean makeBackup; private BibDatabaseWriter.SaveType saveType; - public SaveConfiguration(SaveOrder saveOrder, + public SaveConfiguration(SelfContainedSaveOrder saveOrder, Boolean makeBackup, BibDatabaseWriter.SaveType saveType, Boolean reformatFile) { @@ -29,11 +30,11 @@ public SaveConfiguration() { false); } - public SaveOrder getSaveOrder() { + public SelfContainedSaveOrder getSaveOrder() { return saveOrder; } - public SaveConfiguration withSaveOrder(SaveOrder newSaveOrder) { + public SaveConfiguration withSaveOrder(SelfContainedSaveOrder newSaveOrder) { this.saveOrder = newSaveOrder; return this; } diff --git a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java index 17817183704..86c407b6d77 100644 --- a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java +++ b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java @@ -30,6 +30,7 @@ import org.jabref.model.entry.types.EntryType; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +51,7 @@ public class TemplateExporter extends Exporter { private final String lfFileName; private final String directory; private final LayoutFormatterPreferences layoutPreferences; - private final SaveOrder saveOrder; + private final SelfContainedSaveOrder saveOrder; private boolean customExport; private BlankLineBehaviour blankLineBehaviour; @@ -82,7 +83,7 @@ public TemplateExporter(String name, String lfFileName, String extension, LayoutFormatterPreferences layoutPreferences, - SaveOrder saveOrder) { + SelfContainedSaveOrder saveOrder) { this(name, name, lfFileName, @@ -107,7 +108,7 @@ public TemplateExporter(String displayName, String directory, FileType extension, LayoutFormatterPreferences layoutPreferences, - SaveOrder saveOrder) { + SelfContainedSaveOrder saveOrder) { this(displayName, consoleName, lfFileName, directory, extension, layoutPreferences, saveOrder, null); } @@ -128,7 +129,7 @@ public TemplateExporter(String displayName, String directory, FileType extension, LayoutFormatterPreferences layoutPreferences, - SaveOrder saveOrder, + SelfContainedSaveOrder saveOrder, BlankLineBehaviour blankLineBehaviour) { super(consoleName, displayName, extension); if (Objects.requireNonNull(lfFileName).endsWith(LAYOUT_EXTENSION)) { diff --git a/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java index 6a80766cffe..c1233f52ff5 100644 --- a/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java @@ -12,4 +12,16 @@ public SelfContainedSaveOrder(OrderType orderType, List sortCrite throw new IllegalArgumentException("TABLE requires external lookup."); } } + + /** + * Converts a SaveOrder to a SelfContainedSaveOrder + * + * @throws IllegalArgumentException if {@code saveOrder} has {@link OrderType#TABLE} + */ + public static SelfContainedSaveOrder of(SaveOrder saveOrder) { + if (saveOrder instanceof SelfContainedSaveOrder) { + return (SelfContainedSaveOrder) saveOrder; + } + return new SelfContainedSaveOrder(saveOrder.getOrderType(), saveOrder.getSortCriteria()); + } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index f5c47356b19..262a16dd23a 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -111,6 +111,7 @@ import org.jabref.model.entry.types.EntryTypeFactory; import org.jabref.model.groups.GroupHierarchyType; import org.jabref.model.metadata.SaveOrder; +import org.jabref.model.metadata.SelfContainedSaveOrder; import org.jabref.model.search.rules.SearchRules; import org.jabref.model.strings.StringUtil; @@ -2279,7 +2280,7 @@ public SaveConfiguration getExportConfiguration() { }; return new SaveConfiguration() - .withSaveOrder(saveOrder) + .withSaveOrder(SelfContainedSaveOrder.of(saveOrder)) .withReformatOnSave(getLibraryPreferences().shouldAlwaysReformatOnSave()); } diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index cea31b66526..7f4cff19649 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -73,6 +73,9 @@ public interface PreferencesService { SaveOrder getTableSaveOrder(); + /** + * Returns the export configuration. The contained SaveConfiguration is a {@link org.jabref.model.metadata.SelfContainedSaveOrder} + */ SaveConfiguration getExportConfiguration(); BibEntryTypesManager getCustomEntryTypesRepository(); From 4b67f1e9a03315bd52b4ea10cead09f522e4333c Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Fri, 1 Sep 2023 20:25:52 +0200 Subject: [PATCH 17/31] Remove ref to PrefsService --- src/main/java/org/jabref/gui/LibraryTab.java | 2 +- .../gui/exporter/SaveDatabaseAction.java | 14 +++++++++-- .../org/jabref/gui/maintable/MainTable.java | 7 ++++++ .../gui/maintable/MainTableColumnModel.java | 8 +++++++ .../PersistenceVisualStateTable.java | 3 ++- .../autosaveandbackup/BackupManager.java | 24 +++++++++++++++---- .../jabref/preferences/JabRefPreferences.java | 14 +++-------- .../preferences/PreferencesService.java | 3 --- .../BackupManagerDiscardedTest.java | 8 ++++++- 9 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index 2f80b63ca54..5b0af4dddf3 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -290,7 +290,7 @@ public void installAutosaveManagerAndBackupManager() { autosaveManager.registerListener(new AutosaveUiManager(this)); } if (isDatabaseReadyForBackup(bibDatabaseContext) && preferencesService.getFilePreferences().shouldCreateBackup()) { - BackupManager.start(bibDatabaseContext, Globals.entryTypesManager, preferencesService); + BackupManager.start(this, bibDatabaseContext, Globals.entryTypesManager, preferencesService); } } diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index eff2c2ca41a..22a2650ccad 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -14,12 +14,16 @@ import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; import javafx.scene.control.DialogPane; +import javafx.scene.control.TableColumn; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import org.jabref.gui.DialogService; import org.jabref.gui.JabRefFrame; import org.jabref.gui.LibraryTab; +import org.jabref.gui.maintable.BibEntryTableViewModel; +import org.jabref.gui.maintable.MainTableColumnModel; +import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.FileDialogConfiguration; import org.jabref.logic.autosaveandbackup.AutosaveManager; @@ -37,7 +41,6 @@ import org.jabref.logic.util.StandardFileType; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.ChangePropagation; -import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.metadata.SaveOrder; import org.jabref.model.metadata.SelfContainedSaveOrder; @@ -99,7 +102,14 @@ private SaveOrder getSaveOrder() { .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); + List> sortOrder = libraryTab.getMainTable().getSortOrder(); + new SaveOrder( + SaveOrder.OrderType.SPECIFIED, + sortOrder.stream() + .filter(col -> col instanceof MainTableColumn) + .map(column -> ((MainTableColumn) column).getModel()) + .map(MainTableColumnModel::getSortCriterion) + .collect(Collectors.toList())); } else { return so; } diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.java b/src/main/java/org/jabref/gui/maintable/MainTable.java index 08347229605..9e8731e20f2 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.java +++ b/src/main/java/org/jabref/gui/maintable/MainTable.java @@ -480,4 +480,11 @@ private Optional findEntry(BibEntry entry) { .filter(viewModel -> viewModel.getEntry().equals(entry)) .findFirst(); } + + public static List toColumnModels(List> columns) { + return columns.stream() + .filter(col -> col instanceof MainTableColumn) + .map(column -> ((MainTableColumn) column).getModel()) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java index 5ff872c1426..97ec297e0aa 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java @@ -15,6 +15,7 @@ import org.jabref.gui.util.FieldsUtil; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.field.FieldFactory; +import org.jabref.model.metadata.SaveOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -166,6 +167,13 @@ public ObjectProperty sortTypeProperty() { return sortTypeProperty; } + public SaveOrder.SortCriterion getSortCriterion() { + boolean descending = getSortType() == TableColumn.SortType.DESCENDING; + return new SaveOrder.SortCriterion( + FieldFactory.parseField(getQualifier()), + descending); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index 3288928a32d..e5b1178f1a0 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -9,6 +9,7 @@ import javafx.scene.control.TableView; import org.jabref.gui.maintable.columns.MainTableColumn; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +30,7 @@ public PersistenceVisualStateTable(TableView table, Colu public void addListeners() { table.getColumns().addListener((InvalidationListener) obs -> updateColumns()); - table.getSortOrder().addListener((ListChangeListener) obs -> updateSortOrder()); + table.getSortOrder().addListener((ListChangeListener>) obs -> updateSortOrder()); // As we store the ColumnModels of the MainTable, we need to add the listener to the ColumnModel properties, // since the value is bound to the model after the listener to the column itself is called. diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 7eaa077dcd4..673a846966c 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -18,7 +18,14 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import javafx.scene.control.TableColumn; + +import org.jabref.gui.LibraryTab; +import org.jabref.gui.maintable.BibEntryTableViewModel; +import org.jabref.gui.maintable.MainTableColumnModel; +import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.logic.bibtex.InvalidFieldValueException; import org.jabref.logic.exporter.AtomicFileWriter; import org.jabref.logic.exporter.BibWriter; @@ -58,17 +65,19 @@ public class BackupManager { private final ScheduledThreadPoolExecutor executor; private final CoarseChangeFilter changeFilter; private final BibEntryTypesManager entryTypesManager; + private final LibraryTab libraryTab; // Contains a list of all backup paths // During a write, the less recent backup file is deleted private final Queue backupFilesQueue = new LinkedBlockingQueue<>(); private boolean needsBackup = false; - BackupManager(BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { + BackupManager(LibraryTab libraryTab, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { this.bibDatabaseContext = bibDatabaseContext; this.entryTypesManager = entryTypesManager; this.preferences = preferences; this.executor = new ScheduledThreadPoolExecutor(2); + this.libraryTab = libraryTab; changeFilter = new CoarseChangeFilter(bibDatabaseContext); changeFilter.registerListener(this); @@ -96,8 +105,8 @@ static Optional getLatestBackupPath(Path originalPath, Path backupDir) { * * @param bibDatabaseContext Associated {@link BibDatabaseContext} */ - public static BackupManager start(BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { - BackupManager backupManager = new BackupManager(bibDatabaseContext, entryTypesManager, preferences); + public static BackupManager start(LibraryTab libraryTab, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { + BackupManager backupManager = new BackupManager(libraryTab, bibDatabaseContext, entryTypesManager, preferences); backupManager.startBackupTask(preferences.getFilePreferences().getBackupDirectory()); runningInstances.add(backupManager); return backupManager; @@ -229,7 +238,14 @@ void performBackup(Path backupPath) { .map(so -> { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - return new SaveOrder(SaveOrder.OrderType.SPECIFIED, preferences.getTableSaveOrder().getSortCriteria()); + List> sortOrder = libraryTab.getMainTable().getSortOrder(); + new SaveOrder( + SaveOrder.OrderType.SPECIFIED, + sortOrder.stream() + .filter(col -> col instanceof MainTableColumn) + .map(column -> ((MainTableColumn) column).getModel()) + .map(MainTableColumnModel::getSortCriterion) + .collect(Collectors.toList())); } else { return so; } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index f5c47356b19..65f939fdaad 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2255,19 +2255,11 @@ private void storeExportSaveOrder(SaveOrder saveOrder) { putBoolean(EXPORT_TERTIARY_SORT_DESCENDING, saveOrder.getSortCriteria().get(2).descending); } - @Override public SaveOrder getTableSaveOrder() { List sortOrder = mainTableColumnPreferences.getColumnSortOrder(); - List criteria = new ArrayList<>(); - - for (var column : sortOrder) { - boolean descending = column.getSortType() == SortType.DESCENDING; - criteria.add(new SaveOrder.SortCriterion( - FieldFactory.parseField(column.getQualifier()), - descending)); - } - - return new SaveOrder(SaveOrder.OrderType.TABLE, criteria); + return new SaveOrder( + SaveOrder.OrderType.TABLE, + sortOrder.stream().map(MainTableColumnModel::getSortCriterion).collect(Collectors.toList())); } @Override diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index cea31b66526..0150a4314d2 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -33,7 +33,6 @@ import org.jabref.logic.util.io.AutoLinkPreferences; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.entry.BibEntryTypesManager; -import org.jabref.model.metadata.SaveOrder; public interface PreferencesService { @@ -71,8 +70,6 @@ public interface PreferencesService { ImportFormatPreferences getImportFormatPreferences(); - SaveOrder getTableSaveOrder(); - SaveConfiguration getExportConfiguration(); BibEntryTypesManager getCustomEntryTypesRepository(); diff --git a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java b/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java index ee60abcc067..b171f83042a 100644 --- a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java +++ b/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java @@ -6,6 +6,9 @@ import java.nio.file.Files; import java.nio.file.Path; +import javafx.collections.FXCollections; + +import org.jabref.gui.LibraryTab; import org.jabref.logic.exporter.AtomicFileWriter; import org.jabref.logic.exporter.BibWriter; import org.jabref.logic.exporter.BibtexDatabaseWriter; @@ -51,6 +54,9 @@ public void setup(@TempDir Path tempDir) throws Exception { bibDatabaseContext = new BibDatabaseContext(new BibDatabase()); bibDatabaseContext.setDatabasePath(testBib); + LibraryTab libraryTab = mock(LibraryTab.class); + when(libraryTab.getBibDatabaseContext()).thenReturn(bibDatabaseContext); + when(libraryTab.getMainTable().getSortOrder()).thenReturn(FXCollections.emptyObservableList()); bibEntryTypesManager = new BibEntryTypesManager(); @@ -63,7 +69,7 @@ public void setup(@TempDir Path tempDir) throws Exception { saveDatabase(); - backupManager = new BackupManager(bibDatabaseContext, bibEntryTypesManager, preferencesService); + backupManager = new BackupManager(libraryTab, bibDatabaseContext, bibEntryTypesManager, preferencesService); makeBackup(); } From 58e94ae942544f06d68acb7daaea076c67be23f2 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 20:50:19 +0200 Subject: [PATCH 18/31] Compile fix --- src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index d31e9617763..9d30a1ed716 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -103,7 +103,7 @@ private SelfContainedSaveOrder getSaveOrder() { if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences List> sortOrder = libraryTab.getMainTable().getSortOrder(); - new SelfContainedSaveOrder( + return new SelfContainedSaveOrder( SaveOrder.OrderType.SPECIFIED, sortOrder.stream() .filter(col -> col instanceof MainTableColumn) From 244b6c09d0f42a164e336582ba49999ce1ff1698 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 21:42:34 +0200 Subject: [PATCH 19/31] Made OrFields NOT extending LinkedHashSet --- .../gui/entryeditor/RequiredFieldsTab.java | 2 +- .../gui/maintable/MainTableColumnModel.java | 1 + .../MainTableFieldValueFormatter.java | 2 +- .../gui/maintable/columns/FieldColumn.java | 4 +-- .../jabref/logic/bibtex/BibEntryWriter.java | 12 ++++--- .../bibtex/comparator/FieldComparator.java | 2 +- .../style/OOBibStyleGetCitationMarker.java | 2 +- .../java/org/jabref/model/entry/BibEntry.java | 2 +- .../model/entry/BibEntryTypeBuilder.java | 5 +-- .../model/entry/field/FieldFactory.java | 2 +- .../jabref/model/entry/field/OrFields.java | 33 +++++++++++++++---- .../org/jabref/model/metadata/SaveOrder.java | 1 + 12 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java index 9034a76f0c4..cfc530c9d08 100644 --- a/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java @@ -56,7 +56,7 @@ protected Set determineFieldsToShow(BibEntry entry) { Set fields = new LinkedHashSet<>(); if (entryType.isPresent()) { for (OrFields orFields : entryType.get().getRequiredFields()) { - fields.addAll(orFields); + fields.addAll(orFields.getFields()); } // Add the edit field for Bibtex-key. fields.add(InternalField.KEY_FIELD); diff --git a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java index 97ec297e0aa..029ae04e7ed 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java @@ -143,6 +143,7 @@ public String getDisplayName() { || (typeProperty.getValue() == Type.INDEX)) { return typeProperty.getValue().getDisplayName(); } else { + // When an OrField is used, `FieldFactory.parseField` returns UnknownField return FieldsUtil.getNameWithType(FieldFactory.parseField(qualifierProperty.getValue())); } } diff --git a/src/main/java/org/jabref/gui/maintable/MainTableFieldValueFormatter.java b/src/main/java/org/jabref/gui/maintable/MainTableFieldValueFormatter.java index bb04a6775f4..33841527a34 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableFieldValueFormatter.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableFieldValueFormatter.java @@ -33,7 +33,7 @@ public MainTableFieldValueFormatter(NameDisplayPreferences nameDisplayPreference * @return The formatted name field. */ public String formatFieldsValues(final OrFields fields, final BibEntry entry) { - for (Field field : fields) { + for (Field field : fields.getFields()) { if (field.getProperties().contains(FieldProperty.PERSON_NAMES) && (displayStyle != DisplayStyle.AS_IS)) { Optional name = entry.getResolvedFieldOrAlias(field, bibDatabase); diff --git a/src/main/java/org/jabref/gui/maintable/columns/FieldColumn.java b/src/main/java/org/jabref/gui/maintable/columns/FieldColumn.java index e1b8b1c1ff9..698e8e16895 100644 --- a/src/main/java/org/jabref/gui/maintable/columns/FieldColumn.java +++ b/src/main/java/org/jabref/gui/maintable/columns/FieldColumn.java @@ -31,9 +31,9 @@ public FieldColumn(MainTableColumnModel model) { .withText(text -> text) .install(this); - if (fields.size() == 1) { + if (fields.hasExactlyOne()) { // comparator can't parse more than one value - Field field = fields.stream().collect(MoreCollectors.onlyElement()); + Field field = fields.getFields().stream().collect(MoreCollectors.onlyElement()); if ((field instanceof UnknownField) || field.isNumeric()) { this.setComparator(new NumericFieldComparator()); diff --git a/src/main/java/org/jabref/logic/bibtex/BibEntryWriter.java b/src/main/java/org/jabref/logic/bibtex/BibEntryWriter.java index 7cec02d2a49..663fa3e3fee 100644 --- a/src/main/java/org/jabref/logic/bibtex/BibEntryWriter.java +++ b/src/main/java/org/jabref/logic/bibtex/BibEntryWriter.java @@ -24,6 +24,7 @@ import org.jabref.model.entry.field.BibField; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.InternalField; +import org.jabref.model.entry.field.OrFields; import org.jabref.model.strings.StringUtil; import org.slf4j.LoggerFactory; @@ -103,11 +104,12 @@ private void writeRequiredFieldsFirstRemainingFieldsSecond(BibEntry entry, BibWr if (type.isPresent()) { // Write required fields first List requiredFields = type.get() - .getRequiredFields() - .stream() - .flatMap(Collection::stream) - .sorted(Comparator.comparing(Field::getName)) - .collect(Collectors.toList()); + .getRequiredFields() + .stream() + .map(OrFields::getFields) + .flatMap(Collection::stream) + .sorted(Comparator.comparing(Field::getName)) + .collect(Collectors.toList()); for (Field field : requiredFields) { writeField(entry, out, field, indent); diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java index d8d897eb1d3..3dd816c045b 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java @@ -73,7 +73,7 @@ private FieldType determineFieldType() { } private String getFieldValue(BibEntry entry) { - for (Field aField : fields) { + for (Field aField : fields.getFields()) { Optional o = entry.getFieldOrAliasLatexFree(aField); if (o.isPresent()) { return o.get(); diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java index b3680b57b9b..278b05d9595 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java @@ -230,7 +230,7 @@ private static Optional getRawCitationMarkerField(BibEntry entr Objects.requireNonNull(entry, "Entry cannot be null"); Objects.requireNonNull(database, "database cannot be null"); - for (Field field : fields /* FieldFactory.parseOrFields(fields)*/) { + for (Field field : fields.getFields() /* FieldFactory.parseOrFields(fields)*/) { Optional optionalContent = entry.getResolvedFieldOrAlias(field, database); final boolean foundSomething = optionalContent.isPresent() && !optionalContent.get().trim().isEmpty(); diff --git a/src/main/java/org/jabref/model/entry/BibEntry.java b/src/main/java/org/jabref/model/entry/BibEntry.java index 3f6b82ae6b4..7fdd429a597 100644 --- a/src/main/java/org/jabref/model/entry/BibEntry.java +++ b/src/main/java/org/jabref/model/entry/BibEntry.java @@ -158,7 +158,7 @@ public Optional setMonth(Month parsedMonth) { } public Optional getResolvedFieldOrAlias(OrFields fields, BibDatabase database) { - for (Field field : fields) { + for (Field field : fields.getFields()) { Optional value = getResolvedFieldOrAlias(field, database); if (value.isPresent()) { return value; diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java index ddc510d7d4b..b8613157ac6 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java @@ -75,8 +75,9 @@ public BibEntryTypeBuilder withRequiredFields(List first, Field... req public BibEntryType build() { // Treat required fields as important ones Stream requiredAsImportant = requiredFields.stream() - .flatMap(Set::stream) - .map(field -> new BibField(field, FieldPriority.IMPORTANT)); + .map(OrFields::getFields) + .flatMap(Set::stream) + .map(field -> new BibField(field, FieldPriority.IMPORTANT)); Set allFields = Stream.concat(fields.stream(), requiredAsImportant).collect(Collectors.toCollection(LinkedHashSet::new)); return new BibEntryType(type, allFields, requiredFields); } diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index cac6bb3b2c7..645a1295221 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -31,7 +31,7 @@ public static String serializeOrFields(Field... fields) { } public static String serializeOrFields(OrFields fields) { - return fields.stream() + return fields.getFields().stream() .map(field -> { if (field instanceof UnknownField unknownField) { // In case a user has put a user-defined field, the casing of that field is kept diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index baf848d4392..ef5c1a3050e 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -3,36 +3,55 @@ import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Set; import java.util.StringJoiner; -public class OrFields extends LinkedHashSet implements Comparable { +public class OrFields implements Comparable { + + private LinkedHashSet fields = new LinkedHashSet<>(); public OrFields(Field field) { - add(field); + fields.add(field); } - public OrFields(Field... fields) { - addAll(Arrays.asList(fields)); + public OrFields(Field... fieldsToAdd) { + Arrays.stream(fieldsToAdd).forEach(fields::add); } public OrFields(Collection fields) { - addAll(fields); + fields.addAll(fields); } public String getDisplayName() { StringJoiner joiner = new StringJoiner("/"); - for (Field field : this) { + for (Field field : fields) { joiner.add(field.getDisplayName()); } return joiner.toString(); } public Field getPrimary() { - return this.iterator().next(); + return fields.iterator().next(); + } + + public Set getFields() { + return this.fields; + } + + public boolean contains(Field field) { + return fields.contains(field); } @Override public int compareTo(OrFields o) { return FieldFactory.serializeOrFields(this).compareTo(FieldFactory.serializeOrFields(o)); } + + public boolean hasExactlyOne() { + return this.fields.size() == 1; + } + + public boolean isEmpty() { + return this.fields.isEmpty(); + } } diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 8186a2514c3..85cb33ef768 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -7,6 +7,7 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; +import org.jabref.model.entry.field.OrFields; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From aa9a4fce1f4e33f034e18306b34ed3e69fe7ee1c Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 22:02:39 +0200 Subject: [PATCH 20/31] Fix hillarious bug --- src/main/java/org/jabref/model/entry/field/OrFields.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index ef5c1a3050e..6778db9b51f 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -18,8 +18,8 @@ public OrFields(Field... fieldsToAdd) { Arrays.stream(fieldsToAdd).forEach(fields::add); } - public OrFields(Collection fields) { - fields.addAll(fields); + public OrFields(Collection fieldsToAdd) { + fields.addAll(fieldsToAdd); } public String getDisplayName() { From b2115e94cc239e46b70449b19a6c56a2042c3b3d Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Fri, 1 Sep 2023 22:21:47 +0200 Subject: [PATCH 21/31] Fixed tests --- src/main/java/org/jabref/gui/JabRefFrame.java | 4 ++-- src/main/java/org/jabref/gui/LibraryTab.java | 4 ++-- .../autosaveandbackup/AutosaveManager.java | 2 +- .../autosaveandbackup/BackupManager.java | 2 +- .../org/jabref/gui/dialogs/BackupUIManager.java | 2 +- .../jabref/gui/exporter/SaveDatabaseAction.java | 4 ++-- .../gui/importer/actions/OpenDatabaseAction.java | 2 +- .../jabref/logic/exporter/SaveConfiguration.java | 3 ++- .../org/jabref/logic/util/io/BackupFileUtil.java | 3 ++- .../model/database/event/AutosaveEvent.java | 4 +++- .../BackupManagerDiscardedTest.java | 9 ++------- .../autosaveandbackup/BackupManagerTest.java | 15 ++++++++++++--- .../{logic => gui}/autosaveandbackup/changes.bib | 0 .../autosaveandbackup/no-autosave.bib | 0 .../autosaveandbackup/no-changes.bib | 0 .../logic/autosaveandbackup/changes.bib.bak | 15 --------------- .../logic/autosaveandbackup/no-changes.bib.bak | 15 --------------- 17 files changed, 31 insertions(+), 53 deletions(-) rename src/main/java/org/jabref/{logic => gui}/autosaveandbackup/AutosaveManager.java (98%) rename src/main/java/org/jabref/{logic => gui}/autosaveandbackup/BackupManager.java (99%) rename src/test/java/org/jabref/{logic => gui}/autosaveandbackup/BackupManagerDiscardedTest.java (90%) rename src/test/java/org/jabref/{logic => gui}/autosaveandbackup/BackupManagerTest.java (93%) rename src/test/resources/org/jabref/{logic => gui}/autosaveandbackup/changes.bib (100%) rename src/test/resources/org/jabref/{logic => gui}/autosaveandbackup/no-autosave.bib (100%) rename src/test/resources/org/jabref/{logic => gui}/autosaveandbackup/no-changes.bib (100%) delete mode 100644 src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib.bak delete mode 100644 src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib.bak diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index d30d2753b72..54bd0b888bc 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -54,6 +54,8 @@ import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.actions.StandardActions; +import org.jabref.gui.autosaveandbackup.AutosaveManager; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.auximport.NewSubLibraryAction; import org.jabref.gui.bibtexextractor.ExtractBibtexAction; import org.jabref.gui.citationkeypattern.GenerateCitationKeyAction; @@ -118,8 +120,6 @@ import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; -import org.jabref.logic.autosaveandbackup.AutosaveManager; -import org.jabref.logic.autosaveandbackup.BackupManager; import org.jabref.logic.citationstyle.CitationStyleOutputFormat; import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.IdFetcher; diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index 5b0af4dddf3..c4c4142ca73 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -26,6 +26,8 @@ import org.jabref.gui.autocompleter.AutoCompletePreferences; import org.jabref.gui.autocompleter.PersonNameSuggestionProvider; import org.jabref.gui.autocompleter.SuggestionProviders; +import org.jabref.gui.autosaveandbackup.AutosaveManager; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.collab.DatabaseChangeMonitor; import org.jabref.gui.dialogs.AutosaveUiManager; import org.jabref.gui.entryeditor.EntryEditor; @@ -39,8 +41,6 @@ import org.jabref.gui.undo.UndoableRemoveEntries; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; -import org.jabref.logic.autosaveandbackup.AutosaveManager; -import org.jabref.logic.autosaveandbackup.BackupManager; import org.jabref.logic.citationstyle.CitationStyleCache; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.util.FileFieldParser; diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/AutosaveManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java similarity index 98% rename from src/main/java/org/jabref/logic/autosaveandbackup/AutosaveManager.java rename to src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java index 990da5c2db4..72402b18dd5 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/AutosaveManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java @@ -1,4 +1,4 @@ -package org.jabref.logic.autosaveandbackup; +package org.jabref.gui.autosaveandbackup; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java similarity index 99% rename from src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java rename to src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java index 6cda702e2ca..98f198e112a 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java @@ -1,4 +1,4 @@ -package org.jabref.logic.autosaveandbackup; +package org.jabref.gui.autosaveandbackup; import java.io.IOException; import java.io.Writer; diff --git a/src/main/java/org/jabref/gui/dialogs/BackupUIManager.java b/src/main/java/org/jabref/gui/dialogs/BackupUIManager.java index 6291f5b779a..927dec7eb83 100644 --- a/src/main/java/org/jabref/gui/dialogs/BackupUIManager.java +++ b/src/main/java/org/jabref/gui/dialogs/BackupUIManager.java @@ -8,13 +8,13 @@ import javafx.scene.control.ButtonType; import org.jabref.gui.DialogService; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.backup.BackupResolverDialog; import org.jabref.gui.collab.DatabaseChange; import org.jabref.gui.collab.DatabaseChangeList; import org.jabref.gui.collab.DatabaseChangeResolverFactory; import org.jabref.gui.collab.DatabaseChangesResolverDialog; import org.jabref.gui.util.DefaultTaskExecutor; -import org.jabref.logic.autosaveandbackup.BackupManager; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.OpenDatabase; import org.jabref.logic.importer.ParserResult; diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 9d30a1ed716..c17119d27d5 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -21,13 +21,13 @@ import org.jabref.gui.DialogService; import org.jabref.gui.JabRefFrame; import org.jabref.gui.LibraryTab; +import org.jabref.gui.autosaveandbackup.AutosaveManager; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.maintable.BibEntryTableViewModel; import org.jabref.gui.maintable.MainTableColumnModel; import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.FileDialogConfiguration; -import org.jabref.logic.autosaveandbackup.AutosaveManager; -import org.jabref.logic.autosaveandbackup.BackupManager; import org.jabref.logic.exporter.AtomicFileWriter; import org.jabref.logic.exporter.BibDatabaseWriter; import org.jabref.logic.exporter.BibWriter; diff --git a/src/main/java/org/jabref/gui/importer/actions/OpenDatabaseAction.java b/src/main/java/org/jabref/gui/importer/actions/OpenDatabaseAction.java index 63ba10bf3d1..18715dd66a0 100644 --- a/src/main/java/org/jabref/gui/importer/actions/OpenDatabaseAction.java +++ b/src/main/java/org/jabref/gui/importer/actions/OpenDatabaseAction.java @@ -17,13 +17,13 @@ import org.jabref.gui.LibraryTab; import org.jabref.gui.StateManager; import org.jabref.gui.actions.SimpleCommand; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.dialogs.BackupUIManager; import org.jabref.gui.menus.FileHistoryMenu; import org.jabref.gui.shared.SharedDatabaseUIManager; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.FileDialogConfiguration; -import org.jabref.logic.autosaveandbackup.BackupManager; import org.jabref.logic.importer.OpenDatabase; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.l10n.Localization; diff --git a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java index 5729abad6ac..29742fd4a58 100644 --- a/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java +++ b/src/main/java/org/jabref/logic/exporter/SaveConfiguration.java @@ -1,5 +1,6 @@ package org.jabref.logic.exporter; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.model.metadata.SaveOrder; import org.jabref.model.metadata.SelfContainedSaveOrder; @@ -44,7 +45,7 @@ public boolean shouldMakeBackup() { } /** - * Required by {@link org.jabref.logic.autosaveandbackup.BackupManager}. Should not be used in other settings + * Required by {@link BackupManager}. Should not be used in other settings * * @param newMakeBackup whether a backup (.bak file) should be made */ diff --git a/src/main/java/org/jabref/logic/util/io/BackupFileUtil.java b/src/main/java/org/jabref/logic/util/io/BackupFileUtil.java index 0e499b5c51e..bea88213b6f 100644 --- a/src/main/java/org/jabref/logic/util/io/BackupFileUtil.java +++ b/src/main/java/org/jabref/logic/util/io/BackupFileUtil.java @@ -9,6 +9,7 @@ import java.util.HexFormat; import java.util.Optional; +import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.logic.util.BackupFileType; import org.slf4j.Logger; @@ -33,7 +34,7 @@ private BackupFileUtil() { * In case that fails, the return path of the .bak file is set to be next to the .bib file *

*

- * Note that this backup is different from the .sav file generated by {@link org.jabref.logic.autosaveandbackup.BackupManager} + * Note that this backup is different from the .sav file generated by {@link BackupManager} * (and configured in the preferences as "make backups") *

*/ diff --git a/src/main/java/org/jabref/model/database/event/AutosaveEvent.java b/src/main/java/org/jabref/model/database/event/AutosaveEvent.java index b89ffe7d8c4..dbfd66d9858 100644 --- a/src/main/java/org/jabref/model/database/event/AutosaveEvent.java +++ b/src/main/java/org/jabref/model/database/event/AutosaveEvent.java @@ -1,7 +1,9 @@ package org.jabref.model.database.event; +import org.jabref.gui.autosaveandbackup.AutosaveManager; + /** - * This Event is fired from {@link org.jabref.logic.autosaveandbackup.AutosaveManager} in case that a save task is pending. + * This Event is fired from {@link AutosaveManager} in case that a save task is pending. */ public class AutosaveEvent { // no data diff --git a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java b/src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerDiscardedTest.java similarity index 90% rename from src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java rename to src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerDiscardedTest.java index b171f83042a..e7d868ee862 100644 --- a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerDiscardedTest.java +++ b/src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerDiscardedTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.autosaveandbackup; +package org.jabref.gui.autosaveandbackup; import java.io.IOException; import java.io.Writer; @@ -6,8 +6,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import javafx.collections.FXCollections; - import org.jabref.gui.LibraryTab; import org.jabref.logic.exporter.AtomicFileWriter; import org.jabref.logic.exporter.BibWriter; @@ -54,9 +52,6 @@ public void setup(@TempDir Path tempDir) throws Exception { bibDatabaseContext = new BibDatabaseContext(new BibDatabase()); bibDatabaseContext.setDatabasePath(testBib); - LibraryTab libraryTab = mock(LibraryTab.class); - when(libraryTab.getBibDatabaseContext()).thenReturn(bibDatabaseContext); - when(libraryTab.getMainTable().getSortOrder()).thenReturn(FXCollections.emptyObservableList()); bibEntryTypesManager = new BibEntryTypesManager(); @@ -69,7 +64,7 @@ public void setup(@TempDir Path tempDir) throws Exception { saveDatabase(); - backupManager = new BackupManager(libraryTab, bibDatabaseContext, bibEntryTypesManager, preferencesService); + backupManager = new BackupManager(mock(LibraryTab.class), bibDatabaseContext, bibEntryTypesManager, preferencesService); makeBackup(); } diff --git a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerTest.java b/src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerTest.java similarity index 93% rename from src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerTest.java rename to src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerTest.java index 3573bd7aa8b..c1a0caf267d 100644 --- a/src/test/java/org/jabref/logic/autosaveandbackup/BackupManagerTest.java +++ b/src/test/java/org/jabref/gui/autosaveandbackup/BackupManagerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.autosaveandbackup; +package org.jabref.gui.autosaveandbackup; import java.nio.file.Files; import java.nio.file.Path; @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; +import org.jabref.gui.LibraryTab; import org.jabref.logic.util.BackupFileType; import org.jabref.logic.util.OS; import org.jabref.logic.util.io.BackupFileUtil; @@ -141,7 +142,11 @@ public void shouldNotCreateABackup(@TempDir Path customDir) throws Exception { when(preferences.getFilePreferences()).thenReturn(filePreferences); when(filePreferences.getBackupDirectory()).thenReturn(backupDir); - BackupManager manager = BackupManager.start(database, mock(BibEntryTypesManager.class, Answers.RETURNS_DEEP_STUBS), preferences); + BackupManager manager = BackupManager.start( + mock(LibraryTab.class), + database, + mock(BibEntryTypesManager.class, Answers.RETURNS_DEEP_STUBS), + preferences); manager.listen(new MetaDataChangedEvent(new MetaData())); BackupManager.shutdown(database, backupDir, false); @@ -164,7 +169,11 @@ public void shouldCreateABackup(@TempDir Path customDir) throws Exception { when(filePreferences.getBackupDirectory()).thenReturn(backupDir); when(filePreferences.shouldCreateBackup()).thenReturn(true); - BackupManager manager = BackupManager.start(database, mock(BibEntryTypesManager.class, Answers.RETURNS_DEEP_STUBS), preferences); + BackupManager manager = BackupManager.start( + mock(LibraryTab.class), + database, + mock(BibEntryTypesManager.class, Answers.RETURNS_DEEP_STUBS), + preferences); manager.listen(new MetaDataChangedEvent(new MetaData())); Optional fullBackupPath = manager.determineBackupPathForNewBackup(backupDir); diff --git a/src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib b/src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib similarity index 100% rename from src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib rename to src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib diff --git a/src/test/resources/org/jabref/logic/autosaveandbackup/no-autosave.bib b/src/test/resources/org/jabref/gui/autosaveandbackup/no-autosave.bib similarity index 100% rename from src/test/resources/org/jabref/logic/autosaveandbackup/no-autosave.bib rename to src/test/resources/org/jabref/gui/autosaveandbackup/no-autosave.bib diff --git a/src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib b/src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib similarity index 100% rename from src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib rename to src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib diff --git a/src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib.bak b/src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib.bak deleted file mode 100644 index c371a4e6757..00000000000 --- a/src/test/resources/org/jabref/logic/autosaveandbackup/changes.bib.bak +++ /dev/null @@ -1,15 +0,0 @@ -% Encoding: UTF-8 - -@Article{GarridoKallstromKummEtAl2016, - author = {Mario Garrido and Petter Kallstrom and Martin Kumm and Oscar Gustafsson}, - title = {{CORDIC} {II:} {A} New Improved {CORDIC} Algorithm}, - journal = {{IEEE} Trans. on Circuits and Systems}, - year = {2016}, - volume = {63-II}, - number = {2}, - pages = {186--190}, - bibsource = {dblp computer science bibliography, http://dblp.org}, - biburl = {http://dblp.uni-trier.de/rec/bib/journals/tcas/GarridoKKG16}, - doi = {10.1109/TCSII.2015.2483422}, - timestamp = {Mon, 08 Feb 2016 00:00:00 +0100}, -} diff --git a/src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib.bak b/src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib.bak deleted file mode 100644 index c371a4e6757..00000000000 --- a/src/test/resources/org/jabref/logic/autosaveandbackup/no-changes.bib.bak +++ /dev/null @@ -1,15 +0,0 @@ -% Encoding: UTF-8 - -@Article{GarridoKallstromKummEtAl2016, - author = {Mario Garrido and Petter Kallstrom and Martin Kumm and Oscar Gustafsson}, - title = {{CORDIC} {II:} {A} New Improved {CORDIC} Algorithm}, - journal = {{IEEE} Trans. on Circuits and Systems}, - year = {2016}, - volume = {63-II}, - number = {2}, - pages = {186--190}, - bibsource = {dblp computer science bibliography, http://dblp.org}, - biburl = {http://dblp.uni-trier.de/rec/bib/journals/tcas/GarridoKKG16}, - doi = {10.1109/TCSII.2015.2483422}, - timestamp = {Mon, 08 Feb 2016 00:00:00 +0100}, -} From dfb3ef7389a0ccffecc4ad29ecc16d5d474bbe73 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 22:34:32 +0200 Subject: [PATCH 22/31] Try to fix FieldComparators for OrFields --- .../gui/exporter/SaveDatabaseAction.java | 4 ++-- .../gui/maintable/MainTableColumnModel.java | 21 ++++++++++++++----- .../autosaveandbackup/BackupManager.java | 4 ++-- .../bibtex/comparator/FieldComparator.java | 2 -- .../jabref/preferences/JabRefPreferences.java | 2 +- .../comparator/FieldComparatorTest.java | 5 ----- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 9d30a1ed716..ba5c530f19c 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -108,8 +108,8 @@ private SelfContainedSaveOrder getSaveOrder() { sortOrder.stream() .filter(col -> col instanceof MainTableColumn) .map(column -> ((MainTableColumn) column).getModel()) - .map(MainTableColumnModel::getSortCriterion) - .collect(Collectors.toList())); + .flatMap(model -> model.getSortCriteria().stream()) + .toList()); } else { return SelfContainedSaveOrder.of(so); } diff --git a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java index 029ae04e7ed..4fbb20cdd0a 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java @@ -1,6 +1,7 @@ package org.jabref.gui.maintable; import java.util.EnumSet; +import java.util.List; import java.util.Objects; import javafx.beans.property.DoubleProperty; @@ -15,6 +16,7 @@ import org.jabref.gui.util.FieldsUtil; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.field.FieldFactory; +import org.jabref.model.entry.field.OrFields; import org.jabref.model.metadata.SaveOrder; import org.slf4j.Logger; @@ -143,7 +145,8 @@ public String getDisplayName() { || (typeProperty.getValue() == Type.INDEX)) { return typeProperty.getValue().getDisplayName(); } else { - // When an OrField is used, `FieldFactory.parseField` returns UnknownField + // In case an OrField is used, `FieldFactory.parseField` returns UnknownField, which leads to + // "author/editor(Custom)" instead of "author/editor" in the output return FieldsUtil.getNameWithType(FieldFactory.parseField(qualifierProperty.getValue())); } } @@ -168,11 +171,19 @@ public ObjectProperty sortTypeProperty() { return sortTypeProperty; } - public SaveOrder.SortCriterion getSortCriterion() { + /** + * Returns a list of sort cirteria based on the fields the current column displays. + * In case it is single field, a single SortCriterion is returned. + * In case of multiple fields, for each field, there is a SortCriterion contained in the list. + * + * Implementation reason: We want to have SortCriterion handle a single field, because the UI allows for handling + * "plain" fields only. + */ + public List getSortCriteria() { boolean descending = getSortType() == TableColumn.SortType.DESCENDING; - return new SaveOrder.SortCriterion( - FieldFactory.parseField(getQualifier()), - descending); + return FieldFactory.parseOrFields(getQualifier()).getFields().stream() + .map(field -> new SaveOrder.SortCriterion(field, descending)) + .toList(); } @Override diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 6cda702e2ca..946eafee218 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -245,8 +245,8 @@ void performBackup(Path backupPath) { sortOrder.stream() .filter(col -> col instanceof MainTableColumn) .map(column -> ((MainTableColumn) column).getModel()) - .map(MainTableColumnModel::getSortCriterion) - .collect(Collectors.toList())); + .flatMap(model -> model.getSortCriteria().stream()) + .toList()); } else { return SelfContainedSaveOrder.of(so); } diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java index 3dd816c045b..51d90e1d526 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java @@ -92,8 +92,6 @@ public int compare(BibEntry e1, BibEntry e2) { f1 = e1.getType().getDisplayName(); f2 = e2.getType().getDisplayName(); } else { - // If the field is author or editor, we rearrange names so they are - // sorted according to last name. f1 = getFieldValue(e1); f2 = getFieldValue(e2); } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index cc10675d29b..651ecc4ca85 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2260,7 +2260,7 @@ public SaveOrder getTableSaveOrder() { List sortOrder = mainTableColumnPreferences.getColumnSortOrder(); return new SaveOrder( SaveOrder.OrderType.TABLE, - sortOrder.stream().map(MainTableColumnModel::getSortCriterion).collect(Collectors.toList())); + sortOrder.stream().flatMap(model -> model.getSortCriteria().stream()).toList()); } @Override diff --git a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java index b07932d73a5..59c9d116132 100644 --- a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java +++ b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java @@ -16,11 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class FieldComparatorTest { - - @Test void OrField() { - - } - @Test public void compareMonthFieldIdentity() throws Exception { FieldComparator comparator = new FieldComparator(StandardField.MONTH); From ab4fd00a0ca5ef0d9bdb299e5976f79e410a5755 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 23:17:08 +0200 Subject: [PATCH 23/31] Fix order of null comparisons Refs tests of #7544 --- .../bibtex/comparator/FieldComparator.java | 4 +- .../comparator/FieldComparatorTest.java | 47 +++++++++++++++---- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java index 51d90e1d526..42f86e0d78d 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/FieldComparator.java @@ -100,9 +100,9 @@ public int compare(BibEntry e1, BibEntry e2) { if ((f1 == null) && (f2 == null)) { return 0; } else if (f1 == null) { - return multiplier; - } else if (f2 == null) { return -multiplier; + } else if (f2 == null) { + return +multiplier; } // Now we know that both f1 and f2 are != null diff --git a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java index 59c9d116132..47ed17128ed 100644 --- a/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java +++ b/src/test/java/org/jabref/logic/bibtex/comparator/FieldComparatorTest.java @@ -202,25 +202,52 @@ public void compareParsableWithNonParsableNumericFieldDescending() throws Except } @ParameterizedTest - @MethodSource("provideArgumentsForNumericalComparison") - public void compareNumericalValues(int comparisonResult, String id1, String id2, String errorMessage) { + @MethodSource + public void compareNumericalValues(int comparisonResult, String id1, String id2, String message) { FieldComparator comparator = new FieldComparator(StandardField.PMID); BibEntry entry1 = new BibEntry() .withField(StandardField.PMID, id1); BibEntry entry2 = new BibEntry() .withField(StandardField.PMID, id2); - assertEquals(comparisonResult, comparator.compare(entry1, entry2), errorMessage); + assertEquals(comparisonResult, comparator.compare(entry1, entry2), message); } - private static Stream provideArgumentsForNumericalComparison() { + private static Stream compareNumericalValues() { return Stream.of( - Arguments.of(0, "123456", "123456", "IDs are lexicographically not equal [1]"), - Arguments.of(1, "234567", "123456", "234567 is lexicographically smaller than 123456"), - Arguments.of(1, "abc##z", "123456", "abc##z is lexicographically smaller than 123456 "), - Arguments.of(0, "", "", "IDs are lexicographically not equal [2]"), - Arguments.of(1, "", "123456", "No ID is lexicographically smaller than 123456"), - Arguments.of(-1, "123456", "", "123456 is lexicographically greater than no ID") + Arguments.of(0, "123456", "123456", "IDs should be lexicographically equal"), + Arguments.of(1, "234567", "123456", "234567 should be lexicographically greater than 123456"), + Arguments.of(1, "abc##z", "123456", "abc##z should be lexicographically greater than 123456 "), + Arguments.of(0, "", "", "Empty IDs should be lexicographically equal"), + Arguments.of(-1, "", "123456", "No ID should be lexicographically smaller than 123456"), + Arguments.of(1, "123456", "", "123456 should be lexicographically greater than no ID") + ); + } + + @ParameterizedTest + @MethodSource + public void nullTests(int comparisonResult, String firstValue, String secondValue) { + FieldComparator comparator = new FieldComparator(StandardField.TITLE); + + BibEntry entry1 = new BibEntry(); + if (firstValue != null) { + entry1.setField(StandardField.TITLE, firstValue); + } + + BibEntry entry2 = new BibEntry(); + if (secondValue != null) { + entry2.setField(StandardField.TITLE, secondValue); + } + + assertEquals(comparisonResult, comparator.compare(entry1, entry2)); + } + + private static Stream nullTests() { + return Stream.of( + Arguments.of(0, null, null), + Arguments.of(0, "value", "value"), + Arguments.of(-1, null, "value"), + Arguments.of(1, "value", null) ); } } From 201137a950301b7714e79670b2f70cabf66a1383 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 23:43:39 +0200 Subject: [PATCH 24/31] Fix checkstyle --- .../java/org/jabref/gui/autosaveandbackup/BackupManager.java | 2 -- src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java | 1 - .../java/org/jabref/gui/maintable/MainTableColumnModel.java | 1 - .../java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java | 2 +- src/main/java/org/jabref/logic/exporter/ExporterFactory.java | 1 - src/main/java/org/jabref/model/metadata/ContentSelectors.java | 1 - src/main/java/org/jabref/model/metadata/SaveOrder.java | 1 - 7 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java index f30f54bae90..915ce75fbfa 100644 --- a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java @@ -18,13 +18,11 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import javafx.scene.control.TableColumn; import org.jabref.gui.LibraryTab; import org.jabref.gui.maintable.BibEntryTableViewModel; -import org.jabref.gui.maintable.MainTableColumnModel; import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.logic.bibtex.InvalidFieldValueException; import org.jabref.logic.exporter.AtomicFileWriter; diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index ea3bbba3b1c..2225c8c786d 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -24,7 +24,6 @@ import org.jabref.gui.autosaveandbackup.AutosaveManager; import org.jabref.gui.autosaveandbackup.BackupManager; import org.jabref.gui.maintable.BibEntryTableViewModel; -import org.jabref.gui.maintable.MainTableColumnModel; import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.FileDialogConfiguration; diff --git a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java index 4fbb20cdd0a..77bcecaf7a1 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java @@ -16,7 +16,6 @@ import org.jabref.gui.util.FieldsUtil; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.field.FieldFactory; -import org.jabref.model.entry.field.OrFields; import org.jabref.model.metadata.SaveOrder; import org.slf4j.Logger; 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 ef0786bc1dc..5420ef97391 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java @@ -45,7 +45,7 @@ public static Optional compare(MetaData originalMetaData, MetaData } } - private void addToListIfDiff(List changes, DifferenceType differenceType, Object originalObject, Object newObject) { + private void addToListIfDiff(List changes, DifferenceType differenceType, Object originalObject, Object newObject) { if (!Objects.equals(originalObject, newObject)) { changes.add(new Difference(differenceType, originalObject, newObject)); } diff --git a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java index a1deae5c128..78373ef98d4 100644 --- a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java +++ b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java @@ -13,7 +13,6 @@ 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.model.metadata.SelfContainedSaveOrder; import org.jabref.preferences.PreferencesService; diff --git a/src/main/java/org/jabref/model/metadata/ContentSelectors.java b/src/main/java/org/jabref/model/metadata/ContentSelectors.java index a59c15169f7..93c85250ae9 100644 --- a/src/main/java/org/jabref/model/metadata/ContentSelectors.java +++ b/src/main/java/org/jabref/model/metadata/ContentSelectors.java @@ -94,5 +94,4 @@ public String toString() { ", fieldsWithSelectors=" + getFieldsWithSelectors() + '}'; } - } diff --git a/src/main/java/org/jabref/model/metadata/SaveOrder.java b/src/main/java/org/jabref/model/metadata/SaveOrder.java index 85cb33ef768..8186a2514c3 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrder.java @@ -7,7 +7,6 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; -import org.jabref.model.entry.field.OrFields; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 52931e004f974fa427dab95feead625919d84c14 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Fri, 1 Sep 2023 23:53:33 +0200 Subject: [PATCH 25/31] Add missing equals, hashcode and toString --- .../jabref/model/entry/field/OrFields.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index 6778db9b51f..52008664878 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -1,5 +1,7 @@ package org.jabref.model.entry.field; +import com.google.common.base.Objects; + import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; @@ -54,4 +56,28 @@ public boolean hasExactlyOne() { public boolean isEmpty() { return this.fields.isEmpty(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OrFields orFields = (OrFields) o; + return Objects.equal(fields, orFields.fields); + } + + @Override + public int hashCode() { + return Objects.hashCode(fields); + } + + @Override + public String toString() { + return "OrFields{" + + "fields=" + fields + + '}'; + } } From 7f626da25ec2db57042ac1a100079a802dbea732 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 00:36:04 +0200 Subject: [PATCH 26/31] Fix checkstyle --- src/main/java/org/jabref/logic/exporter/TemplateExporter.java | 2 +- src/main/java/org/jabref/model/entry/field/OrFields.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java index 86c407b6d77..c2e0e7e6e1c 100644 --- a/src/main/java/org/jabref/logic/exporter/TemplateExporter.java +++ b/src/main/java/org/jabref/logic/exporter/TemplateExporter.java @@ -29,8 +29,8 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.types.EntryType; import org.jabref.model.metadata.SaveOrder; - import org.jabref.model.metadata.SelfContainedSaveOrder; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index 52008664878..bee32fb1796 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -1,13 +1,13 @@ package org.jabref.model.entry.field; -import com.google.common.base.Objects; - import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; import java.util.StringJoiner; +import com.google.common.base.Objects; + public class OrFields implements Comparable { private LinkedHashSet fields = new LinkedHashSet<>(); From e5bc5be93d92e92aa3e971ab0a8627b7a4291557 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 01:55:26 +0200 Subject: [PATCH 27/31] Restore test files --- .gitignore | 2 ++ .../jabref/gui/autosaveandbackup/changes.bib.bak | 15 +++++++++++++++ .../gui/autosaveandbackup/no-changes.bib.bak | 15 +++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib.bak create mode 100644 src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib.bak diff --git a/.gitignore b/.gitignore index 5b709f65ea7..5a71a69201d 100644 --- a/.gitignore +++ b/.gitignore @@ -477,3 +477,5 @@ lib/ojdbc.jar # do not ignore JabRef icons (they are ignored by the macos setting above) !src/main/java/org/jabref/gui/icon + +!**/autosaveandbackup/*.bak diff --git a/src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib.bak b/src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib.bak new file mode 100644 index 00000000000..c371a4e6757 --- /dev/null +++ b/src/test/resources/org/jabref/gui/autosaveandbackup/changes.bib.bak @@ -0,0 +1,15 @@ +% Encoding: UTF-8 + +@Article{GarridoKallstromKummEtAl2016, + author = {Mario Garrido and Petter Kallstrom and Martin Kumm and Oscar Gustafsson}, + title = {{CORDIC} {II:} {A} New Improved {CORDIC} Algorithm}, + journal = {{IEEE} Trans. on Circuits and Systems}, + year = {2016}, + volume = {63-II}, + number = {2}, + pages = {186--190}, + bibsource = {dblp computer science bibliography, http://dblp.org}, + biburl = {http://dblp.uni-trier.de/rec/bib/journals/tcas/GarridoKKG16}, + doi = {10.1109/TCSII.2015.2483422}, + timestamp = {Mon, 08 Feb 2016 00:00:00 +0100}, +} diff --git a/src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib.bak b/src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib.bak new file mode 100644 index 00000000000..c371a4e6757 --- /dev/null +++ b/src/test/resources/org/jabref/gui/autosaveandbackup/no-changes.bib.bak @@ -0,0 +1,15 @@ +% Encoding: UTF-8 + +@Article{GarridoKallstromKummEtAl2016, + author = {Mario Garrido and Petter Kallstrom and Martin Kumm and Oscar Gustafsson}, + title = {{CORDIC} {II:} {A} New Improved {CORDIC} Algorithm}, + journal = {{IEEE} Trans. on Circuits and Systems}, + year = {2016}, + volume = {63-II}, + number = {2}, + pages = {186--190}, + bibsource = {dblp computer science bibliography, http://dblp.org}, + biburl = {http://dblp.uni-trier.de/rec/bib/journals/tcas/GarridoKKG16}, + doi = {10.1109/TCSII.2015.2483422}, + timestamp = {Mon, 08 Feb 2016 00:00:00 +0100}, +} From 10da21bfd6b81e311e4c550307c06d0761d01c18 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 01:55:43 +0200 Subject: [PATCH 28/31] Fix OpenRewrite --- .../java/org/jabref/gui/autosaveandbackup/BackupManager.java | 2 +- src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java | 2 +- .../org/jabref/model/metadata/SelfContainedSaveOrder.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java index 915ce75fbfa..616c806891a 100644 --- a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java @@ -235,7 +235,7 @@ void performBackup(Path backupPath) { SelfContainedSaveOrder saveOrder = bibDatabaseContext .getMetaData().getSaveOrder() .map(so -> { - if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { + if (so.getOrderType() == SaveOrder.OrderType.TABLE) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences List> sortOrder = libraryTab.getMainTable().getSortOrder(); return new SelfContainedSaveOrder( diff --git a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 2225c8c786d..096646fd267 100644 --- a/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -99,7 +99,7 @@ private SelfContainedSaveOrder getSaveOrder() { return libraryTab.getBibDatabaseContext() .getMetaData().getSaveOrder() .map(so -> { - if (so.getOrderType().equals(SaveOrder.OrderType.TABLE)) { + if (so.getOrderType() == SaveOrder.OrderType.TABLE) { // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences List> sortOrder = libraryTab.getMainTable().getSortOrder(); return new SelfContainedSaveOrder( diff --git a/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java index c1233f52ff5..1c40945e9ed 100644 --- a/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java +++ b/src/main/java/org/jabref/model/metadata/SelfContainedSaveOrder.java @@ -19,8 +19,8 @@ public SelfContainedSaveOrder(OrderType orderType, List sortCrite * @throws IllegalArgumentException if {@code saveOrder} has {@link OrderType#TABLE} */ public static SelfContainedSaveOrder of(SaveOrder saveOrder) { - if (saveOrder instanceof SelfContainedSaveOrder) { - return (SelfContainedSaveOrder) saveOrder; + if (saveOrder instanceof SelfContainedSaveOrder order) { + return order; } return new SelfContainedSaveOrder(saveOrder.getOrderType(), saveOrder.getSortCriteria()); } From a8cb36f2db8a9d723f518cc43d841fae1c9f8d11 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 02:05:11 +0200 Subject: [PATCH 29/31] Fix modernizer --- src/main/java/org/jabref/model/entry/field/OrFields.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index bee32fb1796..e0d24537be5 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -3,11 +3,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Objects; import java.util.Set; import java.util.StringJoiner; -import com.google.common.base.Objects; - public class OrFields implements Comparable { private LinkedHashSet fields = new LinkedHashSet<>(); @@ -66,7 +65,7 @@ public boolean equals(Object o) { return false; } OrFields orFields = (OrFields) o; - return Objects.equal(fields, orFields.fields); + return Objects.equals(fields, orFields.fields); } @Override From c026cea960e1155640b311f4dc6a0e9c9062c466 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 02:06:15 +0200 Subject: [PATCH 30/31] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 227d2510bb2..4926acf2457 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ In case, there is no issue present, the pull request implementing the feature is Note that this project **does not** adhere to [Semantic Versioning](http://semver.org/). +## Fixed + +- It is possible again to use "current table sort order" for the order of entries when saving. [#9869](https://github.com/JabRef/jabref/issues/9869) + ## [Unreleased] ### Added @@ -138,7 +142,6 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - 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 that checked-out radio buttons under "specified keywords" were not displayed as checked after closing and reopening the "edit group" window. [#10248](https://github.com/JabRef/jabref/issues/10248) - We fixed that when editing groups, checked-out properties such as case sensitive and regular expression (under "Free search expression") were not displayed checked. [#10108](https://github.com/JabRef/jabref/issues/10108) -- It is possible again to use "current table sort order" for the order of entries when saving. [#](isDebugEnabled) ### Removed From d478f28a73f5d5ed74cfb125a3dcbb2d68c25952 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 2 Sep 2023 11:44:30 +0200 Subject: [PATCH 31/31] Fix NPE --- .../org/jabref/gui/exporter/ExportToClipboardActionTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/org/jabref/gui/exporter/ExportToClipboardActionTest.java b/src/test/java/org/jabref/gui/exporter/ExportToClipboardActionTest.java index 5321fe1ae7c..9602c84fd59 100644 --- a/src/test/java/org/jabref/gui/exporter/ExportToClipboardActionTest.java +++ b/src/test/java/org/jabref/gui/exporter/ExportToClipboardActionTest.java @@ -23,6 +23,7 @@ import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.StandardEntryType; import org.jabref.model.metadata.MetaData; +import org.jabref.model.metadata.SaveOrder; import org.jabref.preferences.FilePreferences; import org.jabref.preferences.LibraryPreferences; import org.jabref.preferences.PreferencesService; @@ -92,6 +93,7 @@ public void export(BibDatabaseContext databaseContext, Path file, List when(preferences.getFilePreferences()).thenReturn(filePreferences); when(preferences.getLibraryPreferences()).thenReturn(libraryPreferences); when(preferences.getExportPreferences().getLastExportExtension()).thenReturn("HTML"); + when(preferences.getExportConfiguration().getSaveOrder()).thenReturn(SaveOrder.getDefaultSaveOrder()); when(stateManager.getSelectedEntries()).thenReturn(selectedEntries); when(stateManager.getActiveDatabase()).thenReturn(Optional.ofNullable(databaseContext)); // noinspection ConstantConditions since databaseContext is mocked