package org.rackspace.stingray.client.config;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.rackspace.stingray.client.config.exception.ConfigurationAccessException;
import org.rackspace.stingray.client.config.exception.ConfigurationInitializationException;
import java.io.File;
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()) {
if (configurationFile.canRead()) {
configurationFileLastModifiedTimestamp = configurationFile.lastModified();
} else {
configuration = new PropertiesConfiguration();
throw new ConfigurationAccessException("Insufficient permission to read file: " + configurationFile.getPath());
}
} else {
configuration = new PropertiesConfiguration();
throw new ConfigurationAccessException("Unable to locate file: " + configurationFile.getPath());
}
} catch (ConfigurationInitializationException cie) {
throw cie;
}
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) {
return okay;
}
}
return okay;
}
}