There are many use cases when you want to collect the properties
of several configuration sources and access them like a single
configuration object. One way to do that is using the
CompositeConfiguration
class.
A CompositeConfiguration
object contains a list of
other configuration objects. When properties are accessed from a
composite configuration the object takes the passed in property key
and iterates over the list of the contained configurations. As soon
as a value is found for the key it is returned. This means that a
CompositeConfiguration
implements a kind of override
semantics, i.e. the properties of configurations that were added
first hide the property values of configurations added later.
We will discuss how you can establish a "default" choice for your Composite Configuration as well as save changes made to your Composite Configuration.
Defaults are very simple. You can just add them as your last configuration object, either through the ConfigurationFactory or manually:
Configuration defaults = new PropertiesConfiguration(fileToDefaults); Configuration otherProperties = new PropertiesConfiguration(fileToOtherProperties); CompositeConfiguration cc = new CompositeConfiguration(); cc.addConfiguration(otherProperties); cc.addDefaults(fileToDefaults);
If you have a non static Configuration where you want to save changes made to a configuration, and you are using a CompositeConfiguration, then you will need to pass into the constructor of the CompositeConfiguration what Configuration to save the changes via.
PropertiesConfiguration saveConfiguration = new PropertiesConfiguration(fileToSaveChangesIn); Configuration cc = new CompositeConfiguration(saveConfiguration); cc.setProperty("newProperty","new value"); saveConfiguration.save();
Alternatively, you can just request the inMemoryConfiguration that stores the changes:
Configuration changes = myCompositeConfiguration.getInMemoryConfiguration(); DatabaseConfiguration config = new DatabaseConfiguration(datasource, "configuration", "key", "value"); for (Iterator i = changes.getKeys().iterator();i.hasNext()){ String key = (key)i.next(); Object value = changes.get(key); config.setProperty(key,value); }