package org.jkiss.dbeaver.model.impl.preferences; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.jkiss.utils.CommonUtils; import org.osgi.framework.Bundle; import org.osgi.service.prefs.BackingStoreException; import java.io.IOException; public class BundlePreferenceStore extends AbstractPreferenceStore { private final IEclipsePreferences defaultProps; private final IEclipsePreferences props; private boolean dirty = false; public BundlePreferenceStore(Bundle bundle) { defaultProps = DefaultScope.INSTANCE.getNode(bundle.getSymbolicName()); props = InstanceScope.INSTANCE.getNode(bundle.getSymbolicName()); } @Override public boolean contains(String name) { return props.get(name, null) != null || defaultProps.get(name, null) != null; } @Override public boolean getBoolean(String name) { return props.get(name, null) != null ? props.getBoolean(name, BOOLEAN_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.getBoolean(name, BOOLEAN_DEFAULT_DEFAULT) : BOOLEAN_DEFAULT_DEFAULT; } @Override public double getDouble(String name) { return props.get(name, null) != null ? props.getDouble(name, DOUBLE_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.getDouble(name, DOUBLE_DEFAULT_DEFAULT) : DOUBLE_DEFAULT_DEFAULT; } @Override public float getFloat(String name) { return props.get(name, null) != null ? props.getFloat(name, FLOAT_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.getFloat(name, FLOAT_DEFAULT_DEFAULT) : FLOAT_DEFAULT_DEFAULT; } @Override public int getInt(String name) { return props.get(name, null) != null ? props.getInt(name, INT_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.getInt(name, INT_DEFAULT_DEFAULT) : INT_DEFAULT_DEFAULT; } @Override public long getLong(String name) { return props.get(name, null) != null ? props.getLong(name, LONG_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.getLong(name, LONG_DEFAULT_DEFAULT) : LONG_DEFAULT_DEFAULT; } @Override public String getString(String name) { return props.get(name, null) != null ? props.get(name, STRING_DEFAULT_DEFAULT) : defaultProps.get(name, null) != null ? defaultProps.get(name, STRING_DEFAULT_DEFAULT) : STRING_DEFAULT_DEFAULT; } @Override public boolean getDefaultBoolean(String name) { return defaultProps.getBoolean(name, BOOLEAN_DEFAULT_DEFAULT); } @Override public double getDefaultDouble(String name) { return defaultProps.getDouble(name, DOUBLE_DEFAULT_DEFAULT); } @Override public float getDefaultFloat(String name) { return defaultProps.getFloat(name, FLOAT_DEFAULT_DEFAULT); } @Override public int getDefaultInt(String name) { return defaultProps.getInt(name, INT_DEFAULT_DEFAULT); } @Override public long getDefaultLong(String name) { return defaultProps.getLong(name, LONG_DEFAULT_DEFAULT); } @Override public String getDefaultString(String name) { return defaultProps.get(name, STRING_DEFAULT_DEFAULT); } @Override public boolean isDefault(String name) { return props.get(name, null) == null && defaultProps.get(name, null) != null; } @Override public boolean needsSaving() { return dirty; } @Override public void setDefault(String name, double value) { defaultProps.putDouble(name, value); } @Override public void setDefault(String name, float value) { defaultProps.putFloat(name, value); } @Override public void setDefault(String name, int value) { defaultProps.putInt(name, value); } @Override public void setDefault(String name, long value) { defaultProps.putLong(name, value); } @Override public void setDefault(String name, String defaultObject) { defaultProps.put(name, defaultObject); } @Override public void setDefault(String name, boolean value) { defaultProps.putBoolean(name, value); } @Override public void setToDefault(String name) { String oldValue = getString(name); String defaultValue = getDefaultString(name); props.remove(name); if (!CommonUtils.equalObjects(oldValue, defaultValue)) { dirty = true; firePropertyChangeEvent(name, oldValue, defaultValue); } } @Override public void setValue(String name, double value) { double oldValue = getDouble(name); if (oldValue == value) { return; } if (getDefaultDouble(name) == value) { props.remove(name); } else { props.putDouble(name, value); } dirty = true; firePropertyChangeEvent(name, new Double(oldValue), new Double(value)); } @Override public void setValue(String name, float value) { float oldValue = getFloat(name); if (oldValue == value) { return; } if (getDefaultFloat(name) == value) { props.remove(name); } else { props.putFloat(name, value); } dirty = true; firePropertyChangeEvent(name, new Float(oldValue), new Float(value)); } @Override public void setValue(String name, int value) { int oldValue = getInt(name); if (oldValue == value) { return; } if (getDefaultInt(name) == value) { props.remove(name); } else { props.putInt(name, value); } dirty = true; firePropertyChangeEvent(name, new Integer(oldValue), new Integer(value)); } @Override public void setValue(String name, long value) { long oldValue = getLong(name); if (oldValue == value) { return; } if (getDefaultLong(name) == value) { props.remove(name); } else { props.putLong(name, value); } dirty = true; firePropertyChangeEvent(name, new Long(oldValue), new Long(value)); } @Override public void setValue(String name, String value) { String oldValue = getString(name); if (CommonUtils.equalObjects(oldValue, value)) { return; } if (getDefaultString(name).equals(value)) { props.remove(name); } else { props.put(name, value); } dirty = true; firePropertyChangeEvent(name, oldValue, value); } @Override public void setValue(String name, boolean value) { boolean oldValue = getBoolean(name); if (oldValue == value) { return; } if (getDefaultBoolean(name) == value) { props.remove(name); } else { props.putBoolean(name, value); } dirty = true; firePropertyChangeEvent(name, oldValue ? Boolean.TRUE : Boolean.FALSE, value ? Boolean.TRUE : Boolean.FALSE); } @Override public void save() throws IOException { try { props.flush(); defaultProps.flush(); } catch (BackingStoreException e) { throw new IOException(e); } } }