blob: d4b7fcad167e8b3a4046dfe0b7e45fb983b42ca9 [file] [log] [blame]
<?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>Configuration Overview</title>
<author email="epugh@upstate.com">Eric Pugh</author>
<author email="smanux@lfjr.net">Emmanuel Bourg</author>
</properties>
<body>
<section name="Using Configuration">
<p>
One of the strength of Commons Configuration is its ability to mix configurations
from heterogeneous sources, this section will introduce you to the different configurations
available and will show you how to combine them.
</p>
<subsection name="Configuration Sources">
<p>
Currently there are quite a number of different sources of Configuration objects. But,
by just using a Configuration object versus a specific type like XMLConfiguration or
JNDIConfiguration, you are sheltered from the mechanics of actually retrieving the
configuration values. These various sources include:
<ul>
<li>
<strong>PropertiesConfiguration</strong>
Loads configuration values from a properties file.
</li>
<li>
<strong>BaseConfiguration</strong>
An in-memory method of populating a Configuration object.
</li>
<li>
<strong>XMLConfiguration</strong>
Takes values from an XML document.
</li>
<li>
<strong>JNDIConfiguration</strong>
Using a key in the JNDI tree, can retrieve values as configuration properties.
</li>
<li>
<strong>SystemConfiguration</strong>
A configuration using the system properties
</li>
<li>
<strong>ConfigurationConverter</strong>
Takes a java.util.Properties or an o.a.c.collections.ExtendedProperties
and converts it to a Configuration object.
</li>
</ul>
</p>
</subsection>
<subsection name="Mixing Configuration Sources">
<p>
Often you want to provide a base set of configuration values, but allow the user to easily
override them for their specific environment. Well one way is to hard code the default
values into your code, and have then provide a property file that overrides this. However,
this is a very rigid way of doing things. Instead, with the <code>CompositeConfiguration</code>
you can provide many different ways of setting up a configuration. You can either do it
manually:
</p>
<source>
CompositeConfiguration config = new CompositeConfiguration();
config.addConfiguration(new SystemConfiguration());
config.addConfiguration(new PropertiesConfiguration("application.properties"));
</source>
<p>or via the <code>ConfigurationFactory</code> class:</p>
<source>
ConfigurationFactory factory = new ConfigurationFactory("config.xml");
Configuration config = factory.getConfiguration();
</source>
<p>
The <code>config.xml</code> file used in the example above is a configuration descriptor,
it specifies the Configuration objects to load. Here is an example of descriptor:
</p>
<source><![CDATA[
<?xml version="1.0" encoding="ISO-8859-1" ?>
<configuration>
<system/>
<properties fileName="application.properties"/>
</configuration>
]]></source>
<p>
What this says is that we are loading up all system properties, as well as the properties
file <code>application.properties</code>. The order of precedence is first to last. So in
the above example, if a property is not found in the system properties, it'll be searched
in the properties file. This allows you to set up default values in a properties file, and
override them with the system properties.
</p>
</subsection>
</section>
<section name="Configuration Details">
<p>
Configuration is done by taking the configuration descriptor XML file and parsing the
individual configurations. Make sure to include the various <a href="dependencies.html">dependencies</a>
required for each type of configuration!
</p>
<subsection name="Classic Properties File">
<source><![CDATA[
<properties fileName="conf/test.properties"/>
]]></source>
<p>
This configuration file is very simple. You just need to specify the path to the property file.
</p>
</subsection>
<subsection name="XML Properties File">
<source><![CDATA[
<xml fileName="conf/test.xml"/>
]]></source>
<p>
The configuration is very similar to the classic properties file. However, the xml file
must be in a specific format. Currently there is no DTD.
</p>
<source><![CDATA[
<baseElement>
<element>value</element>
<element2>
<subelement>
<subsubelement>I'm complex!</subsubelement>
</subelement>
</element2>
<test>
<short>8</short>
</test>
</baseElement>
]]></source>
<p>
In the above example, the root element is ignored. So to get the value "8", you would
request from your Configuration object the key "<code>test.short</code>". The root
element can be called anything.
</p>
</subsection>
<subsection name="JNDI Environment Properties">
<source><![CDATA[
<jndi prefix="java:comp/env"/>
]]></source>
<p>
This configuration is very useful for setting environment specific settings like mail
servers! The prefix tells the <code>ConfigurationFactory</code> what the root will be
to look up your configuration settings.
</p>
<source><![CDATA[
<env-entry>
<env-entry-name>smtp</env-entry-name>
<env-entry-value>127.0.0.1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
<env-entry>
<env-entry-name>test/short</env-entry-name>
<env-entry-value>80</env-entry-value>
<env-entry-type>java.lang.Short</env-entry-type>
</env-entry>
]]></source>
<p>
<strong>Note!</strong> If you have a property called "<code>test.short</code>" with spaces
in it, then it will be translated as the key "<code>test/short</code>". Therefore, you
should NOT use spaces in the name of properties that are loaded from JNDI! If you do want
to use them, then make sure to convert in your <code>web.xml</code> the "." characters to
"/" characters, like in the <code>test.short</code> example above.
</p>
</subsection>
</section>
</body>
</document>