package com.dhemery.configuring; import com.dhemery.core.Supplier; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.Set; /** * Decorates another configuration to trim whitespace from the values of its options. * The values in the underlying configuration are not changed. * The values are trimmed each time a user reads an option, * and each time the trimming configuration is converted to a map or a properties list. */ public class TrimmingConfiguration implements Configuration { private final Configuration configuration; public TrimmingConfiguration(Configuration untrimmed) { configuration = untrimmed; } @Override public Map<String, String> asMap() { Map<String,String> map = new HashMap<String, String>(); for(String name : names()) map.put(name, option(name)); return map; } @Override public Properties asProperties() { Properties properties = new Properties(); for(String name : names()) properties.setProperty(name, option(name)); return properties; } @Override public void define(String name, String value) { configuration.define(name, value); } @Override public Boolean defines(String name) { return configuration.defines(name); } @Override public void merge(Configuration other) { configuration.merge(other); } @Override public void merge(Map<String, String> map) { configuration.merge(map); } @Override public void merge(Properties properties) { configuration.merge(properties); } @Override public Set<String> names() { return configuration.names(); } @Override public String option(String name) { return safelyTrim(configuration.option(name)); } @Override public String option(String name, String defaultValue) { return safelyTrim(configuration.option(name, defaultValue)); } @Override public String option(String name, Supplier<String> supplier) { return safelyTrim(configuration.option(name, supplier)); } @Override public String requiredOption(String name) { return safelyTrim(configuration.requiredOption(name)); } private static String safelyTrim(String value) { return value == null ? null : value.trim(); } }