net.md_5.config.Configuration Maven / Gradle / Ivy
package net.md_5.config;
import java.util.*;
public final class Configuration {
private static final char SEPARATOR = '.';
final Map self;
private final Configuration defaults;
public Configuration() {
this(null);
}
public Configuration(Configuration defaults) {
this(new LinkedHashMap(), defaults);
}
Configuration(Map, ?> map, Configuration defaults) {
this.self = new LinkedHashMap<>();
this.defaults = defaults;
for (Map.Entry, ?> entry : map.entrySet()) {
String key = (entry.getKey() == null) ? "null" : entry.getKey().toString();
if (entry.getValue() instanceof Map) {
this.self.put(key, new Configuration((Map) entry.getValue(),
(defaults == null) ? null : defaults.getSection(key)));
} else {
this.self.put(key, entry.getValue());
}
}
}
// Waterfall start - Allow configuration objects to be cloned
public Configuration(Configuration values, Configuration defaults) {
this(values.self, defaults);
}
// Waterfall end
private Configuration getSectionFor(String path) {
int index = path.indexOf(SEPARATOR);
if (index == -1) {
return this;
}
String root = path.substring(0, index);
Object section = self.get(root);
if (section == null) {
section = new Configuration((defaults == null) ? null : defaults.getSection(path));
self.put(root, section);
}
return (Configuration) section;
}
private String getChild(String path) {
int index = path.indexOf(SEPARATOR);
return (index == -1) ? path : path.substring(index + 1);
}
/*------------------------------------------------------------------------*/
@SuppressWarnings("unchecked")
public T get(String path, T def) {
Configuration section = getSectionFor(path);
Object val;
if (section == this) {
val = self.get(path);
} else {
val = section.get(getChild(path), def);
}
if (val == null && def instanceof Configuration) {
self.put(path, def);
}
return (val != null) ? (T) val : def;
}
public boolean contains(String path) {
return get(path, null) != null;
}
public Object get(String path) {
return get(path, getDefault(path));
}
public Object getDefault(String path) {
return (defaults == null) ? null : defaults.get(path);
}
public void set(String path, Object value) {
if (value instanceof Map) {
value = new Configuration((Map) value,
(defaults == null) ? null : defaults.getSection(path));
}
Configuration section = getSectionFor(path);
if (section == this) {
if (value == null) {
self.remove(path);
} else {
self.put(path, value);
}
} else {
section.set(getChild(path), value);
}
}
public Map getSelf() {
return self;
}
/*------------------------------------------------------------------------*/
public Configuration getSection(String path) {
Object def = getDefault(path);
return (Configuration) get(path, (def instanceof Configuration) ? def
: new Configuration((defaults == null) ? null : defaults.getSection(path)));
}
/**
* Gets keys, not deep by default.
*
* @return top level keys for this section
*/
public Collection getKeys() {
return new LinkedHashSet<>(self.keySet());
}
/*------------------------------------------------------------------------*/
public byte getByte(String path) {
Object def = getDefault(path);
return getByte(path, (def instanceof Number) ? ((Number) def).byteValue() : 0);
}
public byte getByte(String path, byte def) {
Number val = get(path, def);
return (val != null) ? val.byteValue() : def;
}
public List getByteList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).byteValue());
}
}
return result;
}
public short getShort(String path) {
Object def = getDefault(path);
return getShort(path, (def instanceof Number) ? ((Number) def).shortValue() : 0);
}
public short getShort(String path, short def) {
Number val = get(path, def);
return (val != null) ? val.shortValue() : def;
}
public List getShortList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).shortValue());
}
}
return result;
}
public int getInt(String path) {
Object def = getDefault(path);
return getInt(path, (def instanceof Number) ? ((Number) def).intValue() : 0);
}
public int getInt(String path, int def) {
Object val = get(path, def);
return (val instanceof Number) ? ((Number) val).intValue() : def;
}
public List getIntList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).intValue());
}
}
return result;
}
public long getLong(String path) {
Object def = getDefault(path);
return getLong(path, (def instanceof Number) ? ((Number) def).longValue() : 0);
}
public long getLong(String path, long def) {
Object val = get(path, def);
return (val instanceof Number) ? ((Number) val).longValue() : def;
}
public List getLongList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).longValue());
}
}
return result;
}
public float getFloat(String path) {
Object def = getDefault(path);
return getFloat(path, (def instanceof Number) ? ((Number) def).floatValue() : 0);
}
public float getFloat(String path, float def) {
Object val = get(path, def);
return (val instanceof Number) ? ((Number) val).floatValue() : def;
}
public List getFloatList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).floatValue());
}
}
return result;
}
public double getDouble(String path) {
Object def = getDefault(path);
return getDouble(path, (def instanceof Number) ? ((Number) def).doubleValue() : 0);
}
public double getDouble(String path, double def) {
Object val = get(path, def);
return (val instanceof Number) ? ((Number) val).doubleValue() : def;
}
public List getDoubleList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Number) {
result.add(((Number) object).doubleValue());
}
}
return result;
}
public boolean getBoolean(String path) {
Object def = getDefault(path);
return getBoolean(path, (def instanceof Boolean) ? (Boolean) def : false);
}
public boolean getBoolean(String path, boolean def) {
Object val = get(path, def);
return (val instanceof Boolean) ? (Boolean) val : def;
}
public List getBooleanList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Boolean) {
result.add((Boolean) object);
}
}
return result;
}
public char getChar(String path) {
Object def = getDefault(path);
return getChar(path, (def instanceof Character) ? (Character) def : '\u0000');
}
public char getChar(String path, char def) {
Object val = get(path, def);
return (val instanceof Character) ? (Character) val : def;
}
public List getCharList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Character) {
result.add((Character) object);
}
}
return result;
}
public String getString(String path) {
Object def = getDefault(path);
return getString(path, (def instanceof String) ? (String) def : "");
}
public String getString(String path, String def) {
Object val = get(path, def);
return (val instanceof String) ? (String) val : def;
}
public List getStringList(String path) {
List> list = getList(path);
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof String) {
result.add((String) object);
}
}
return result;
}
/*------------------------------------------------------------------------*/
public List> getList(String path) {
Object def = getDefault(path);
return getList(path, (def instanceof List>) ? (List>) def : Collections.EMPTY_LIST);
}
public List> getList(String path, List> def) {
Object val = get(path, def);
return (val != null) ? (List>) val : def;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy