package me.asofold.bpl.simplyvanish.config.compatlayer; import java.io.File; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.ConfigurationOptions; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.MemoryConfiguration; public abstract class AbstractNewConfig extends AbstractConfig { File file = null; MemoryConfiguration config = null; public AbstractNewConfig(File file){ setFile(file); } public void setFile(File file) { this.file = file; this.config = new MemoryConfiguration(); setOptions(config); } @Override public boolean hasEntry(String path) { return config.contains(path) || (config.get(path) != null); } @Override public String getString(String path, String defaultValue) { if (!hasEntry(path)) return defaultValue; return config.getString(path, defaultValue); } @Override public List<String> getStringKeys(String path) { // TODO policy: only strings or all keys as strings ? List<String> out = new LinkedList<String>(); List<Object> keys = getKeys(path); if ( keys == null ) return out; for ( Object obj : keys){ if ( obj instanceof String ) out.add((String) obj); else{ try{ out.add(obj.toString()); } catch ( Throwable t){ // ignore. } } } return out; } @Override public List<Object> getKeys(String path) { List<Object> out = new LinkedList<Object>(); Set<String> keys; if ( path == null) keys = config.getKeys(false); else{ ConfigurationSection sec = config.getConfigurationSection(path); if (sec == null) return out; keys = sec.getKeys(false); } if ( keys == null) return out; out.addAll(keys); return out; } @Override public List<Object> getKeys() { return getKeys(null); } @Override public Object getProperty(String path, Object defaultValue) { Object obj = config.get(path); if ( obj == null ) return defaultValue; else return obj; } @Override public List<String> getStringKeys() { return getStringKeys(null); } @Override public void setProperty(String path, Object obj) { config.set(path, obj); } @Override public List<String> getStringList(String path, List<String> defaultValue) { if ( !hasEntry(path)) return defaultValue; List<String> out = new LinkedList<String>(); List<String> entries = config.getStringList(path); if ( entries == null ) return defaultValue; for ( String entry : entries){ if ( entry instanceof String) out.add(entry); else{ try{ out.add(entry.toString()); } catch (Throwable t){ // ignore } } } return out; } @Override public void removeProperty(String path) { if (path.startsWith(".")) path = path.substring(1); // VERY EXPENSIVE MemoryConfiguration temp = new MemoryConfiguration(); setOptions(temp); Map<String, Object> values = config.getValues(true); if (values.containsKey(path)) values.remove(path); else{ final String altPath = "."+path; if (values.containsKey(altPath)) values.remove(altPath); } for ( String _p : values.keySet()){ Object v = values.get(_p); if (v == null) continue; else if (v instanceof ConfigurationSection) continue; String p; if (_p.startsWith(".")) p = _p.substring(1); else p = _p; if (p.startsWith(path)) continue; temp.set(p, v); } config = temp; } @Override public Boolean getBoolean(String path, Boolean defaultValue) { if (!config.contains(path)) return defaultValue; String val = config.getString(path, null); if (val != null){ if (val.equalsIgnoreCase("true")) return true; else if (val.equalsIgnoreCase("false")) return false; else return defaultValue; } Boolean res = defaultValue; if ( val == null ){ if ( defaultValue == null) defaultValue = false; res = config.getBoolean(path, defaultValue); } return res; } @Override public Double getDouble(String path, Double defaultValue) { if (!config.contains(path)) return defaultValue; Double res = super.getDouble(path, null); if ( res == null ) res = config.getDouble(path, ConfigUtil.canaryDouble); if ( res == ConfigUtil.canaryDouble) return defaultValue; return res; } @Override public Long getLong(String path, Long defaultValue) { if (!config.contains(path)) return defaultValue; Long res = super.getLong(path, null); if ( res == null ) res = config.getLong(path, ConfigUtil.canaryLong); if ( res == ConfigUtil.canaryLong) return defaultValue; return res; } @Override public Integer getInt(String path, Integer defaultValue) { if (!config.contains(path)) return defaultValue; Integer res = super.getInt(path, null); if ( res == null ) res = config.getInt(path, ConfigUtil.canaryInt); if ( res == ConfigUtil.canaryInt) return defaultValue; return res; } @Override public List<Integer> getIntList(String path, List<Integer> defaultValue) { // TODO Auto-generated method stub return super.getIntList(path, defaultValue); } @Override public List<Double> getDoubleList(String path, List<Double> defaultValue) { // TODO Auto-generated method stub return super.getDoubleList(path, defaultValue); } void addAll(Configuration source, Configuration target){ Map<String, Object> all = source.getValues(true); for ( String path: all.keySet()){ target.set(path, source.get(path)); } } void setOptions(Configuration cfg){ ConfigurationOptions opt = cfg.options(); opt.pathSeparator(this.sep); //opt.copyDefaults(true); } @Override public boolean setPathSeparatorChar(char sep) { this.sep = sep; setOptions(config); return true; } }