package me.asofold.bpl.simplyvanish.config.compatlayer;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* Some generic checks and stuff using getString, hasEntry, getStringList, ...
* @author mc_dev
*
*/
public abstract class AbstractConfig implements CompatConfig {
protected char sep = '.';
@Override
public Boolean getBoolean(String path, Boolean defaultValue) {
String val = getString(path, null);
if ( val == null ) return defaultValue;
try{
// return Boolean.parseBoolean(val);
String t = val.trim().toLowerCase();
if ( t.equals("true")) return true;
else if ( t.equals("false")) return false;
else return defaultValue;
} catch( NumberFormatException exc){
return defaultValue;
}
}
@Override
public Double getDouble(String path, Double defaultValue) {
String val = getString(path, null);
if ( val == null ) return defaultValue;
try{
return Double.parseDouble(val);
} catch( NumberFormatException exc){
return defaultValue;
}
}
@Override
public Long getLong(String path, Long defaultValue) {
String val = getString(path, null);
if ( val == null ) return defaultValue;
try{
return Long.parseLong(val);
} catch( NumberFormatException exc){
return defaultValue;
}
}
@Override
public Integer getInt(String path, Integer defaultValue) {
String val = getString(path, null);
if ( val == null ) return defaultValue;
try{
return Integer.parseInt(val);
} catch( NumberFormatException exc){
return defaultValue;
}
}
@Override
public List<Integer> getIntList(String path, List<Integer> defaultValue){
if ( !hasEntry(path) ) return defaultValue;
List<String> strings = getStringList(path, null);
if ( strings == null ) return defaultValue;
List<Integer> out = new LinkedList<Integer>();
for ( String s : strings){
try{
out.add(Integer.parseInt(s));
} catch(NumberFormatException exc){
// ignore
}
}
return out;
}
@Override
public List<Double> getDoubleList(String path, List<Double> defaultValue) {
if ( !hasEntry(path) ) return defaultValue;
List<String> strings = getStringList(path, null);
if ( strings == null ) return defaultValue;
List<Double> out = new LinkedList<Double>();
for ( String s : strings){
try{
out.add(Double.parseDouble(s));
} catch(NumberFormatException exc){
// ignore
}
}
return out;
}
@Override
public Set<String> getStringKeys(String path, boolean deep) {
if (deep) return getStringKeysDeep(path);
Set<String> keys = new HashSet<String>();
keys.addAll(getStringKeys(path));
return keys;
}
@Override
public Set<String> getStringKeysDeep(String path) {
// NOTE: pretty inefficient, but aimed at seldomly read sections.
Map<String, Object> values = getValuesDeep();
Set<String> out = new HashSet<String>();
final int len = path.length();
for (String key : values.keySet()){
if (!key.startsWith(path)) continue;
else if (key.length() == len) continue;
else if (key.charAt(len) == sep) out.add(key);
}
return out;
}
@Override
public Object get(String path, Object defaultValue) {
return getProperty(path, defaultValue);
}
@Override
public void set(String path, Object value) {
setProperty(path, value);
}
@Override
public void remove(String path) {
removeProperty(path);
}
@Override
public Boolean getBoolean(String path) {
return getBoolean(path, null);
}
@Override
public Double getDouble(String path) {
return getDouble(path, null);
}
@Override
public List<Double> getDoubleList(String path) {
return getDoubleList(path, null);
}
@Override
public Integer getInt(String path) {
return getInt(path, null);
}
@Override
public List<Integer> getIntList(String path) {
return getIntList(path, null);
}
@Override
public Integer getInteger(String path) {
return getInt(path, null);
}
@Override
public List<Integer> getIntegerList(String path) {
return getIntList(path, null);
}
@Override
public String getString(String path) {
return getString(path, null);
}
@Override
public List<String> getStringList(String path) {
return getStringList(path, null);
}
@Override
public Object get(String path) {
return getProperty(path, null);
}
@Override
public Object getProperty(String path) {
return getProperty(path, null);
}
@Override
public boolean contains(String path) {
return hasEntry(path);
}
@Override
public Integer getInteger(String path, Integer defaultValue) {
return getInt(path, defaultValue);
}
@Override
public List<Integer> getIntegerList(String path, List<Integer> defaultValue) {
return getIntList(path, defaultValue);
}
@Override
public Long getLong(String path) {
return getLong(path, null);
}
@Override
public Set<String> getSetFromStringList(String path) {
return getSetFromStringList(path, null);
}
@Override
public Set<String> getSetFromStringList(String path,
Set<String> defaultValue) {
return getSetFromStringList(path, defaultValue, false, false);
}
@Override
public Set<String> getSetFromStringList(String path,
Set<String> defaultValue, boolean trim, boolean lowerCase) {
List<String> list = getStringList(path);
if (list == null) return defaultValue;
Set<String> set = new HashSet<String>();
if (lowerCase) {
for (String entry : list){
set.add((trim?entry.trim():entry).toLowerCase());
}
} else set.addAll(list);
return set;
}
public <T> void setAsList(String path, Set<T> set){
if (set == null){
// Not sure about this one.
set(path, (List<T>) null);
return;
}
List<T> list = new LinkedList<T>();
list.addAll(set);
set(path, list);
}
public void setAsSection(String path, Map<String, ?> map){
for (Entry<String, ?> entry : map.entrySet()){
set(path + sep + entry.getKey(), entry.getValue());
}
}
}