All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.nukkit.utils.ConfigSection Maven / Gradle / Ivy

There is a newer version: 1.20.40-r1
Show newest version
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); } }