/**
* Provides classes to deal with software configuration.
* <h3>Configuration variables</h3>
* <p>
* Configuration data is stored as a set of variables organised in sections. A typical variable
* name is: <code>section.subsection.name</code> where:
* <ul>
* <li><code>section</code> and <code>subsection</code> are both sections.</li>
* <li><code>name</code> is the variable's name.</li>
* </ul>
* </p>
* <p>
* Configuration data is stored in instances of {@link com.mucommander.commons.conf.Configuration}, which offers a set
* of methods manipulate variables:
* <ul>
* <li>
* {@link com.mucommander.commons.conf.Configuration#getVariable(String) Basic retrieval}, which returns a
* variable's value if known.
* </li>
* <li>
* {@link com.mucommander.commons.conf.Configuration#getVariable(String,String) Advanced retrieval}, which returns
* a variable's value and set it to a default value if not known.
* </li>
* <li>
* Existence {@link com.mucommander.commons.conf.Configuration#isVariableSet(String) checking}, which checks
* whether a variable exists or not.
* </li>
* <li>
* {@link com.mucommander.commons.conf.Configuration#renameVariable(String,String) Renaming}, which changes a
* variable's name as well as the section it belongs to.
* </li>
* <li>
* {@link com.mucommander.commons.conf.Configuration#removeVariable(String) Removal}, which deletes a variable from
* the configuration.
* </li>
* <li>
* {@link com.mucommander.commons.conf.Configuration#setVariable(String,String) Setting}, which sets a variable's
* value.
* </li>
* </ul>
* </p>
* <h3>Loading and storing configuration</h3>
* <p>
* The <code>com.mucommander.commons.conf</code> package offers various ways of loading and storing configuration.<br>
* The most obvious way is by using the {@link com.mucommander.commons.conf.Configuration#read(InputStream) read} and
* {@link com.mucommander.commons.conf.Configuration#write(OutputStream) write} methods, but this has the disadvantage
* of forcing application writers to manage streams themselves.<br>
* The preferred method is to create a dedicated {@link com.mucommander.commons.conf.ConfigurationSource} class and
* register it through {@link com.mucommander.commons.conf.Configuration#setSource(ConfigurationSource) setSource}.
* This allows an instance of {@link com.mucommander.commons.conf.Configuration} to know how to read from and write to
* its configuration file (or socket or any other medium that provides input and output streams).
* </p>
* <h3>Changing the default configuration format</h3>
* <p>
* The default configuration format is described in {@link com.mucommander.commons.conf.XmlConfigurationReader}.
* Application writers who wish to change this can do so by:
* <ul>
* <li>
* Creating custom {@link com.mucommander.commons.conf.ConfigurationBuilder writers} and
* {@link com.mucommander.commons.conf.ConfigurationReader readers}.
* </li>
* <li>
* Creating associated {@link com.mucommander.commons.conf.ConfigurationWriterFactory writer factories} and
* {@link com.mucommander.commons.conf.ConfigurationReaderFactory reader factories}.
* </li>
* <li>
* Registering them through
* {@link com.mucommander.commons.conf.Configuration#setWriterFactory(ConfigurationWriterFactory) setWriterFactory}
* and
* {@link com.mucommander.commons.conf.Configuration#setReaderFactory(ConfigurationReaderFactory) setReaderFactory}.
* </li>
* </ul>
* </p>
* <h3>Listening to the configuration</h3>
* <p>
* Classes that need to be notified when the configuration has changed can do so by:
* <ul>
* <li>Implementing the {@link com.mucommander.commons.conf.ConfigurationListener} interface.</li>
* <li>
* Registering themselves through
* {@link com.mucommander.commons.conf.Configuration#addConfigurationListener(ConfigurationListener)
* addConfigurationLister}.
* </li>
* </ul>
* </p>
*/
package com.mucommander.commons.conf;