<?xml version="1.0"?>
<!--
   Copyright 2004-2005 The Apache Software Foundation

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<document>

 <properties>
  <title>Composite Configuration Details</title>
  <author email="epugh@opensourceconnections.com">Eric Pugh</author>
 </properties>

<body>

    <section name="Composite Configuration Details">
    	<p>
    		We will discuss how you can establish a "default" choice for your
    		Composite Configuration as well as save changes made to your
    		Composite Configuration.
    	</p>
    	<subsection name="Setting Up Defaults">
    		<p>
    			Defaults are very simple.  You can just add them as your last configuration object, 
    			either through the ConfigurationFactory or manually:
    		</p>
    			<source><![CDATA[
Configuration defaults = new PropertiesConfiguration(fileToDefaults);
Configuration otherProperties = new PropertiesConfiguration(fileToOtherProperties);
CompositeConfiguration cc = new CompositeConfiguration();
cc.addConfiguration(otherProperties);
cc.addDefaults(fileToDefaults);
]]></source>
		</subsection>
		
		<subsection name="Saving Changes">
			<p>
				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.  
			</p>
    			<source><![CDATA[
PropertiesConfiguration saveConfiguration = new PropertiesConfiguration(fileToSaveChangesIn);
Configuration cc = new CompositeConfiguration(saveConfiguration);
cc.setProperty("newProperty","new value");

saveConfiguration.save();
]]></source>
			<p>
				Alternatively, you can just request the
				inMemoryConfiguration that stores the changes:
    			<source><![CDATA[
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);
}
]]></source>
			</p>
		
		</subsection>		
	</section>
</body>

</document>