package com.dhemery.configuring;
import com.dhemery.core.Supplier;
import java.util.*;
/**
* A set of configuration options backed by a {@link Map}.
*/
public class MapBackedConfiguration implements Configuration {
private final Map<String, String> options = new HashMap<String, String>();
/**
* Create a configuration with no options defined.
*/
public MapBackedConfiguration() {
}
/**
* Create a configuration by copying options from another configuration.
*/
public MapBackedConfiguration(Configuration other) {
this(other.asMap());
}
/**
* Create a configuration by copying options from a map.
*/
public MapBackedConfiguration(Map<String, String> map) {
merge(map, options);
}
/**
* Create a configuration by copying options from a property list.
*/
public MapBackedConfiguration(Properties properties) {
merge(properties, options);
}
@Override
public Map<String, String> asMap() {
return new HashMap<String,String>(options);
}
@Override
public Properties asProperties() {
Properties properties = new Properties();
for(String name : options.keySet()) properties.setProperty(name, option(name));
return properties;
}
@Override
public void define(String name, String value) {
options.put(name, value);
}
@Override
public Boolean defines(String name) {
return options.containsKey(name);
}
@Override
public void merge(Configuration other) {
merge(other.asMap());
}
@Override
public void merge(Map<String, String> map) {
merge(map, options);
}
@Override
public void merge(Properties properties) {
merge(properties, options);
}
@Override
public Set<String> names() {
return new HashSet<String>(options.keySet());
}
@Override
public String option(String name) {
return options.get(name);
}
@Override
public String option(String name, String defaultValue) {
return defines(name) ? option(name) : defaultValue;
}
@Override
public String option(String name, Supplier<String> supplier) {
return defines(name) ? option(name) : supplier.get();
}
@Override
public String requiredOption(String name) {
if(defines(name)) return option(name);
throw new ConfigurationException("The configuration does not define the required option " + name);
}
private static void merge(Map<String, String> map, Map<String, String> options) {
options.putAll(map);
}
private static void merge(Properties properties, Map<String, String> options) {
for(String propertyName : properties.stringPropertyNames()) {
options.put(propertyName, properties.getProperty(propertyName));
}
}
}