/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.common.config; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.Charset; import java.util.Map; import java.util.Properties; /** * Configuration implementation that reads from a Java Properties object. If * save functionality is ever added, we will likely need a ReentrantReadWriteLock * to prevent concurrent reads and writes. */ public class PropertiesFileConfiguration extends AbstractConfiguration implements FileConfiguration { protected Charset encoding; private MapConfiguration backingMap = new MapConfiguration(); public PropertiesFileConfiguration() { } public PropertiesFileConfiguration(String fileName) throws ConfigurationException { this(fileName, Charset.defaultCharset()); } public PropertiesFileConfiguration(String fileName, Charset encoding) throws ConfigurationException { setEncoding(encoding); load(fileName); } public PropertiesFileConfiguration(File file) throws ConfigurationException { this(file, Charset.defaultCharset()); } public PropertiesFileConfiguration(File file, Charset encoding) throws ConfigurationException { setEncoding(encoding); load(file); } public PropertiesFileConfiguration(InputStream inStream) throws ConfigurationException { this(inStream, Charset.defaultCharset()); } public PropertiesFileConfiguration(InputStream inStream, Charset encoding) throws ConfigurationException { setEncoding(encoding); load(inStream); } public PropertiesFileConfiguration(Properties properties) { setEncoding(Charset.defaultCharset()); load(properties); } @Override public Configuration subset(String prefix) { return backingMap.subset(prefix); } @Override public Configuration strippedSubset(String prefix) { return backingMap.strippedSubset(prefix); } @Override public boolean isEmpty() { return backingMap.isEmpty(); } @Override public boolean containsKey(String key) { return backingMap.containsKey(key); } @Override public void setProperty(String key, String value) { backingMap.setProperty(key, value); } @Override public void clear() { backingMap.clear(); } @Override public void clearProperty(String key) { backingMap.clearProperty(key); } @Override public Iterable<String> getKeys() { return backingMap.getKeys(); } @Override public String getProperty(String key) { return backingMap.getProperty(key); } @Override public String getProperty(String key, String defaultValue) { return backingMap.getProperty(key, defaultValue); } @Override public Charset getEncoding() { return encoding; } @Override public void setEncoding(Charset encoding) { this.encoding = encoding; } /** * Merge configuration objects. Any collisions on keys will use the value * from the leftmost argument. * * @param configs * @return the merged configuration */ public static PropertiesFileConfiguration merge(Configuration ... configs) { PropertiesFileConfiguration mergedConfig = new PropertiesFileConfiguration(); for (Configuration c : configs) { for (String key : c.getKeys()) { if (!mergedConfig.containsKey(key)) { mergedConfig.setProperty(key, c.getProperty(key)); } } } return mergedConfig; } @Override public void load(String fileName) throws ConfigurationException { load(new File(fileName)); } @Override public void load(File file) throws ConfigurationException { try { load(new BufferedInputStream(new FileInputStream(file))); } catch (FileNotFoundException e) { throw new ConfigurationException(e); } } @Override public void load(InputStream inStream) throws ConfigurationException { load(new BufferedReader(new InputStreamReader(inStream, getEncoding()))); } @Override public void load(Reader reader) throws ConfigurationException { try { Properties p = new Properties(); p.load(reader); load(p); } catch (IOException e) { throw new ConfigurationException(e); } } /** * Calling this method directly is primarily meant for testing purposes. * @param properties */ public void load(Properties properties) { for (Map.Entry<Object, Object> entry : properties.entrySet()) { backingMap.setProperty((String) entry.getKey(), (String) entry.getValue()); } } @Override public String toString() { return backingMap.toString(); } }