All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
cn.nukkit.utils.ConfigSection Maven / Gradle / Ivy
package cn.nukkit.utils;
import java.util.*;
/**
* @author fromgate
* @since 26.04.2016
*/
public class ConfigSection extends LinkedHashMap {
/**
* Empty ConfigSection constructor
*/
public ConfigSection() {
super();
}
/**
* Constructor of ConfigSection that contains initial key/value data
*
* @param key
* @param value
*/
public ConfigSection(String key, Object value) {
this();
this.set(key, value);
}
/**
* Constructor of ConfigSection, based on values stored in map.
*
* @param map
*/
public ConfigSection(LinkedHashMap map) {
this();
if (map == null || map.isEmpty()) return;
for (Map.Entry entry : map.entrySet()) {
if (entry.getValue() instanceof LinkedHashMap) {
super.put(entry.getKey(), new ConfigSection((LinkedHashMap) entry.getValue()));
} else if (entry.getValue() instanceof List) {
super.put(entry.getKey(), parseList((List) entry.getValue()));
} else {
super.put(entry.getKey(), entry.getValue());
}
}
}
private List parseList(List list) {
List newList = new ArrayList<>();
for (Object o : list) {
if (o instanceof LinkedHashMap) {
newList.add(new ConfigSection((LinkedHashMap) o));
} else {
newList.add(o);
}
}
return newList;
}
/**
* Get root section as LinkedHashMap
*
* @return
*/
public Map getAllMap() {
return new LinkedHashMap<>(this);
}
/**
* Get new instance of config section
*
* @return
*/
public ConfigSection getAll() {
return new ConfigSection(this);
}
/**
* Get object by key. If section does not contain value, return null
*/
public Object get(String key) {
return this.get(key, null);
}
/**
* Get object by key. If section does not contain value, return default value
*
* @param key
* @param defaultValue
* @return
*/
public T get(String key, T defaultValue) {
if (key == null || key.isEmpty()) return defaultValue;
if (super.containsKey(key)) return (T) super.get(key);
String[] keys = key.split("\\.", 2);
if (!super.containsKey(keys[0])) return defaultValue;
Object value = super.get(keys[0]);
if (value instanceof ConfigSection) {
ConfigSection section = (ConfigSection) value;
return section.get(keys[1], defaultValue);
}
return defaultValue;
}
/**
* Store value into config section
*
* @param key
* @param value
*/
public void set(String key, Object value) {
String[] subKeys = key.split("\\.", 2);
if (subKeys.length > 1) {
ConfigSection childSection = new ConfigSection();
if (this.containsKey(subKeys[0]) && super.get(subKeys[0]) instanceof ConfigSection)
childSection = (ConfigSection) super.get(subKeys[0]);
childSection.set(subKeys[1], value);
super.put(subKeys[0], childSection);
} else super.put(subKeys[0], value);
}
/**
* Check type of section element defined by key. Return true this element is ConfigSection
*
* @param key
* @return
*/
public boolean isSection(String key) {
Object value = this.get(key);
return value instanceof ConfigSection;
}
/**
* Get config section element defined by key
*
* @param key
* @return
*/
public ConfigSection getSection(String key) {
return this.get(key, new ConfigSection());
}
//@formatter:off
/**
* Get all ConfigSections in root path.
* Example config:
* a1:
* b1:
* c1:
* c2:
* a2:
* b2:
* c3:
* c4:
* a3: true
* a4: "hello"
* a5: 100
*
* getSections() will return new ConfigSection, that contains sections a1 and a2 only.
*
* @return
*/
//@formatter:on
public ConfigSection getSections() {
return getSections(null);
}
/**
* Get sections (and only sections) from provided path
*
* @param key - config section path, if null or empty root path will used.
* @return
*/
public ConfigSection getSections(String key) {
ConfigSection sections = new ConfigSection();
ConfigSection parent = key == null || key.isEmpty() ? this.getAll() : getSection(key);
if (parent == null) return sections;
parent.forEach((key1, value) -> {
if (value instanceof ConfigSection)
sections.put(key1, value);
});
return sections;
}
/**
* Get int value of config section element
*
* @param key - key (inside) current section (default value equals to 0)
* @return
*/
public int getInt(String key) {
return this.getInt(key, 0);
}
/**
* Get int value of config section element
*
* @param key - key (inside) current section
* @param defaultValue - default value that will returned if section element is not exists
* @return
*/
public int getInt(String key, int defaultValue) {
return this.get(key, ((Number) defaultValue)).intValue();
}
/**
* Check type of section element defined by key. Return true this element is Integer
*
* @param key
* @return
*/
public boolean isInt(String key) {
Object val = get(key);
return val instanceof Integer;
}
/**
* Get long value of config section element
*
* @param key - key (inside) current section
* @return
*/
public long getLong(String key) {
return this.getLong(key, 0);
}
/**
* Get long value of config section element
*
* @param key - key (inside) current section
* @param defaultValue - default value that will returned if section element is not exists
* @return
*/
public long getLong(String key, long defaultValue) {
return this.get(key, ((Number) defaultValue)).longValue();
}
/**
* Check type of section element defined by key. Return true this element is Long
*
* @param key
* @return
*/
public boolean isLong(String key) {
Object val = get(key);
return val instanceof Long;
}
/**
* Get double value of config section element
*
* @param key - key (inside) current section
* @return
*/
public double getDouble(String key) {
return this.getDouble(key, 0);
}
/**
* Get double value of config section element
*
* @param key - key (inside) current section
* @param defaultValue - default value that will returned if section element is not exists
* @return
*/
public double getDouble(String key, double defaultValue) {
return this.get(key, ((Number) defaultValue)).doubleValue();
}
/**
* Check type of section element defined by key. Return true this element is Double
*
* @param key
* @return
*/
public boolean isDouble(String key) {
Object val = get(key);
return val instanceof Double;
}
/**
* Get String value of config section element
*
* @param key - key (inside) current section
* @return
*/
public String getString(String key) {
return this.getString(key, "");
}
/**
* Get String value of config section element
*
* @param key - key (inside) current section
* @param defaultValue - default value that will returned if section element is not exists
* @return
*/
public String getString(String key, String defaultValue) {
Object result = this.get(key, defaultValue);
return String.valueOf(result);
}
/**
* Check type of section element defined by key. Return true this element is String
*
* @param key
* @return
*/
public boolean isString(String key) {
Object val = get(key);
return val instanceof String;
}
/**
* Get boolean value of config section element
*
* @param key - key (inside) current section
* @return
*/
public boolean getBoolean(String key) {
return this.getBoolean(key, false);
}
/**
* Get boolean value of config section element
*
* @param key - key (inside) current section
* @param defaultValue - default value that will returned if section element is not exists
* @return
*/
public boolean getBoolean(String key, boolean defaultValue) {
return this.get(key, defaultValue);
}
/**
* Check type of section element defined by key. Return true this element is Integer
*
* @param key
* @return
*/
public boolean isBoolean(String key) {
Object val = get(key);
return val instanceof Boolean;
}
/**
* Get List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getList(String key) {
return this.getList(key, null);
}
/**
* Get List value of config section element
*
* @param key - key (inside) current section
* @param defaultList - default value that will returned if section element is not exists
* @return
*/
public List getList(String key, List defaultList) {
return this.get(key, defaultList);
}
/**
* Check type of section element defined by key. Return true this element is List
*
* @param key
* @return
*/
public boolean isList(String key) {
Object val = get(key);
return val instanceof List;
}
/**
* Get String List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getStringList(String key) {
List value = this.getList(key);
if (value == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object o : value) {
if (o instanceof String || o instanceof Number || o instanceof Boolean || o instanceof Character) {
result.add(String.valueOf(o));
}
}
return result;
}
/**
* Get Integer List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getIntegerList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Integer) {
result.add((Integer) object);
} else if (object instanceof String) {
try {
result.add(Integer.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((int) (Character) object);
} else if (object instanceof Number) {
result.add(((Number) object).intValue());
}
}
return result;
}
/**
* Get Boolean List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getBooleanList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Boolean) {
result.add((Boolean) object);
} else if (object instanceof String) {
if (Boolean.TRUE.toString().equals(object)) {
result.add(true);
} else if (Boolean.FALSE.toString().equals(object)) {
result.add(false);
}
}
}
return result;
}
/**
* Get Double List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getDoubleList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Double) {
result.add((Double) object);
} else if (object instanceof String) {
try {
result.add(Double.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((double) (Character) object);
} else if (object instanceof Number) {
result.add(((Number) object).doubleValue());
}
}
return result;
}
/**
* Get Float List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getFloatList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Float) {
result.add((Float) object);
} else if (object instanceof String) {
try {
result.add(Float.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((float) (Character) object);
} else if (object instanceof Number) {
result.add(((Number) object).floatValue());
}
}
return result;
}
/**
* Get Long List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getLongList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Long) {
result.add((Long) object);
} else if (object instanceof String) {
try {
result.add(Long.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((long) (Character) object);
} else if (object instanceof Number) {
result.add(((Number) object).longValue());
}
}
return result;
}
/**
* Get Byte List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getByteList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Byte) {
result.add((Byte) object);
} else if (object instanceof String) {
try {
result.add(Byte.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((byte) ((Character) object).charValue());
} else if (object instanceof Number) {
result.add(((Number) object).byteValue());
}
}
return result;
}
/**
* Get Character List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getCharacterList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Character) {
result.add((Character) object);
} else if (object instanceof String) {
String str = (String) object;
if (str.length() == 1) {
result.add(str.charAt(0));
}
} else if (object instanceof Number) {
result.add((char) ((Number) object).intValue());
}
}
return result;
}
/**
* Get Short List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getShortList(String key) {
List> list = getList(key);
if (list == null) {
return new ArrayList<>(0);
}
List result = new ArrayList<>();
for (Object object : list) {
if (object instanceof Short) {
result.add((Short) object);
} else if (object instanceof String) {
try {
result.add(Short.valueOf((String) object));
} catch (Exception ex) {
//ignore
}
} else if (object instanceof Character) {
result.add((short) ((Character) object).charValue());
} else if (object instanceof Number) {
result.add(((Number) object).shortValue());
}
}
return result;
}
/**
* Get Map List value of config section element
*
* @param key - key (inside) current section
* @return
*/
public List getMapList(String key) {
List list = getList(key);
List result = new ArrayList<>();
if (list == null) {
return result;
}
for (Object object : list) {
if (object instanceof Map) {
result.add((Map) object);
}
}
return result;
}
/**
* Check existence of config section element
*
* @param key
* @param ignoreCase
* @return
*/
public boolean exists(String key, boolean ignoreCase) {
if (ignoreCase) key = key.toLowerCase();
for (String existKey : this.getKeys(true)) {
if (ignoreCase) existKey = existKey.toLowerCase();
if (existKey.equals(key)) return true;
}
return false;
}
/**
* Check existence of config section element
*
* @param key
* @return
*/
public boolean exists(String key) {
return exists(key, false);
}
/**
* Remove config section element
*
* @param key
*/
public void remove(String key) {
if (key == null || key.isEmpty()) return;
if (super.containsKey(key)) super.remove(key);
else if (this.containsKey(".")) {
String[] keys = key.split("\\.", 2);
if (super.get(keys[0]) instanceof ConfigSection) {
ConfigSection section = (ConfigSection) super.get(keys[0]);
section.remove(keys[1]);
}
}
}
/**
* Get all keys
*
* @param child - true = include child keys
* @return
*/
public Set getKeys(boolean child) {
Set keys = new LinkedHashSet<>();
this.forEach((key, value) -> {
keys.add(key);
if (value instanceof ConfigSection) {
if (child)
((ConfigSection) value).getKeys(true).forEach(childKey -> keys.add(key + "." + childKey));
}
});
return keys;
}
/**
* Get all keys
*
* @return
*/
public Set getKeys() {
return this.getKeys(true);
}
}