package com.limegroup.gnutella.settings;
import java.util.Properties;
import com.limegroup.gnutella.Assert;
public abstract class AbstractNumberSetting extends Setting {
/**
* Adds a safeguard against simpp making a setting take a value beyond the
* reasonable max
*/
protected final Number MAX_VALUE;
/**
* Adds a safeguard against simpp making a setting take a value below the
* reasonable min
*/
protected final Number MIN_VALUE;
protected AbstractNumberSetting(Properties defaultProps, Properties props,
String key, String defaultValue,
String simppKey, Number min, Number max) {
super(defaultProps, props, key, defaultValue, simppKey);
if(max != null && min != null) {//do we need to check max, min?
// All standard library Numbers implement Comparable
Comparable comparableMax = (Comparable) max;
if(comparableMax.compareTo(min) < 0) //max less than min?
throw new IllegalArgumentException("max less than min");
}
MAX_VALUE = max;
MIN_VALUE = min;
}
/**
* 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) {
if(isSimppEnabled()) {
Assert.that(MAX_VALUE != null, "simpp setting created with no max");
Assert.that(MIN_VALUE != null, "simpp setting created with no min");
}
value = normalizeValue(value);
super.setValue(value);
}
/**
* Normalizes a value to an acceptable value for this setting.
*/
protected String normalizeValue(String value) {
Comparable comparableValue = null;
try {
comparableValue = convertToComparable(value);
} catch (NumberFormatException e) {
return DEFAULT_VALUE;
}
if (MAX_VALUE != null && comparableValue.compareTo(MAX_VALUE) > 0) {
return MAX_VALUE.toString();
} else if (MIN_VALUE != null && comparableValue.compareTo(MIN_VALUE) < 0) {
return MIN_VALUE.toString();
}
return value;
}
/**
* Converts a String to a Comparable of the same type as MAX_VALUE and MIN_VALUE.
*/
abstract protected Comparable convertToComparable(String value);
}