$Id$

                        Commons Configuration Package
                             Version 2.0-alpha2
                                Release Notes


INTRODUCTION
============

This document contains the release notes for this version of the Commons
Configuration component. It describes the changes since the previous version.
The Commons Configuration software library provides a generic configuration
interface which enables an application to read configuration data from a variety
of sources.

After version 2.0-alpha1 has been out for a while (the corresponding release
notes can be found below), this second alpha release contains a few number of
improvements and new features whose implementation required some changes on
existing interfaces. In most cases, new methods were added offering enhanced
functionality. Because these are typically interfaces implemented by the
library itself client code using the previous alpha version should hardly be
affected.

Below is a list of all changes in this version:

New features:
=============
o CONFIGURATION-574:  DefaultExpressionEngine can now be customized to match
                      configuration keys in a case-insensitive manner. This is useful
                      for instance for dealing with Windows INI files.
o CONFIGURATION-565:  Added support for querying encoded properties.
o CONFIGURATION-200:  A size() method was added to the ImmutableConfiguration interface.

Fixed Bugs:
===========
o CONFIGURATION-564:  PropertiesConfiguration now supports again properties without a
                      value and a separator character. The keys of such properties
                      are added to the configuration with an empty String as value.
o CONFIGURATION-427:  XMLPropertyListConfiguration can now save arrays in the correct form.

Historical list of changes: http://commons.apache.org/proper/commons-configuration/changes-report.html

For complete information on Apache Commons Configuration, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Configuration website:

http://commons.apache.org/proper/commons-configuration/

                        Commons Configuration Package
                             Version 2.0-alpha1
                                Release Notes

This is the first alpha release for version 2.0 of Commons Configuration.
Version 2 is a major redesign of the Configuration API. It breaks compatibility
in many areas and, therefore, is not a drop-in replacement for Commons
Configuration 1.x. To allow collaboration with an older version of the library
(and to prevent jar and dependency hell), the top-level package and the Maven
coordinates have been changed. There is an upgrade guide available at

http://commons.apache.org/configuration/userguide/upgradeto2_0.html

describing the most important breaking changes. Be sure to read this
document if you want to switch from a 1.x version to this new version. The
user's guide which can be found at

http://commons.apache.org/configuration/userguide/user_guide.html

has been reworked to cover all the new and changed features.

The main purpose of this alpha release is to gather feedback from the
community about the reworked API. IT IS NOT YET PRODUCTION READY. It is
expected that there will still be some changes on the public API.

Below is a list of all changes in this version:

New features:
=============
o CONFIGURATION-579:  A migration guide has been created which supports when upgrading from
                      version 1.x to 2.0.
o CONFIGURATION-559:  It is now possible to define default values for initialization
                      properties of configurations.
o CONFIGURATION-551:  The data type conversion mechanism has been made extensible. There is a
                      new interface ConversionHandler which controls the data type conversions
                      available for a configuration object. By setting a custom implementation,
                      conversions can be adapted or extended.
o CONFIGURATION-550:  Conversion to Character is now supported.
o CONFIGURATION-541:  Multi-file configurations are no longer restricted to XML configuration
                      files. Arbitrary file-based configurations are now supported.
o CONFIGURATION-535:  DatabaseConfiguration now provides get methods for querying its
                      properties defining the underlying database structures.
o CONFIGURATION-533:  DatabaseConfiguration now automatically converts CLOBs to strings if
                      they appear in property values.
o CONFIGURATION-525:  PropertiesConfiguration now keeps a comment at the bottom of a
                      properties file. A new footer property was added for reading and
                      writing this footer comment.
o CONFIGURATION-519:  Configuration objects are now created via configuration builders. A new
                      API for configuration builders has been added.
o CONFIGURATION-517:  Hierarchical configurations now provide methods to obtain sub
                      configurations for all child elements of a given key.
o CONFIGURATION-514:  Bean declarations now support constructor invocations.
o CONFIGURATION-512:  It is now possible to obtain an immutable view on a Configuration or
                      HierarchicalConfiguration object. New interfaces,
                      ImmutableConfiguration, and ImmutableHierarchicalConfiguration have
                      been introduced.
o CONFIGURATION-508:  Generic get() methods have been added to the Configuration interface.
                      These methods expect a target class and try to convert the value of
                      the specified property to this target class.
o CONFIGURATION-204:  With the new reloading mechanism automatic and periodic reloading checks
                      can be performed.
o CONFIGURATION-202:  Reloading checks can now be performed in a background thread.

Fixed Bugs:
===========
o CONFIGURATION-582:  Fixed a StringIndexOutOfBoundsException in PropertiesConfigurationLayout
                      which was caused by lines containing only whitespace.
o CONFIGURATION-572:  When a CombinedConfiguration is cleared it removes itself as change
                      listener from all child configurations. This fixes a possible memory
                      leak.
o CONFIGURATION-570:  Fixed a possible ConcurrentModificationException when a SystemConfiguration
                      instance is passed to the append() or copy() methods.
o CONFIGURATION-567:  XMLBeanDeclaration now escapes node names before they are used to
                      determine nested properties. Thanks to Shen liang.

Changes:
o CONFIGURATION-591:  Removed methods from ConfigurationConverter related to ExtendedProperties.
                      This class is no longer supported by recent versions of Commons
                      Collections.
o CONFIGURATION-590:  Removed Serializable interface from all configuration implementations.
                      Some configuration classes declared this interface without being
                      actually serializable.
o CONFIGURATION-588:  The name of the top-level package and the maven coordinates have been
                      changed to allow a coexistence of Commons Configuration 1.x with 2.0.
o CONFIGURATION-584:  The event mechanism has been reworked. There is now a generic event
                      listener interface which can be used to receive notifications from
                      multiple types of event sources.
o CONFIGURATION-578:  The user's guide has been fully reworked to cover all new and enhanced
                      features of version 2.0.
o CONFIGURATION-577:  The dependency to Commons Collections is no longer needed.
o CONFIGURATION-576:  A new abstract base class for hierarchical configurations was introduced
                      which supports arbitrary hierarchical data structures. The type of the
                      nodes used by the configuration can now be specified as a generic type
                      argument. This makes the integration of other hierarchical structures
                      easier.
o CONFIGURATION-575:  Hierarchical configurations now operate on immutable structures.
                      Data is no longer represented by ConfigurationNode objects. The
                      ImmutableNode class now serves as data container.
o CONFIGURATION-573:  XPathExpressionEngine can now deal with namespace prefixes in node and
                      attribute names.
o CONFIGURATION-563:  The DefaultExpressionEngine class is now immutable. An instance can be
                      shared between multiple configuration objects.
o CONFIGURATION-562:  Improved the API of ExprLookup.
o CONFIGURATION-555:  Fixed a bug in the handling of the xml:space attribute in
                      XMLConfiguration. The attribute is now also applied to the current
                      element, not only to sub elements.
o CONFIGURATION-554:  BeanHelper is no longer a static utility class. Instances can be
                      created with a specific configuration of bean factories. There is still
                      a default instance which can be obtained via the BeanHelper.INSTANCE
                      field.
o CONFIGURATION-553:  The code for accessing configuration files has been reworked. Methods
                      related to locating configuration files have been moved from
                      ConfigurationUtils to a new FileLocatorUtils class. Customizable
                      strategy classes (implementing the new FileLocationStrategy) can be
                      used for searching for configuration files.
o CONFIGURATION-546:  BeanHelper can now process BeanDefinitions initializing properties of
                      collection types of their target beans. Thanks to Justin Couch.
o CONFIGURATION-544:  Added missing dependencies to build.xml. Thanks to Oliver Kopp.
o CONFIGURATION-542:  The mechanism for synchronizing configurations has been completely
                      redesigned. It is now based on Synchronizer objects which can be
                      configured by client code. A new chapter was added to the user's guide
                      regarding thread-safety of configurations.
o CONFIGURATION-540:  MapConfiguration now directly uses a Properties object passed to its
                      constructor as data store rather than copying it. This allows
                      SystemConfiguration to be connected to system properties; i.e.
                      changing a property through SystemConfiguration immediately affects
                      the corresponding system property.
o CONFIGURATION-539:  The deprecated INIConfiguration class was removed.
                      HierarchicalINIConfiguration was renamed to INIConfiguration.
o CONFIGURATION-537:  The deprecated ConfigurationFactory class was removed.
o CONFIGURATION-536:  File-based configurations are now implemented in a different way.
                      The interfaces FileConfiguration and ReloadingStrategy have been
                      removed, also the base classes AbstractFileConfiguration and
                      AbstractHierarchicalFileConfiguration. They are replaced by the
                      FileBased interface and the FileHandler class which implements
                      central I/O functionality. Reloading is now in the responsibility of
                      configuration builders.
o CONFIGURATION-534:  The includesAllowed property of PropertyConfiguration is now independent
                      from the existence of a base path.
o CONFIGURATION-530:  Concurrent access to configurations and reloading have been completely
                      redesigned. Because reloading is now handled by configuration builders
                      there is no need to acquire a lock in order to protected against a
                      reload operations.
o CONFIGURATION-527:  AbstractConfiguration.clearPropertyDirect() is now abstract. Thanks to Matthias Richter.
o CONFIGURATION-526:  XMLPropertiesConfiguration now supports loading from and saving to DOM
                      nodes. Thanks to Oliver Kopp.
o CONFIGURATION-524:  Interpolation now works correctly after a configuration was cloned.
                      The ConfigurationInterpolator instance is now cloned, too.
o CONFIGURATION-521:  ConfigurationUtils.fileFromUrl() now correctly handles URL containing
                      encoded percent characters. Thanks to Oliver Kopp.
o CONFIGURATION-520:  Support for reloading of configuration data has been reworked.
o CONFIGURATION-518:  Classes and interfaces related to interpolation have been slightly
                      reworked. ConfigurationInterpolator is now thread-safe. There are
                      multiple ways to define the ConfigurationInterpolator object to be
                      used by an AbstractConfiguration instance.
o CONFIGURATION-516:  PropertiesConfiguration no longer escapes double quotes on saving.
o CONFIGURATION-515:  The visibility of some internal methods of PropertiesConfiguration.PropertiesWriter
                      has been increased to protected. This simplifies the implementation of
                      a custom escaping strategy.
o CONFIGURATION-513:  HierarchicalConfiguration is now an interface. The base implementation
                      class is named BaseHierarchicalConfiguration.
o CONFIGURATION-506:  Removed obsolete nested classes Node and NodeVisitor of
                      HierarchicalConfiguration. The related deprecated class
                      ConfigurationKey was removed, too.
o CONFIGURATION-505:  XMLConfiguration no longer supports attributes with multiple values or
                      list delimiter parsing in attributes. This feature was complex and
                      error prone and brought little value to the user.
o CONFIGURATION-504:  SubnodeConfiguration now provides a new method for clearing it and
                      removing its root node from the parent configuration. The method
                      HierarchicalConfiguration.configurationsAt() now returns a list
                      of SubnodeConfiguration so that it is easier to make direct use of
                      this feature.
o CONFIGURATION-500:  XMLConfiguration now adds attributes of elements defining a list to
                      all list nodes.
o CONFIGURATION-496:  Concurrent access to configurations and reloading have been completely
                      redesigned. This should reduce the amount of synchronization.
o CONFIGURATION-486:  Removed some static fields for specifying global default values.
                      Using static fields in this way is thread-hostile. There are now
                      alternatives for setting default values.
o CONFIGURATION-462:  Updated dependency to Commons Lang from version 2.6 to 3.1.
o CONFIGURATION-419:  EventSource is now an interface. With BaseEventSource there is a
                      default implementation.
o CONFIGURATION-418:  The handling of list delimiters and their escape characters has been
                      reworked. A new ListDelimiterHandler interface was introduced allowing
                      applications to customize the treatment of list delimiters.
o CONFIGURATION-330:  Concurrent access to configurations has been reworked.
o CONFIGURATION-153:  It is now possible to define the strategy used for locating
                      configuration files.
o CONFIGURATION-136:  Reloading can no longer corrupt a configuration instance. This is now
                      handled by a configuration builder; the original configuration instance
                      is not modified.
o CONFIGURATION-26:   It is now possible to influence the conversion from a container object
                      (a collection or an array) to a single value (e.g. what is returned by
                      getString() if the current property has multiple values). Per default,
                      the first value is returned. By overriding methods of the
                      configuration's ConversionHandler, this behavior can be changed.


Historical list of changes: http://commons.apache.org/proper/commons-configuration/changes-report.html

For complete information on Apache Commons Configuration, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Configuration website:

http://commons.apache.org/proper/commons-configuration/