<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You 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.
-->
<!-- ===================================================================== -->
<!-- $Id$ -->
<!-- ===================================================================== -->
<document>

  <properties>
    <author email="pete@kazmier.com">Pete Kazmier</author>
    <author email="mpoeschl@marmot.at">Martin Poeschl</author>
    <author email="jason@zenplex.com">Jason van Zyl</author>
    <author email="epugh@upstate.com">Eric Pugh</author>
    <author email="tobrien@discursive.com">Tim O'Brien</author>
    <author email="rgoers@apache.org">Ralph Goers</author>
    <title>Java Configuration API</title>
  </properties>

  <body>
    <section name="Intro">
      <p>
      	The Commons Configuration software library provides a generic configuration interface which enables
        a Java application to read configuration data from a variety of sources. Commons Configuration
      	provides typed access to single, and multi-valued configuration parameters as demonstrated
        by the following code:

<source><![CDATA[
Double double = config.getDouble("number");
Integer integer = config.getInteger("number");
]]></source>

      </p>
      <p>
		Configuration parameters may be loaded from the following sources:

        <ul>
          <li>Properties files</li>
          <li>XML documents</li>
          <li>Windows INI files</li>
          <li>Property list files (plist)</li>
          <li>JNDI</li>
          <li>JDBC Datasource</li>
          <li>System properties</li>
          <li>Applet parameters</li>
          <li>Servlet parameters</li>
        </ul>

        Different configuration sources can be mixed using a <code>ConfigurationFactory</code> and
		a <code>CompositeConfiguration</code>. Additional sources of configuration parameters can
        be created by using custom configuration objects. This customization can be achieved by
		extending <code>AbstractConfiguration</code> or <code>AbstractFileConfiguration</code>.
      </p>
	  <p>
		The full Javadoc API documentation is available <a href="apidocs/index.html">here</a>.
	  </p>
    </section>  	
    
    <section name="Latest Release">
      <p>
        The latest release of Apache Commons Configuration is available from the
        <a href="http://commons.apache.org/configuration/download_configuration.cgi">Apache download area</a>. 
        It is also available from the <a href="http://repo1.maven.org/maven2/commons-configuration/commons-configuration/">Maven repository</a>.
        The <a href="changes-report.html">Changes Report</a> explains all of the changes and bug fixes that have been made.
      </p>
    </section>
    
    <section name="History">
      <p>
        Commons Configuration started as code in Apache JServ.  The JServ code was subsequently
        added to <a href="http://jakarta.apache.org/turbine">Jakarta Turbine</a>. After Jakarta
        Turbine, this configuration interface moved to <a href="http://jakarta.apache.org/velocity">Jakarta Velocity</a>
        and underwent various improvements.  After Velocity, this code was introduced to the
        <a href="http://commons.apache.org">Apache Commons</a> as <code>ExtendedProperties</code>.
        Configuration began life in the Commons as a Sandbox component, and was promoted to the
        Commons Proper in late 2003.
      </p>
    </section>

    <section name="Bugs">
      <p>
        Bugs may be reported via the <a href="http://issues.apache.org/jira/browse/CONFIGURATION">ASF JIRA</a>
        system. Detailed information can be found on the <a href="issue-tracking.html">issue tracking page</a>.
      </p>
    </section>

  </body>
</document>
