package org.openstack.atlas.osgi.cfg.commons; import org.openstack.atlas.cfg.ConfigurationAccessException; import org.openstack.atlas.cfg.ConfigurationInitializationException; import org.openstack.atlas.cfg.ConfigurationKey; import org.openstack.atlas.cfg.ConfigurationNotFoundException; import org.openstack.atlas.cfg.Configuration; import java.io.File; import java.util.Iterator; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; public class ApacheCommonsConfiguration implements Configuration { private final File configurationFile; private long configurationFileLastModifiedTimestamp; private PropertiesConfiguration configuration; public ApacheCommonsConfiguration(String fileResourceLocation) { configurationFile = new File(fileResourceLocation); configurationFileLastModifiedTimestamp = 0L; configuration = null; } private boolean fileIsDifferentAndExists() { return configurationFile.length() != 0 && configurationFileLastModifiedTimestamp != configurationFile.length(); } //TODO: Behavior for non-existent configurations should be passive? private synchronized void checkState() throws ConfigurationInitializationException { if (configuration == null || fileIsDifferentAndExists()) { try { if (!configurationFile.exists()) { throw new ConfigurationNotFoundException("Unable to locate file: " + configurationFile.getPath()); } else if (!configurationFile.canRead()) { throw new ConfigurationAccessException("Insufficient permissions to read file: " + configurationFile.getPath()); } } catch (ConfigurationInitializationException cie) { //Got to love piggy back logic that breaks programatic flow configuration = new PropertiesConfiguration(); throw cie; } finally { configurationFileLastModifiedTimestamp = configurationFile.lastModified(); } try { configuration = new PropertiesConfiguration(configurationFile); } catch (ConfigurationException ce) { throw new ConfigurationInitializationException(ce.getMessage(), ce.getCause()); } } } @Override public String getString(ConfigurationKey key) throws ConfigurationInitializationException { checkState(); return configuration.getString(key.name()); } @Override public boolean hasKeys(ConfigurationKey... keys) throws ConfigurationInitializationException { checkState(); boolean okay = true; for (ConfigurationKey key : keys) { okay = configuration.containsKey(key.name()); if (!okay) { break; } } return okay; } @Override public Iterator getKeys() { checkState(); return configuration.getKeys(); } @Override public String getString(String key) throws ConfigurationInitializationException { checkState(); return configuration.getString(key); } }