AbstractConfiguration.java

  1. /*
  2.  * @copyright defined in LICENSE.txt
  3.  */

  4. package hera.util.conf;

  5. import static hera.util.ValidationUtils.assertFalse;
  6. import static java.util.Collections.EMPTY_LIST;
  7. import static org.slf4j.LoggerFactory.getLogger;

  8. import hera.util.Configuration;
  9. import hera.util.ParsingUtils;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import lombok.Getter;
  13. import org.slf4j.Logger;

  14. public abstract class AbstractConfiguration implements Configuration {

  15.   protected final transient Logger logger = getLogger(getClass());

  16.   @Getter
  17.   protected final boolean readOnly;

  18.   public AbstractConfiguration() {
  19.     this(true);
  20.   }

  21.   public AbstractConfiguration(final boolean readOnly) {
  22.     this.readOnly = readOnly;
  23.   }

  24.   protected String[] getFragments(final String qualifiedName) {
  25.     final String[] splits = qualifiedName.split("\\.");
  26.     for (final String split : splits) {
  27.       if (split.isEmpty()) {
  28.         assertFalse(true, "Value must not empty");
  29.       }
  30.     }
  31.     return splits;
  32.   }

  33.   public Configuration getSubconfiguration(String key) {
  34.     return null;
  35.   }

  36.   protected abstract Object getValue(String key);

  37.   /**
  38.    * get configuration value.
  39.    */
  40.   public Object get(final String key) {
  41.     int dotIndex = key.indexOf('.');
  42.     if (dotIndex < 0) {
  43.       return getValue(key);
  44.     } else {
  45.       final String subconfigurationName = key.substring(0, dotIndex);
  46.       final String remainder = key.substring(dotIndex + 1);
  47.       final Configuration subConfiguration = getSubconfiguration(subconfigurationName);
  48.       if (null != subConfiguration) {
  49.         return subConfiguration.get(remainder);
  50.       }
  51.       return null;
  52.     }
  53.   }

  54.   @Override
  55.   public String getAsString(final String key, final String defaultValue) {
  56.     Object value = get(key);
  57.     if (null == value) {
  58.       return defaultValue;
  59.     }
  60.     logger.trace("Value type: {}", value.getClass());
  61.     if (value instanceof String) {
  62.       return (String) value;
  63.     } else if (value instanceof CharSequence) {
  64.       return value.toString();
  65.     } else {
  66.       return value.toString();
  67.     }
  68.   }

  69.   @Override
  70.   public boolean getAsBoolean(final String key, final boolean defaultValue) {
  71.     final String value = getAsString(key, null);
  72.     return null != value ? ParsingUtils.convertToBoolean(value) : defaultValue;
  73.   }

  74.   @Override
  75.   public int getAsInt(final String key, final int defaultValue) {
  76.     final String value = getAsString(key, null);
  77.     return null != value ? ParsingUtils.convertToInt(value) : defaultValue;
  78.   }

  79.   @Override
  80.   public long getAsLong(final String key, final long defaultValue) {
  81.     final String value = getAsString(key, null);
  82.     return null != value ? ParsingUtils.convertToLong(value) : defaultValue;
  83.   }

  84.   @Override
  85.   public double getAsDouble(final String key, final double defaultValue) {
  86.     final String value = getAsString(key, null);
  87.     return null != value ? ParsingUtils.convertToDouble(value) : defaultValue;
  88.   }

  89.   @Override
  90.   public List<String> getAsList(final String key) {
  91.     return parse(getAsString(key, null));
  92.   }

  93.   @SuppressWarnings("unchecked")
  94.   protected List<String> parse(final String value) {
  95.     if (null == value) {
  96.       return EMPTY_LIST;
  97.     }
  98.     final List<String> list = new ArrayList<String>();
  99.     final String[] splits = value.split("[,|\\r|\\n]");
  100.     for (final String split : splits) {
  101.       final String target = split.trim();
  102.       if (null != target && !target.isEmpty()) {
  103.         list.add(target);
  104.       }
  105.     }
  106.     return list;
  107.   }

  108.   protected void checkReadOnly() {
  109.     if (isReadOnly()) {
  110.       throw new UnsupportedOperationException("Configuration is read-only");
  111.     }
  112.   }

  113. }