From d7a57b8b14e074dd9f74ba6bf291d0f5a9c36476 Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Sun, 26 Apr 2020 18:34:54 +0200 Subject: [PATCH] Backward compatibility for 4.3.1 (#6296) --- JabRef-downgrade-regpatch.reg | Bin 0 -> 356 bytes .../migrations/PreferencesMigrations.java | 66 +++++++++++++++++ .../jabref/preferences/JabRefPreferences.java | 12 ++- .../migrations/PreferencesMigrationsTest.java | 69 ++++++++++++++++++ 4 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 JabRef-downgrade-regpatch.reg diff --git a/JabRef-downgrade-regpatch.reg b/JabRef-downgrade-regpatch.reg new file mode 100644 index 0000000000000000000000000000000000000000..284394cfc8bd62671ac9bf91489ab638970776eb GIT binary patch literal 356 zcmaiw-%A2f5QV?zp#MR9S9|fXrwGD8Wlba62yIv0C^yz$>_4A=dsTW7<1*YibI#0} zdw0LjWGqO?*|MZYM9R$Ck`)D|m3!Gtl#6SO columnNames = preferences.getStringList(JabRefPreferences.COLUMN_NAMES); List columnWidths = preferences.getStringList(JabRefPreferences.COLUMN_WIDTHS) .stream() @@ -371,4 +382,59 @@ static void upgradeColumnPreferences(JabRefPreferences preferences) { .collect(Collectors.toList())); } } + + static void changeColumnVariableNamesFor51(JabRefPreferences preferences) { + // The variable names have to be hardcoded, because they have changed between 5.0 and 5.1 + List oldColumnNames = preferences.getStringList("columnNames"); + List columnNames = preferences.getStringList(JabRefPreferences.COLUMN_NAMES); + if (!oldColumnNames.isEmpty() && columnNames.isEmpty()) { + preferences.putStringList(JabRefPreferences.COLUMN_NAMES, preferences.getStringList("columnNames")); + preferences.putStringList(JabRefPreferences.COLUMN_WIDTHS, preferences.getStringList("columnWidths")); + preferences.putStringList(JabRefPreferences.COLUMN_SORT_TYPES, preferences.getStringList("columnSortTypes")); + preferences.putStringList(JabRefPreferences.COLUMN_SORT_ORDER, preferences.getStringList("columnSortOrder")); + } + } + + /** + * In 5.0 the format of column names have changed. That made newer versions of JabRef preferences incompatible with + * earlier versions of JabRef. As some complains came up, we decided to change the variable names and to clear the + * variable contents if they are unreadable, so former versions of JabRef would automatically create preferences + * they can deal with. + */ + static void restoreVariablesForBackwardCompatibility(JabRefPreferences preferences) { + List oldColumnNames = preferences.getStringList(JabRefPreferences.COLUMN_NAMES); + List fieldColumnNames = oldColumnNames.stream() + .filter(columnName -> columnName.startsWith("field:") || columnName.startsWith("special:")) + .map(columnName -> { + if (columnName.startsWith("field:")) { + return columnName.substring(6); + } else { // special + return columnName.substring(8); + } + }).collect(Collectors.toList()); + + if (!fieldColumnNames.isEmpty()) { + preferences.putStringList("columnNames", fieldColumnNames); + + List fieldColumnWidths = new ArrayList<>(Collections.emptyList()); + for (int i = 0; i < fieldColumnNames.size(); i++) { + fieldColumnWidths.add("100"); + } + preferences.putStringList("columnWidths", fieldColumnWidths); + + preferences.put("columnSortTypes", ""); + preferences.put("columnSortOrder", ""); + } + + // Ensure font size is a parsable int variable + try { + // some versions stored the font size as double to the **same** key + // since the preference store is type-safe, we need to add this workaround + String fontSizeAsString = preferences.get(JabRefPreferences.MAIN_FONT_SIZE); + int fontSizeAsInt = (int) Math.round(Double.parseDouble(fontSizeAsString)); + preferences.putInt(JabRefPreferences.MAIN_FONT_SIZE, fontSizeAsInt); + } catch (ClassCastException e) { + // already an integer + } + } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index ce792463db4..d6fc664ba94 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -147,10 +147,14 @@ public class JabRefPreferences implements PreferencesService { public static final String EXPORT_TERTIARY_SORT_FIELD = "exportTerSort"; public static final String EXPORT_TERTIARY_SORT_DESCENDING = "exportTerDescending"; public static final String NEWLINE = "newline"; - public static final String COLUMN_NAMES = "columnNames"; - public static final String COLUMN_WIDTHS = "columnWidths"; - public static final String COLUMN_SORT_TYPES = "columnSortTypes"; - public static final String COLUMN_SORT_ORDER = "columnSortOrder"; + + // Variable names have changed to ensure backward compatibility with pre 5.0 releases of JabRef + // Pre 5.1: columnNames, columnWidths, columnSortTypes, columnSortOrder + public static final String COLUMN_NAMES = "mainTableColumnNames"; + public static final String COLUMN_WIDTHS = "mainTableColumnWidths"; + public static final String COLUMN_SORT_TYPES = "mainTableColumnSortTypes"; + public static final String COLUMN_SORT_ORDER = "mainTableColumnSortOrder"; + public static final String SIDE_PANE_COMPONENT_PREFERRED_POSITIONS = "sidePaneComponentPreferredPositions"; public static final String SIDE_PANE_COMPONENT_NAMES = "sidePaneComponentNames"; public static final String XMP_PRIVACY_FILTERS = "xmpPrivacyFilters"; diff --git a/src/test/java/org/jabref/migrations/PreferencesMigrationsTest.java b/src/test/java/org/jabref/migrations/PreferencesMigrationsTest.java index 140aa4d3cae..78d3fc37a6b 100644 --- a/src/test/java/org/jabref/migrations/PreferencesMigrationsTest.java +++ b/src/test/java/org/jabref/migrations/PreferencesMigrationsTest.java @@ -1,6 +1,7 @@ package org.jabref.migrations; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.prefs.Preferences; @@ -219,4 +220,72 @@ void testUpgradeColumnPreferencesFromWithoutTypes() { verify(prefs).putStringList(JabRefPreferences.COLUMN_WIDTHS, updatedWidths); verify(prefs).putStringList(JabRefPreferences.COLUMN_SORT_TYPES, newSortTypes); } + + @Test + void testChangeColumnPreferencesVariableNamesFor51() { + List columnNames = Arrays.asList("entrytype", "author/editor", "title", "year", "journal/booktitle", "bibtexkey", "printed"); + List columnWidths = Arrays.asList("75", "300", "470", "60", "130", "100", "30"); + + // The variable names have to be hardcoded, because they have changed between 5.0 and 5.1 + when(prefs.getStringList("columnNames")).thenReturn(columnNames); + when(prefs.getStringList("columnWidths")).thenReturn(columnWidths); + when(prefs.getStringList("mainTableColumnSortTypes")).thenReturn(columnNames); + when(prefs.getStringList("mainTableColumnSortOrder")).thenReturn(columnWidths); + + when(prefs.getStringList(JabRefPreferences.COLUMN_NAMES)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_WIDTHS)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_SORT_TYPES)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_SORT_ORDER)).thenReturn(Collections.emptyList()); + + PreferencesMigrations.changeColumnVariableNamesFor51(prefs); + + verify(prefs).putStringList(JabRefPreferences.COLUMN_NAMES, columnNames); + verify(prefs).putStringList(JabRefPreferences.COLUMN_WIDTHS, columnWidths); + verify(prefs).putStringList(JabRefPreferences.COLUMN_NAMES, columnNames); + verify(prefs).putStringList(JabRefPreferences.COLUMN_WIDTHS, columnWidths); + } + + @Test + void testChangeColumnPreferencesVariableNamesBackwardsCompatibility() { + List columnNames = Arrays.asList("entrytype", "author/editor", "title", "year", "journal/booktitle", "bibtexkey", "printed"); + List columnWidths = Arrays.asList("75", "300", "470", "60", "130", "100", "30"); + + // The variable names have to be hardcoded, because they have changed between 5.0 and 5.1 + when(prefs.getStringList("columnNames")).thenReturn(columnNames); + when(prefs.getStringList("columnWidths")).thenReturn(columnWidths); + when(prefs.getStringList("mainTableColumnSortTypes")).thenReturn(columnNames); + when(prefs.getStringList("mainTableColumnSortOrder")).thenReturn(columnWidths); + + when(prefs.getStringList(JabRefPreferences.COLUMN_NAMES)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_WIDTHS)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_SORT_TYPES)).thenReturn(Collections.emptyList()); + when(prefs.getStringList(JabRefPreferences.COLUMN_SORT_ORDER)).thenReturn(Collections.emptyList()); + + PreferencesMigrations.upgradeColumnPreferences(prefs); + + verify(prefs, never()).put("columnNames", "anyString"); + verify(prefs, never()).put("columnWidths", "anyString"); + verify(prefs, never()).put("mainTableColumnSortTypes", "anyString"); + verify(prefs, never()).put("mainTableColumnSortOrder", "anyString"); + } + + @Test + void testRestoreColumnVariablesForBackwardCompatibility() { + List updatedNames = Arrays.asList("groups", "files", "linked_id", "field:entrytype", "field:author/editor", "field:title", "field:year", "field:journal/booktitle", "field:bibtexkey", "special:printed"); + List columnNames = Arrays.asList("entrytype", "author/editor", "title", "year", "journal/booktitle", "bibtexkey", "printed"); + List columnWidths = Arrays.asList("100", "100", "100", "100", "100", "100", "100"); + + when(prefs.getStringList(JabRefPreferences.COLUMN_NAMES)).thenReturn(updatedNames); + + when(prefs.get(JabRefPreferences.MAIN_FONT_SIZE)).thenReturn("11.2"); + + PreferencesMigrations.restoreVariablesForBackwardCompatibility(prefs); + + verify(prefs).putStringList("columnNames", columnNames); + verify(prefs).putStringList("columnWidths", columnWidths); + verify(prefs).put("columnSortTypes", ""); + verify(prefs).put("columnSortOrder", ""); + + verify(prefs).putInt(JabRefPreferences.MAIN_FONT_SIZE, 11); + } }