| <?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> |