package org.limewire.setting.jmx;
import java.io.File;
import javax.management.MXBean;
import org.limewire.setting.AbstractNumberSetting;
import org.limewire.setting.BooleanSetting;
import org.limewire.setting.ByteSetting;
import org.limewire.setting.FileSetting;
import org.limewire.setting.FloatSetting;
import org.limewire.setting.IntSetting;
import org.limewire.setting.LongSetting;
import org.limewire.setting.Setting;
import org.limewire.setting.StringSetting;
/**
* A JMX Bean interface for {@link Setting}s.
*/
@MXBean
public interface SettingBean {
/**
* Returns the type of the {@link Setting}.
*/
public String getType();
/**
* Returns the value of the {@link Setting}
*/
public String getValue();
/**
* Sets the value of the {@link Setting}
*/
public void setValue(String value);
/**
* Returns the minimum value of the {@link Setting} or {@code null}
* if it doesn't have a minimum value.
*/
public String getMinValue();
/**
* Returns the maximum value of the {@link Setting} or {@code null}
* if it doesn't have a maximum value.
*/
public String getMaxValue();
/**
* Reverts the current value to default
*/
public void revertToDefault();
/**
* Returns true if the current value is the default value
*/
public boolean isDefault();
/**
* Returns true if the current value is private
*/
public boolean isPrivate();
/**
* Sets weather or not the current value is private
*/
public void setPrivate(boolean value);
/**
* Determines whether or not this value should always be saved to disk.
*/
public boolean isShouldAlwaysSave();
/**
* Returns the key of the {@link Setting}
*/
public String getKey();
/**
* Returns the remote key of the {@link Setting}
*/
public String getRemoteKey();
/**
* Reloads the {@link Setting}'s value from the properties
*/
public void reload();
/**
* An implementation of {@link SettingBean}
*/
public static class Impl implements SettingBean {
private final Setting setting;
private final String remoteKey;
public Impl(Setting setting) {
this(setting, null);
}
public Impl(Setting setting, String remoteKey) {
this.setting = setting;
this.remoteKey = remoteKey;
}
@Override
public String getType() {
return setting.getClass().getName();
}
@Override
public String getValue() {
return setting.getValueAsString();
}
@Override
public void setValue(String value) {
if (setting instanceof BooleanSetting) {
((BooleanSetting)setting).setValue(Boolean.parseBoolean(value));
} else if (setting instanceof ByteSetting) {
((ByteSetting)setting).setValue(Byte.parseByte(value));
} else if (setting instanceof IntSetting) {
((IntSetting)setting).setValue(Integer.parseInt(value));
} else if (setting instanceof FloatSetting) {
((FloatSetting)setting).setValue(Float.parseFloat(value));
} else if (setting instanceof LongSetting) {
((LongSetting)setting).setValue(Long.parseLong(value));
} else if (setting instanceof FileSetting) {
((FileSetting)setting).set(new File(value));
} else if (setting instanceof StringSetting) {
((StringSetting)setting).set(value);
}
}
@Override
public String getMinValue() {
return getMinMaxValue(setting, true);
}
@Override
public String getMaxValue() {
return getMinMaxValue(setting, false);
}
@Override
public void revertToDefault() {
setting.revertToDefault();
}
@Override
public boolean isDefault() {
return setting.isDefault();
}
@Override
public boolean isPrivate() {
return setting.isPrivate();
}
@Override
public void setPrivate(boolean value) {
setting.setPrivate(value);
}
@Override
public boolean isShouldAlwaysSave() {
return setting.shouldAlwaysSave();
}
@Override
public String getKey() {
return setting.getKey();
}
@Override
public String getRemoteKey() {
return remoteKey;
}
@Override
public void reload() {
setting.reload();
}
/**
* Returns the minimum or maximum value of the given {@link Setting}
* if it's an instance of {@link AbstractNumberSetting}.
*/
private static String getMinMaxValue(Setting setting, boolean min) {
Number value = null;
if (setting instanceof AbstractNumberSetting<?>) {
if (min) {
value = ((AbstractNumberSetting<?>)setting).getMinValue();
} else {
value = ((AbstractNumberSetting<?>)setting).getMaxValue();
}
}
return value != null ? value.toString() : null;
}
}
}