package com.intellij.ide; import com.intellij.openapi.util.Comparing; import com.intellij.util.text.StringTokenizer; import java.util.Locale; import java.util.prefs.Preferences; /** * Utility class for working with Preferences * todo: in one year the migration code could be removed * @author Eugene Zhuravlev * Date: 05-Mar-16 */ public class Prefs { public static void put(String key, String value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).put(getNodeKey(key), value); } public static String get(String key, String def) { migrate(key, def, Preferences::get, Preferences::put); return getPreferences(key).get(getNodeKey(key), def); } public static void putInt(String key, int value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putInt(getNodeKey(key), value); } public static int getInt(String key, int def) { migrate(key, def, Preferences::getInt, Preferences::putInt); return getPreferences(key).getInt(getNodeKey(key), def); } public static void putLong(String key, long value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putLong(getNodeKey(key), value); } public static long getLong(String key, long def) { migrate(key, def, Preferences::getLong, Preferences::putLong); return getPreferences(key).getLong(getNodeKey(key), def); } public static void putBoolean(String key, boolean value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putBoolean(getNodeKey(key), value); } public static boolean getBoolean(String key, boolean def) { migrate(key, def, Preferences::getBoolean, Preferences::putBoolean); return getPreferences(key).getBoolean(getNodeKey(key), def); } public static void putFloat(String key, float value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putFloat(getNodeKey(key), value); } public static float getFloat(String key, float def) { migrate(key, def, Preferences::getFloat, Preferences::putFloat); return getPreferences(key).getFloat(getNodeKey(key), def); } public static void putDouble(String key, double value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putDouble(getNodeKey(key), value); } public static double getDouble(String key, double def) { migrate(key, def, Preferences::getDouble, Preferences::putDouble); return getPreferences(key).getDouble(getNodeKey(key), def); } public static void putByteArray(String key, byte[] value) { Preferences.userRoot().remove(key); // remove from old location getPreferences(key).putByteArray(getNodeKey(key), value); } public static byte[] getByteArray(String key, byte[] def) { migrate(key, def, Preferences::getByteArray, Preferences::putByteArray); return getPreferences(key).getByteArray(getNodeKey(key), def); } public static void remove(String key) { getPreferences(key).remove(getNodeKey(key)); } private static String getNodeKey(String key) { final int dotIndex = key.lastIndexOf('.'); return (dotIndex >= 0 ? key.substring(dotIndex + 1) : key).toLowerCase(Locale.US); } private static Preferences getPreferences(String key) { Preferences prefs = Preferences.userRoot(); final int dotIndex = key.lastIndexOf('.'); if (dotIndex > 0) { final StringTokenizer tokenizer = new StringTokenizer(key.substring(0, dotIndex), ".", false); while (tokenizer.hasMoreElements()) { prefs = prefs.node(tokenizer.nextElement().toLowerCase(Locale.US)); } } return prefs; } private interface Getter<T> { T get(Preferences prefs, String key, T def); } private interface Setter<T> { void set(Preferences prefs, String key, T value); } private static <T> void migrate(String key, T def, Getter<T> getter, Setter<T> setter) { // rewrite from old location into the new one final Preferences prefs = Preferences.userRoot(); final T val = getter.get(prefs, key, def); if (!Comparing.equal(val, def)) { setter.set(getPreferences(key), getNodeKey(key), val); prefs.remove(key); } } }