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 super TableColumn>) 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