package com.limegroup.gnutella.settings;
import java.util.Properties;
/**
* Private abstract class for an individual setting. Subclasses of this
* class provide typing for settings.
*/
public abstract class Setting {
/**
* Protected default <tt>Properties</tt> instance for subclasses.
*/
protected final Properties DEFAULT_PROPS;
/**
* Protected <tt>Properties</tt> instance containing properties for any
* subclasses.
*/
protected final Properties PROPS;
/**
* The constant key for this property, specified upon construction.
*/
protected final String KEY;
/**
* Constant for the default value for this <tt>Setting</tt>.
*/
protected final String DEFAULT_VALUE;
/**
* Value for whether or not this setting should always save.
*/
private boolean _alwaysSave = false;
/**
* Setting for whether or not this setting is private and should
* not be reported in bug reports.
*/
private boolean _isPrivate = false;
/**
* The string which will be used to identify the setting the simpp message
* is trying to set. For non-simppable setting this value must be null, for
* simppable settings the setting must have a value which will NEVER change
*/
private final String SIMPP_KEY;
/**
* Constructs a new setting with the specified key and default
* value. Private access ensures that only this class can construct
* new <tt>Setting</tt>s.
*
* @param key the key for the setting
* @param defaultValue the defaultValue for the setting
* @param simppKey the string used to identify a simpp setting. This must
* have a valid value for simppable settings and must be null for
* non-simppable settings.
* @throws <tt>IllegalArgumentException</tt> if the key for this
* setting is already contained in the map of default settings
*/
protected Setting(Properties defaultProps, Properties props, String key,
String defaultValue, String simppKey) {
DEFAULT_PROPS = defaultProps;
PROPS = props;
KEY = key;
SIMPP_KEY = simppKey;
DEFAULT_VALUE = defaultValue;
if(DEFAULT_PROPS.containsKey(key))
throw new IllegalArgumentException("duplicate setting key");
DEFAULT_PROPS.put(KEY, defaultValue);
loadValue(defaultValue);
}
/**
* Reload value from properties object
*/
public void reload() {
String value = PROPS.getProperty(KEY);
if (value == null) value = DEFAULT_VALUE;
loadValue(value);
}
/**
* Revert to the default value.
* It is critically important that the DEFAULT_VALUE is valid,
* otherwise an infinite loop will be encountered when revertToDefault
* is called, as invalid values call revertToDefault.
* Because default values are hard-coded into the program, this is okay.
*/
public void revertToDefault() {
setValue(DEFAULT_VALUE);
}
/**
* Determines whether or not this value should always be saved to disk.
*/
public boolean shouldAlwaysSave() {
return _alwaysSave;
}
/**
* Sets whether or not this setting should always save, even if
* it is default.
* Returns this so it can be used during assignment.
*/
public Setting setAlwaysSave(boolean save) {
_alwaysSave = save;
return this;
}
/**
* Sets whether or not this setting should be reported in bug reports.
*/
public Setting setPrivate(boolean priv) {
_isPrivate = priv;
return this;
}
/**
* Determines whether or not a setting is private.
*/
public boolean isPrivate() {
return _isPrivate;
}
/**
* Determines whether or not the current value is the default value.
*/
public boolean isDefault() {
String value = PROPS.getProperty(KEY);
if (value == null)
return false;
return value.equals(DEFAULT_PROPS.getProperty(KEY));
}
/**
* Get the key for this setting.
*/
public String getKey() {
return KEY;
}
/**
* Returns the value as stored in the properties file.
*/
public String getValueAsString() {
return PROPS.getProperty(KEY);
}
/**
* Set new property value
* @param value new property value
*
* Note: This is the method used by SimmSettingsManager to load the setting
* with the value specified by Simpp
*/
protected void setValue(String value) {
PROPS.put(KEY, value);
loadValue(value);
}
public boolean isSimppEnabled() {
return (SIMPP_KEY != null);
}
/**
* Load value from property string value
* @param sValue property string value
*/
abstract protected void loadValue(String sValue);
}