blob: fbf73d786cbc13dc579bc2134c2b7bdc1df40708 [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>Properties files</title>
<author email="smanux@lfjr.net">Emmanuel Bourg</author>
<author email="oliver.heger@t-online.de">Oliver Heger</author>
</properties>
<body>
<section name="Properties files">
<p>
Properties files are a popular mean of configuring applications. Of course Commons Configuration
supports this format and enhance significantly the basic <code>java.util.Properties</code> class.
This section introduces the features of the <code>PropertiesConfiguration</code> class.
</p>
<subsection name="Loading">
<p>
At first lets consider that the whole configuration data of an application consists in
a single properties file named <code>usergui.properties</code> with the following content:
</p>
<source><![CDATA[
# Properties definining the GUI
colors.background = #FFFFFF
]]></source>
<p>
To load this file, you'll write:
</p>
<source>
Configuration config = new PropertiesConfiguration("usergui.properties");
</source>
<p>
If you do not specify an absolute path, the file will be searched automatically
in the following locations:
<ul>
<li>in the current directory</li>
<li>in the user home directory</li>
<li>in the classpath</li>
</ul>
</p>
</subsection>
<subsection name="Includes">
<p>
If a property is named "<code>include</code>" and the value of that property is the
name of a file on the disk, that file will be included into the configuration. Here is
an example:
</p>
<source>
# usergui.properties
include = colors.properties
include = sizes.properties
</source>
<source>
# colors.properties
colors.background = #FFFFFF
</source>
</subsection>
<subsection name="Automatic Reloading">
<p>
A common issue with properties file is to handle the reloading of the file when it
changes. Typically you would use a thread monitoring the date of the file and reloading
the <code>Properties</code> when a more recent date is detected. Commons Configuration
integrates this mechanism out of the box, to enable it, just specify a reloading strategy
on your configuration:
</p>
<source>
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setReloadingStrategy(new FileChangedReloadingStrategy());
</source>
<p>
Now everytime you edit manually the <code>usergui.properties</code> file, the
configuration is automatically refreshed and the modified values are immediately
available to your application.
</p>
</subsection>
<subsection name="Saving">
<p>
To save your configuration, just call the <code>save()</code> method:
</p>
<source>
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setProperty("colors.background", "#000000);
config.save();
</source>
<p>
You can also save a copy of the configuration to another file:
</p>
<source>
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setProperty("colors.background", "#000000);
config.save("usergui.backup.properties);
</source>
<p>
And if you don't want to bother saving your configuration everytime it changes,
you can enable the automatic saving mode:
</p>
<source>
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setAutoSave(true);
config.setProperty("colors.background", "#000000); // the configuration is saved after this call
</source>
</subsection>
<subsection name="Lists and arrays">
<p>
Commons Configuration has the ability to return easily a list of values,
for example if your file contains a list of comma separated values:
</p>
<source>
# chart colors
colors.pie = #FF0000, #00FF00, #0000FF
</source>
<p>
You don't have to split the value manually, you can retrieve an array directly with:
</p>
<source>
String[] colors = config.getStringArray("colors.pie");
</source>
<p>
Alternatively, you can specify a list of values in your properties file by using
the same key on several lines:
</p>
<source>
# chart colors
colors.pie = #FF0000;
colors.pie = #00FF00;
colors.pie = #0000FF;
</source>
</subsection>
<subsection name="Variable Interpolation">
<p>
If you are familiar with Ant or Maven, you have most certainly already encountered
the variables (like <code>${token}</code>) that are automatically expanded when the
configuration file is loaded. Commons Configuration supports this feature as well,
here is an example:
</p>
<source>
application.name = Killer App
application.version = 1.6.2
application.title = ${application.name} ${application.version}
</source>
</subsection>
<subsection name="Special Characters">
<p>
If you need a special character in a property like a line feed, a tabulation or
an unicode character, you can specify it with the same escaped notation used for
Java Strings. The list separator ("," by default), can also be escaped:
</p>
<source><![CDATA[
key = This \n string \t contains \, escaped \\ characters \u0020
]]></source>
</subsection>
</section>
</body>
</document>