/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.model.impl.preferences;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceListener;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.utils.CommonUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Preference store which can be stored/loaded in any way.
* Also it can use parent store to obtain values from it if this store do not contain the key.
* However, save will always use THIS store, not parent.
* Originally copied from standard PreferenceStore class
*/
public abstract class SimplePreferenceStore extends AbstractPreferenceStore implements DBPPreferenceListener {
private DBPPreferenceStore parentStore;
private Map<String, String> properties;
private Map<String, String> defaultProperties;
private boolean dirty = false;
public SimplePreferenceStore()
{
defaultProperties = new HashMap<>();
properties = new HashMap<>();
}
protected SimplePreferenceStore(DBPPreferenceStore parentStore)
{
this();
this.parentStore = parentStore;
if (parentStore != null) {
parentStore.addPropertyChangeListener(this);
}
}
public DBPPreferenceStore getParentStore()
{
return parentStore;
}
public Map<String, String> getProperties()
{
return properties;
}
public void setProperties(Map<String, String> properties)
{
this.properties = properties;
}
public Map<String, String> getDefaultProperties()
{
return defaultProperties;
}
public void setDefaultProperties(Map<String, String> defaultProperties)
{
this.defaultProperties = defaultProperties;
}
public void clear()
{
properties.clear();
}
@Override
public void addPropertyChangeListener(DBPPreferenceListener listener)
{
addListenerObject(listener);
}
@Override
public void removePropertyChangeListener(DBPPreferenceListener listener)
{
removeListenerObject(listener);
}
@Override
public boolean contains(String name)
{
return (properties.containsKey(name) || defaultProperties
.containsKey(name));
}
@Override
public void firePropertyChangeEvent(String name, Object oldValue, Object newValue)
{
final Object[] finalListeners = getListeners();
// Do we need to fire an event.
if (finalListeners.length > 0
&& (oldValue == null || !oldValue.equals(newValue))) {
final PreferenceChangeEvent pe = new PreferenceChangeEvent(this, name,
oldValue, newValue);
for (int i = 0; i < finalListeners.length; ++i) {
final DBPPreferenceListener l = (DBPPreferenceListener) finalListeners[i];
l.preferenceChange(pe);
}
}
}
@Override
public boolean getBoolean(String name)
{
return toBoolean(getString(name));
}
@Override
public boolean getDefaultBoolean(String name)
{
return toBoolean(getDefaultString(name));
}
private boolean toBoolean(String value)
{
return value != null && value.equals(AbstractPreferenceStore.TRUE);
}
@Override
public double getDouble(String name)
{
return toDouble(getString(name));
}
@Override
public double getDefaultDouble(String name)
{
return toDouble(getDefaultString(name));
}
private double toDouble(String value)
{
double ival = DOUBLE_DEFAULT_DEFAULT;
if (!CommonUtils.isEmpty(value)) {
try {
ival = Double.parseDouble(value);
} catch (NumberFormatException e) {
// do nothing
}
}
return ival;
}
@Override
public float getFloat(String name)
{
return toFloat(getString(name));
}
@Override
public float getDefaultFloat(String name)
{
return toFloat(getDefaultString(name));
}
private float toFloat(String value)
{
float ival = FLOAT_DEFAULT_DEFAULT;
if (!CommonUtils.isEmpty(value)) {
try {
ival = Float.parseFloat(value);
} catch (NumberFormatException e) {
// do nothing
}
}
return ival;
}
@Override
public int getInt(String name)
{
return toInt(getString(name));
}
@Override
public int getDefaultInt(String name)
{
return toInt(getDefaultString(name));
}
private int toInt(String value)
{
int ival = INT_DEFAULT_DEFAULT;
if (!CommonUtils.isEmpty(value)) {
try {
ival = Integer.parseInt(value);
} catch (NumberFormatException e) {
// do nothing
}
}
return ival;
}
@Override
public long getLong(String name)
{
return toLong(getString(name));
}
@Override
public long getDefaultLong(String name)
{
return toLong(getDefaultString(name));
}
private long toLong(String value)
{
long ival = LONG_DEFAULT_DEFAULT;
if (!CommonUtils.isEmpty(value)) {
try {
ival = Long.parseLong(value);
} catch (NumberFormatException e) {
// do nothing
}
}
return ival;
}
@Override
public String getString(String name)
{
String value = properties.get(name);
if (value == null) {
if (parentStore.isDefault(name)) {
value = defaultProperties.get(name);
}
if (value == null) {
value = parentStore.getString(name);
}
}
return value;
}
@Override
public String getDefaultString(String name)
{
String value = defaultProperties.get(name);
if (value == null) {
if (parentStore.isDefault(name)) {
return parentStore.getDefaultString(name);
} else {
return "";
}
}
return value;
}
@Override
public boolean isDefault(String name)
{
return (!properties.containsKey(name) && (defaultProperties.containsKey(name) || parentStore.isDefault(name)));
}
public boolean isSet(String name)
{
return properties.containsKey(name);
}
@Override
public boolean needsSaving()
{
return dirty;
}
public String[] preferenceNames()
{
return properties.keySet().toArray(new String[properties.size()]);
}
@Override
public void setDefault(String name, double value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setDefault(String name, float value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setDefault(String name, int value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setDefault(String name, long value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setDefault(String name, String value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setDefault(String name, boolean value)
{
defaultProperties.put(name, String.valueOf(value));
}
@Override
public void setToDefault(String name)
{
Object oldValue = properties.get(name);
properties.remove(name);
dirty = true;
Object newValue = null;
if (defaultProperties != null) {
newValue = defaultProperties.get(name);
}
firePropertyChangeEvent(name, oldValue, newValue);
}
@Override
public void setValue(String name, double value)
{
double oldValue = getDouble(name);
if (oldValue != value || !isSet(name)) {
properties.put(name, String.valueOf(value));
dirty = true;
firePropertyChangeEvent(name, oldValue, value);
}
}
@Override
public void setValue(String name, float value)
{
float oldValue = getFloat(name);
if (oldValue != value || !isSet(name)) {
properties.put(name, String.valueOf(value));
dirty = true;
firePropertyChangeEvent(name, oldValue, value);
}
}
@Override
public void setValue(String name, int value)
{
int oldValue = getInt(name);
if (oldValue != value || !isSet(name)) {
properties.put(name, String.valueOf(value));
dirty = true;
firePropertyChangeEvent(name, oldValue, value);
}
}
@Override
public void setValue(String name, long value)
{
long oldValue = getLong(name);
if (oldValue != value || !isSet(name)) {
properties.put(name, String.valueOf(value));
dirty = true;
firePropertyChangeEvent(name, oldValue, value);
}
}
@Override
public void setValue(String name, String value)
{
String oldValue = getString(name);
if (oldValue == null || !oldValue.equals(value) || !isSet(name)) {
properties.put(name, value);
dirty = true;
firePropertyChangeEvent(name, oldValue, value);
}
}
@Override
public void setValue(String name, boolean value)
{
boolean oldValue = getBoolean(name);
if (oldValue != value || !isSet(name)) {
properties.put(name, String.valueOf(value));
dirty = true;
firePropertyChangeEvent(name, oldValue ? Boolean.TRUE
: Boolean.FALSE, value ? Boolean.TRUE : Boolean.FALSE);
}
}
@Override
public void preferenceChange(PreferenceChangeEvent event)
{
for (Object listener : getListeners()) {
((DBPPreferenceListener)listener).preferenceChange(event);
}
}
}