package org.jabref.migrations;
import java.util.HashMap;
import java.util.Map;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import org.jabref.Globals;
import org.jabref.JabRefMain;
import org.jabref.model.bibtexkeypattern.GlobalBibtexKeyPattern;
import org.jabref.model.entry.FieldName;
import org.jabref.preferences.JabRefPreferences;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class PreferencesMigrations {
private static final Log LOGGER = LogFactory.getLog(PreferencesMigrations.class);
private PreferencesMigrations() {
}
/**
* Migrate all preferences from net/sf/jabref to org/jabref
*/
public static void upgradePrefsToOrgJabRef() {
JabRefPreferences prefs = Globals.prefs;
Preferences mainPrefsNode = Preferences.userNodeForPackage(JabRefMain.class);
try {
if (mainPrefsNode.childrenNames().length != 0) {
// skip further processing as prefs already have been migrated
LOGGER.debug("New prefs node already exists with content - skipping migration");
} else {
if ( mainPrefsNode.parent().parent().nodeExists("net/sf/jabref")) {
LOGGER.info("Migrating old preferences.");
Preferences oldNode = mainPrefsNode.parent().parent().node("net/sf/jabref");
copyPrefsRecursively(oldNode, mainPrefsNode);
}
}
} catch (BackingStoreException ex) {
LOGGER.error("Migrating old preferences failed.", ex);
}
}
private static void copyPrefsRecursively(Preferences from, Preferences to) throws BackingStoreException {
for (String key : from.keys()) {
String newValue = from.get(key, "");
if (newValue.contains("net.sf")) {
newValue = newValue.replaceAll("net\\.sf", "org");
}
to.put(key, newValue);
}
for (String child : from.childrenNames()) {
Preferences childNode = from.node(child);
Preferences newChildNode = to.node(child);
copyPrefsRecursively(childNode, newChildNode);
}
}
/**
* Added from Jabref 2.11 beta 4 onwards to fix wrong encoding names
*/
public static void upgradeFaultyEncodingStrings() {
JabRefPreferences prefs = Globals.prefs;
String defaultEncoding = prefs.get(JabRefPreferences.DEFAULT_ENCODING);
if (defaultEncoding == null) {
return;
}
Map<String, String> encodingMap = new HashMap<>();
encodingMap.put("UTF8", "UTF-8");
encodingMap.put("Cp1250", "CP1250");
encodingMap.put("Cp1251", "CP1251");
encodingMap.put("Cp1252", "CP1252");
encodingMap.put("Cp1253", "CP1253");
encodingMap.put("Cp1254", "CP1254");
encodingMap.put("Cp1257", "CP1257");
encodingMap.put("ISO8859_1", "ISO8859-1");
encodingMap.put("ISO8859_2", "ISO8859-2");
encodingMap.put("ISO8859_3", "ISO8859-3");
encodingMap.put("ISO8859_4", "ISO8859-4");
encodingMap.put("ISO8859_5", "ISO8859-5");
encodingMap.put("ISO8859_6", "ISO8859-6");
encodingMap.put("ISO8859_7", "ISO8859-7");
encodingMap.put("ISO8859_8", "ISO8859-8");
encodingMap.put("ISO8859_9", "ISO8859-9");
encodingMap.put("ISO8859_13", "ISO8859-13");
encodingMap.put("ISO8859_15", "ISO8859-15");
encodingMap.put("KOI8_R", "KOI8-R");
encodingMap.put("Big5_HKSCS", "Big5-HKSCS");
encodingMap.put("EUC_JP", "EUC-JP");
if (encodingMap.containsKey(defaultEncoding)) {
prefs.put(JabRefPreferences.DEFAULT_ENCODING, encodingMap.get(defaultEncoding));
}
}
/**
* Upgrade the sort order preferences for the current version
* The old preference is kept in case an old version of JabRef is used with
* these preferences, but it is only used when the new preference does not
* exist
*/
public static void upgradeSortOrder() {
JabRefPreferences prefs = Globals.prefs;
if (prefs.get(JabRefPreferences.EXPORT_IN_SPECIFIED_ORDER, null) == null) {
if (prefs.getBoolean("exportInStandardOrder", false)) {
prefs.putBoolean(JabRefPreferences.EXPORT_IN_SPECIFIED_ORDER, true);
prefs.put(JabRefPreferences.EXPORT_PRIMARY_SORT_FIELD, FieldName.AUTHOR);
prefs.put(JabRefPreferences.EXPORT_SECONDARY_SORT_FIELD, FieldName.EDITOR);
prefs.put(JabRefPreferences.EXPORT_TERTIARY_SORT_FIELD, FieldName.YEAR);
prefs.putBoolean(JabRefPreferences.EXPORT_PRIMARY_SORT_DESCENDING, false);
prefs.putBoolean(JabRefPreferences.EXPORT_SECONDARY_SORT_DESCENDING, false);
prefs.putBoolean(JabRefPreferences.EXPORT_TERTIARY_SORT_DESCENDING, false);
} else if (prefs.getBoolean("exportInTitleOrder", false)) {
// exportInTitleOrder => title, author, editor
prefs.putBoolean(JabRefPreferences.EXPORT_IN_SPECIFIED_ORDER, true);
prefs.put(JabRefPreferences.EXPORT_PRIMARY_SORT_FIELD, FieldName.TITLE);
prefs.put(JabRefPreferences.EXPORT_SECONDARY_SORT_FIELD, FieldName.AUTHOR);
prefs.put(JabRefPreferences.EXPORT_TERTIARY_SORT_FIELD, FieldName.EDITOR);
prefs.putBoolean(JabRefPreferences.EXPORT_PRIMARY_SORT_DESCENDING, false);
prefs.putBoolean(JabRefPreferences.EXPORT_SECONDARY_SORT_DESCENDING, false);
prefs.putBoolean(JabRefPreferences.EXPORT_TERTIARY_SORT_DESCENDING, false);
}
}
}
/**
* Migrate all customized entry types from versions <=3.7
*/
public static void upgradeStoredCustomEntryTypes() {
JabRefPreferences prefs = Globals.prefs;
Preferences mainPrefsNode = Preferences.userNodeForPackage(JabRefMain.class);
try {
if (mainPrefsNode.nodeExists(JabRefPreferences.CUSTOMIZED_BIBTEX_TYPES) ||
mainPrefsNode.nodeExists(JabRefPreferences.CUSTOMIZED_BIBLATEX_TYPES) ) {
// skip further processing as prefs already have been migrated
} else {
LOGGER.info("Migrating old custom entry types.");
CustomEntryTypePreferenceMigration.upgradeStoredCustomEntryTypes(prefs.getDefaultBibDatabaseMode());
}
} catch (BackingStoreException ex) {
LOGGER.error("Migrating old custom entry types failed.", ex);
}
}
/**
* Migrate LabelPattern configuration from versions <=3.5 to new BibtexKeyPatterns
*/
public static void upgradeLabelPatternToBibtexKeyPattern() {
JabRefPreferences prefs = Globals.prefs;
try {
Preferences mainPrefsNode = Preferences.userNodeForPackage(JabRefMain.class);
// Migrate default pattern
if (mainPrefsNode.get(JabRefPreferences.DEFAULT_BIBTEX_KEY_PATTERN, null) == null) {
// Check whether old defaultLabelPattern is set
String oldDefault = mainPrefsNode.get("defaultLabelPattern", null);
if (oldDefault != null) {
prefs.put(JabRefPreferences.DEFAULT_BIBTEX_KEY_PATTERN, oldDefault);
LOGGER.info("Upgraded old default key generator pattern '" + oldDefault + "' to new version.");
}
}
//Pref node already exists do not migrate from previous version
if (mainPrefsNode.nodeExists(JabRefPreferences.BIBTEX_KEY_PATTERNS_NODE)) {
return;
}
// Migrate type specific patterns
// Check for prefs node for Version 3.3-3.5
if (mainPrefsNode.nodeExists("logic/labelpattern")) {
migrateTypedKeyPrefs(prefs, mainPrefsNode.node("logic/labelpattern"));
} else if (mainPrefsNode.nodeExists("logic/labelPattern")) { // node used for version 3.0-3.2
migrateTypedKeyPrefs(prefs, mainPrefsNode.node("logic/labelPattern"));
} else if (mainPrefsNode.nodeExists("labelPattern")) { // node used for version <3.0
migrateTypedKeyPrefs(prefs, mainPrefsNode.node("labelPattern"));
}
} catch (BackingStoreException e) {
LOGGER.error("Migrating old bibtexKeyPatterns failed.", e);
}
}
private static void migrateTypedKeyPrefs(JabRefPreferences prefs, Preferences oldPatternPrefs)
throws BackingStoreException {
LOGGER.info("Found old Bibtex Key patterns which will be migrated to new version.");
GlobalBibtexKeyPattern keyPattern = GlobalBibtexKeyPattern.fromPattern(
prefs.get(JabRefPreferences.DEFAULT_BIBTEX_KEY_PATTERN)
);
for (String key : oldPatternPrefs.keys()) {
keyPattern.addBibtexKeyPattern(key, oldPatternPrefs.get(key, null));
}
prefs.putKeyPattern(keyPattern);
}
}