package com.zillabyte.motherbrain.universe; import java.io.Serializable; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang.StringUtils; import org.eclipse.jdt.annotation.NonNullByDefault; @NonNullByDefault public class Config implements Serializable { private static final long serialVersionUID = 2815004833459597124L; private final ConcurrentHashMap<String, Object> _props; // Note: no properties can be null public Config() { this(new Properties()); } public Config(Properties properties) { _props = new ConcurrentHashMap<>(); for(Entry<Object, Object> e : properties.entrySet()) { _props.put(e.getKey().toString(), e.getValue()); } } public Config(Map<String, Object> properties) { _props = new ConcurrentHashMap<>(properties); } protected final <T extends Object> void setInternal(String key, T val) { _props.put(key, val); } public final boolean contains(String key) { return _props.containsKey(key); } public final <T extends Object> T get(String key, T defaultValue) { @SuppressWarnings("unchecked") final T value = (T) _props.get(key); return value == null ? defaultValue : value; } public final <T extends Object> T getOrException(String key) { if (_props.containsKey(key)) { @SuppressWarnings("unchecked") final T value = (T) _props.get(key); /* * Indeed should be impossible, as we don't allow nulls in */ assert (value != null); return value; } throw new ExpectedConfigNotPresent(); } /**** * Syntatic sugar to take up less screen real estate */ public static <T extends Object> T getOrDefault(String k, T v) { final Config c = Universe.instance().config(); return c.get(k, v); } /*** * * @param k * @param v * @return */ public static <T> void setDefault(String k, T v) { final Config c = Universe.instance().config(); c.put(k, v); } /*** * */ public static void reset() { Universe.instance().config()._props.clear(); } public final synchronized <T extends Object> void put(String key, T val) { this._props.put(key, val); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); for(Entry<String, Object> e : this._props.entrySet()) { sb.append("$$ "); sb.append( StringUtils.rightPad(e.getKey(), 40)); sb.append(" : "); sb.append(e.getValue()); sb.append("\n"); } sb.append("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); final String string = sb.toString(); assert (string != null); return string; } public void debug() { System.err.println(this.toString()); } }