Apache Commons Configuration
Version 2.9.0
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.

Tools to assist in the reading of configuration/preferences files in
various formats.

Minor release with new features and updated dependencies.

Changes in this version include:

New features:
o CONFIGURATION-799:  Add DefaultConversionHandler#setListDelimiterHandler(ListDelimiterHandler). Thanks to Xinshiyou, Gary Gregory.

Fixed Bugs:
o CONFIGURATION-799:  CombinedConfiguration#getKeys() can throw NoSuchElementException. Thanks to Jarek Sacha, Gary Gregory.
o CONFIGURATION-822:  Fix ambiguity on the section determining #229. Thanks to Branislav Be?o, Gary Gregory, Bruno P. Kinoshita.
o                     Use Java style array decelerations #244. Thanks to Arturo Bernal.
o                     Add ImmutableNode.stream(). Thanks to Gary Gregory.
o                     Avoid NullPointerException in org.apache.commons.configuration2.web.AppletConfiguration.getKeysInternal(). Thanks to Gary Gregory.
o                     Fix JDBC prepared statements leak in org.apache.commons.configuration2.DatabaseConfiguration.clearPropertyDirect(String). Thanks to Gary Gregory.

Changes:
o CONFIGURATION-815:  Bump optional Apache Log4j 1.2.17 with 2.20.0. Thanks to Gary Gregory.
o                     Bump actions/checkout from 3 to 3.1.0 #224. Thanks to Gary Gregory, Dependabot.
o                     Bump actions/setup-java from 3 to 3.5.1. Thanks to Gary Gregory.
o                     Bump spotbugs-maven-plugin from 4.7.0.0 to 4.7.3.0 #193, #195, #228, #237. Thanks to Dependabot, Gary Gregory.
o                     Bump spotbugs from 4.7.0 to 4.7.3. Thanks to Gary Gregory.
o                     Bump org.springframework:spring-* from 5.3.21 to 5.3.26. Thanks to Dependabot, Gary Gregory.
o                     Bump junit-jupiter from 5.8.2 to 5.9.1 #197, #217. Thanks to Dependabot.
o                     Bump mockito-core from 4.6.1 to 4.11.0 #200, #235, #249, #257, #259. Thanks to Dependabot, Gary Gregory.
o                     Bump slf4j.version from 1.7.36 to 2.0.7 #202, #210, #215, #238, #241, #291. Thanks to Dependabot.
o                     Bump maven-checkstyle-plugin from 3.1.2 to 3.2.0 #201. Thanks to Dependabot.
o                     Bump maven-javadoc-plugin from 3.4.0 to 3.4.1. Thanks to Gary Gregory.
o                     Bump maven-pmd-plugin 3.17.0 to 3.19.0. Thanks to Gary Gregory.
o                     Bump pmd from 6.47.0 to 6.53.0. Thanks to Gary Gregory.
o                     Bump snakeyaml from 1.30 to 2.0 #203, #212, #219, #282, #283. Thanks to Dependabot, strangelookingnerd.
o                     Bump jackson-databind from 2.13.3 to 2.14.2 #227, #246, #274. Thanks to Gary Gregory.
o                     Bump spring.version from 5.3.22 to 5.3.23 #211. Thanks to Dependabot.
o                     Bump commons-parent from 53 to 56 #216, #253. Thanks to Dependabot, Gary Gregory.
o                     Bump log4j.version from 2.18.0 to 2.20.0 #213, #281. Thanks to Dependabot.
o                     Bump japicmp-maven-plugin from 0.15.7 to 0.17.1. Thanks to Gary Gregory.
o                     Bump commons-text from 1.9 to 1.10.0 #221. Thanks to Dependabot.
o                     Bump actions/cache from 3.0.8 to 3.0.10 #223, #225. Thanks to Dependabot.


Historical list of changes: https://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:

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

Download it from https://commons.apache.org/proper/commons-configuration//download_configuration.cgi

=============================================================================

Apache Commons Configuration
Version 2.8.0
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.

Tools to assist in the reading of configuration/preferences files in
various formats

Minor release with new features and updated dependencies.

Changes in this version include:

New features:
o                     Implement Iterable in ImmutableNode #74. Thanks to SethiPandi.
o                     Add PropertiesConfigurationLayout.getBlankLinesBefore() and deprecate getBlancLinesBefore(). Thanks to Gary Gregory.
o                     Add PropertiesConfigurationLayout.setBlankLinesBefore() and deprecate setBlancLinesBefore(). Thanks to Gary Gregory.
o                     Add PropertiesConfigurationLayout.PropertyLayoutData.getBlankLines() and deprecate getBlancLines(). Thanks to Gary Gregory.
o                     Add PropertiesConfigurationLayout.PropertyLayoutData.setBlankLines() and deprecate setBlancLines(). Thanks to Gary Gregory.
o CONFIGURATION-789:  Add ImmutableConfiguration.getEnum() methods. Thanks to Gary Gregory.
o CONFIGURATION-789:  Add ImmutableConfiguration.getDuration() methods. Thanks to Gary Gregory.

Fixed Bugs:
o CONFIGURATION-753:  Make interpolation of collections and arrays in ConfigurationInterpolator consistent with
                      behavior of DefaultConversionHandler. Add ConfigurationInterpolator.setStringConverter to
                      allow customized string conversion behavior.
o CONFIGURATION-795:  Computation of blank lines after header comment #82. Thanks to dpeger.
o CONFIGURATION-801:  Remove redundant initializer #110. Thanks to Arturo Bernal.
o CONFIGURATION-802:  Use final #111. Thanks to Arturo Bernal.
o CONFIGURATION-803:  Java 8 lambda improvements and more #112. Thanks to Arturo Bernal.
o CONFIGURATION-804:  Redundant local variable #113. Thanks to Arturo Bernal.
o CONFIGURATION-805:  Use try with resource #114. Thanks to Arturo Bernal.
o CONFIGURATION-805:  [Javadoc] Specify that typed getList returns null for missing key #100. Thanks to Roman Zaynetdinov.
o                     Mention EnvironmentConfiguration in the list of configuration sources #45. Thanks to Oliver B. Fischer.
o CONFIGURATION-808:  DefaultListDelimiterHandler.escapeList working only for List>String< #137. Thanks to cigaly.
o                     Use final #141. Thanks to Arturo Bernal.
o                     Replace test asserts by simpler but equivalent calls. #139 Thanks to Arturo Bernal.
o CONFIGURATION-764:  Single Variable Interpolation #182. Thanks to Ning Zhang, Matt Juntunen, Bruno P. Kinoshita, Gary Gregory.
o                     Implement proper concurrency in ConstantLookup. Thanks to Gary Gregory.
o CONFIGURATION-813:  Support new namespace jakarta.mail.* used by javamail 2.0+ (first release October 2020) #186. Thanks to Dependabot.

Changes:
o                     Unclosed file handle when reading config from JAR file URL.
                      Add and use FileBasedBuilderProperties.setURL(URL, URLConnectionOptions). Thanks to Robin Jansohn, Gary Gregory, Rob Spoor.
o                     Make default interpolation prefix lookups configurable via system property. Remove dns, url, and script 
                      lookups from defaults. If these lookups are required for use in AbstractConfiguration subclasses, they must 
                      be enabled via system property. See ConfigurationInterpolator.getDefaultPrefixLookups() for details.
o                     Bump actions/cache from 2 to 3.0.4 #99, #151, #169. Thanks to Dependabot, Gary Gregory.
o                     Bump actions/checkout from 1 to 3 #47, #62, #70, #85, #150, #163. Thanks to Dependabot.
o                     Bump actions/setup-java from 1.4.0 to 3 #63, #65, #73, #174. Thanks to Dependabot, Gary Gregory.
o                     Bump codeql-action from v1 to v2. Thanks to Dependabot, Matt Juntunen.
o                     Bump Spring dependency versions:
                      org.springframework:spring-beans 4.3.26.RELEASE -> 5.3.21
                      org.springframework:spring-context 4.3.26.RELEASE -> 5.3.21
                      org.springframework:spring-core 4.3.26.RELEASE -> 5.3.21
                      org.springframework:spring-test 4.3.26.RELEASE -> 5.3.21
                      #165, #172 Thanks to Dependabot, Matt Juntunen, kinow, Gary Gregory.
o                     Bump commons-parent from 52 to 53. Thanks to Dependabot, Matt Juntunen.
o CONFIGURATION-787:  Bump Apache Commons Lang from 3.9 to 3.12.0. Thanks to Gary Gregory.
o CONFIGURATION-790:  Bump com.fasterxml.jackson.core:jackson-databind from 2.10.3 to 2.13.3, #60. Thanks to Gary Gregory, Dependabot.
o                     Bump Slf4j test dependencies:
                      org.slf4j:slf4j-api 1.7.26 -> 1.7.33,
                      org.slf4j:slf4j-ext 1.7.26 -> 1.7.33,
                      org.slf4j:slf4j-log4j12 1.7.26 -> 1.7.33,
                      org.slf4j:slf4j-nop 1.7.26 -> 1.7.33. Thanks to Gary Gregory.
o                     Bump commons-parent from 50 to 52. Thanks to Dependabot.
o                     Bump mailapi from 1.6.4 to 1.6.7 #48. Thanks to Dependabot, Gary Gregory.
o                     Bump spotbugs-maven-plugin from 3.1.12.2 to 4.7.0.0, #55, #75, #79, #93, #116, #183. Thanks to Dependabot, Gary Gregory.
o                     Bump hsqldb from 2.5.0 to 2.5.2 #54, #128. Thanks to Dependabot.
o                     Bump commons-text from 1.8 to 1.9. Thanks to Gary Gregory.
o                     Bump servlet-api from 2.4 to 2.5 #58. Thanks to Gary Gregory.
o                     Bump maven-checkstyle-plugin from 3.1.0 to 3.1.2, #57, #97. Thanks to Gary Gregory.
o                     Bump commons-pool2 from 2.8.0 to 2.10.0, #61, #124. Thanks to Dependabot, Gary Gregory.
o                     Bump optional commons-codec from 1.14 to 1.15. Thanks to Gary Gregory.
o                     Bump checkstyle from 8.26 to 9.3, #66, #71, #90, #101, #118, #121, #132, #155. Thanks to Dependabot, Gary Gregory.
o                     Bump commons.jacoco.version 0.8.5 to 0.8.8 (Fixes Java 15 builds). Thanks to Gary Gregory.
o                     Bump tests from commons-pool2 2.10.0 to 2.11.1. Thanks to Gary Gregory.
o                     Bump tests from commons-dbcp2 2.7.0 to 2.9.0. Thanks to Gary Gregory.
o                     Bump snakeyaml from 1.26 to 1.30 #68, #126, #137. Thanks to Dependabot, Gary Gregory.
o                     Bump commons.japicmp.version from 0.14.1 to 0.15.7. Thanks to Gary Gregory.
o                     Bump junit from 4.13 to 4.13.2 #78. Thanks to Dependabot, Gary Gregory.
o                     Bump Apache Commons VFS 2.6.0 -> 2.9.0. Thanks to Gary Gregory.
o                     Bump jackson-databind from 2.11.3 to 2.13.2.2 ,#88, #94, #127, #159, #168, #173. Thanks to Dependabot.
o                     Bump commons.animal-sniffer.version 1.19 -> 1.20. Thanks to Gary Gregory.
o                     Bump commons.javadoc.version from 3.1.1 to 3.4.0. Thanks to Gary Gregory.
o                     Bump org.dbunit:dbunit from 2.7.0 to 2.7.3, #167. Thanks to Gary Gregory, Dependabot.
o                     Bump tests to hamcrest v2.2 #143. Thanks to John Patrick.
o                     Bump slf4j.version from 1.7.33 to 1.7.36 #166. Thanks to Dependabot.
o                     Bump mailapi from 1.6.6 to 2.0.1 #186. Thanks to Dependabot.
o                     Use GitHub Actions setup-java Maven cache property #190. Thanks to sullis.


Historical list of changes: https://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:

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

Download it from https://commons.apache.org/proper/commons-configuration/download_configuration.cgi

=============================================================================

Apache Commons Configuration
Version 2.7
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.

Tools to assist in the reading of configuration/preferences files in
various formats

Minor release with new features and updated dependencies.

Changes in this version include:

New features:
o CONFIGURATION-765:  Refactor XMLConfiguration.write(Writer) to add XMLConfiguration.write(Writer, Transformer). Thanks to Gary Gregory.

Fixed Bugs:
o CONFIGURATION-761:  Single argument DataConfiguration APIs always create empty arrays. Thanks to Gary Gregory.
o CONFIGURATION-767:  NullPointerException in XMLConfiguration#createTransformer() when no FileLocator is set. Thanks to Gary Gregory.
o CONFIGURATION-768:  XMLConfiguration#write does not indent XML elements. Thanks to Gary Gregory.
o CONFIGURATION-771:  Update com.fasterxml.jackson.core:jackson-databind 2.10.0 -> 2.10.1. Thanks to Gary Gregory.
o CONFIGURATION-773:  User's Guide > Properties files > Saving - small documentation bugs #41. Thanks to Dan Dragut.

Changes:
o CONFIGURATION-762:  Use variable arguments. Thanks to Gary Gregory.
o                     Update ]com.puppycrawl.tools:checkstyle from 8.24 to  8.25. Thanks to Gary Gregory.
o CONFIGURATION-763:  Update com.fasterxml.jackson.core:jackson-databind from 2.9.9 to 2.10.0. Thanks to Gary Gregory.
o                     [test] org.easymock:easymock 4.0.2 -> 4.1. Thanks to Gary Gregory.
o CONFIGURATION-775:  Update Apache Commons VFS from 2.4.1 to 2.5.0. Thanks to Gary Gregory.
o CONFIGURATION-777:  Update Apache Commons VFS from 2.5.0 to 2.6.0. Thanks to Gary Gregory.
o CONFIGURATION-778:  Update optional Apache Commons Codec from 1.13 to 1.14. Thanks to Gary Gregory.
o                     Update tests from JUnit 4.12 to 4.13. Thanks to Gary Gregory.
o CONFIGURATION-779:  Update optional jackson-databind from 2.10.1 to 2.10.2. Thanks to Gary Gregory.
o CONFIGURATION-783:  Update com.fasterxml.jackson.core:jackson-databind from 2.10.2 to 2.10.3. Thanks to Gary Gregory.
o CONFIGURATION-784:  Update org.yaml:snakeyaml from 1.25 to 1.26 and tweak parser configuration. Thanks to Gary Gregory.
o CONFIGURATION-785:  Update org.springframework:spring-* from 4.3.25.RELEASE to 4.3.26.RELEASE. Thanks to Gary Gregory.
o                     Update org.apache.commons:commons-parent from 48 to 50 Thanks to Rob Tompkins.


Historical list of changes: https://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:

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

Download it from https://commons.apache.org/proper/commons-configuration/download_configuration.cgi

=============================================================================

Apache Commons Configuration
Version 2.6
Release Notes
                        2019-09-13


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.

Tools to assist in the reading of configuration/preferences files in
various formats

Minor release with new features and updated dependencies.

Changes in this version include:

New features:
o                     Document "includeOptional" on the site. Thanks to Gary Gregory.
o CONFIGURATION-756:  Allow for custom behavior to handle errors loading included properties files. Thanks to Gary Gregory.

Fixed Bugs:
o CONFIGURATION-750:  XMLPropertyListConfiguration cannot set arrays in the correct plist form. Thanks to Jason Pickens, Gary Gregory, Emmanuel Bourg.
o                     Fix Javadoc for org.apache.commons.configuration2.PropertiesConfiguration.getIncludeOptional(). Thanks to Gary Gregory.
o CONFIGURATION-760:  Properties file using cyclical includes cause a StackOverflowError instead of detecting the misconfiguration. Thanks to Gary Gregory.

Changes:
o CONFIGURATION-751:  Update Apache Commons Text from 1.6 to 1.7. Thanks to Gary Gregory.
o CONFIGURATION-752:  Update Apache Commons VFS from 2.3 to 2.4.1. Thanks to Gary Gregory.
o CONFIGURATION-754:  Update Apache Commons Text from 1.7 to 1.8. Thanks to Gary Gregory.
o CONFIGURATION-755:  [CVE-2014-0114] Update Apache Commons BeanUtils from 1.9.3 to 1.9.4. Thanks to Gary Gregory.
o                     Fix syntax in user guide documentation #33. Thanks to Kevin Wang.
o CONFIGURATION-757:  Update org.yaml:snakeyaml from 1.24 to 1.25. Thanks to Gary Gregory.
o                     Update tests from org.apache.commons:commons-dbcp2 2.6.0 to 2.7.0. Thanks to Gary Gregory.
o                     Update tests from org.apache.commons:commons-pool2 2.6.2 to 2.7.0. Thanks to Gary Gregory.
o CONFIGURATION-758:  Update commons-codec:commons-codec from 1.12 to 1.13. Thanks to Gary Gregory.
o                     Update tests from org.hsqldb:hsqldb 2.4.1 to 2.5.0. Thanks to Gary Gregory.
o                     Update tests from com.sun.mail:mailapi 1.6.3 to 1.6.4. Thanks to Gary Gregory.
o CONFIGURATION-759:  Update Spring from 4.3.24.RELEASE to 4.3.25.RELEASE. Thanks to Gary Gregory.
o                     Update maven-checkstyle-plugin from 3.0.0 to 3.1.0. Thanks to Gary Gregory.
o                     Use current version of Checkstyle: 6.18 to 8.24. Thanks to Gary Gregory.


Historical list of changes: https://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:

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

Download it from https://commons.apache.org/proper/commons-configuration/download_configuration.cgi

=============================================================================

Apache Commons Configuration
Version 2.5
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.

Minor release with new features and updated dependencies.

Changes in this version include:


Fixed Bugs:
o CONFIGURATION-731:  Allow user to specify the comments and separator chars. Thanks to Shuai Zhang, Gary Gregory.

Changes:
o CONFIGURATION-738:  Update Jackson from 2.9.7 to 2.9.8. Thanks to Gary Gregory.
o CONFIGURATION-739:  Update Apache Commons Codec from 1.11 to 1.12. Thanks to Gary Gregory.
o CONFIGURATION-740:  Update Apache Commons VFS from 2.2 to 2.3. Thanks to Gary Gregory.
o CONFIGURATION-741:  Update Spring from 4.3.19 to 4.3.22. Thanks to Gary Gregory.
o CONFIGURATION-743:  Update optional library snakeyaml from 1.23 to 1.24. Thanks to Gary Gregory.
o CONFIGURATION-747:  Update Apache Commons Lang from 3.8.1 to 3.9. Thanks to Gary Gregory.
o CONFIGURATION-746:  Update Jackson from 2.9.8 to 2.9.9. Thanks to Gary Gregory.
o CONFIGURATION-747:  Update Spring from 4.3.22 to 4.3.24. Thanks to Gary Gregory.
o CONFIGURATION-745:  Add the special key "includeoptional" for properties files. Thanks to Gary Gregory.


Historical list of changes: https://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:

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

=============================================================================

Apache Commons Configuration
Version 2.4
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.

Minor release with new features and updated dependencies.

Changes in this version include:

NEW FEATURES
============

o CONFIGURATION-712:  FileHandlerReloadingDetector now has a new refresh() method to
                      initialize the reloading state from the underlying file. This new
                      method is called by DefaultReloadingDetectorFactory when a new detector
                      instance is created. This makes sure that a changed configuration file
                      is directly detected on the first invocation of the
                      isReloadingRequired() method. Thanks to Rolland Hobbie.
o CONFIGURATION-713:  Configuration properties can now be converted to regular expressions. Thanks to Lars W.
o CONFIGURATION-715:  With JupIOFactory a new IOFactory implementation is now available that
                      implements handling of whitespace in a way closer to java.util.Properties.
                      This class can be used when stricter compatibility with Java standard
                      methods for reading and writing properties files is needed. Thanks to Patrick Schmidt.
o CONFIGURATION-716:  JupIOFactory (introduced for CONFIGURATION-715) also implements
                      handling of escape sequences in a way closer to java.util.Properties. Thanks to Patrick Schmidt.
o CONFIGURATION-724:  Add support for Commons Text 1.4 localhost string lookup as a default lookup.
o CONFIGURATION-726:  Add support for Commons Text 1.5 new string lookups as default lookups.

FIXED BUGS
==========

o CONFIGURATION-710:  Fixed numerous typos in user guides. Thanks to thc202.
o CONFIGURATION-711:  Update Apache Commons Lang from 3.7 to 3.8.1.
o CONFIGURATION-727:  org.apache.commons.configuration2.DatabaseConfiguration never closes result sets and statements.

CHANGES
=======

o CONFIGURATION-720:  Replace use of deprecated Commons Lang string substitution code for Commons Text.
o CONFIGURATION-694:  Update Java requirement from version 7 to 8.
o CONFIGURATION-721:  Update Jackson from 2.9.6 to 2.9.7.
o CONFIGURATION-722:  Update optional dependency snakeyaml from 1.21 to 1.23.
o CONFIGURATION-723:  Update optional Spring dependencies from 4.3.18.RELEASE to 4.3.19.RELEASE.
o CONFIGURATION-725:  Update Apache Commons Text from 1.4 to 1.5.
o CONFIGURATION-728:  Update Apache Commons Text from 1.5 to 1.6.


Historical list of changes: https://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:

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


=============================================================================

Apache Commons Configuration
Version 2.3
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.

Version 2.3 is another maintenance release for the Configuration 2.x series. It
contains bug fixes and also a few new features like support for File and Path
as data types. The release is fully source and binary compatible with version
2.2.

Commons Configuration 2.3 requires Java 1.7 or higher.

New features
============
o CONFIGURATION-692
  ConversionExceptions thrown when accessing the properties of a configuration
  now contain the original cause of the exception.

o CONFIGURATION-693
  Configuration properties can now be converted to the data types File and
  Path.

o CONFIGURATION-698
  Add org.apache.commons.configuration2.MapConfiguration.toString().

o CONFIGURATION-698
  Add toString() methods here and there to help debugging.

o CONFIGURATION-701
  CompositeConfiguration now supports an addConfigurationFirst() method to add
  child configurations with a higher priority.

Fixed Bugs
==========
o CONFIGURATION-652
  Root node attributes are now updated correctly when loading XML configuration
  files.

o CONFIGURATION-686
  JSONConfiguration can now handle list structures with complex objects as
  elements.

o CONFIGURATION-687
  Fixed a memory leak in CombinedConfigurationBuilder. Builder for the child
  sources were created each time a new result configuration was requested; thus
  the list with child builders got longer and longer. This also had an impact
  on reloading because unnecessary reloading operations could be triggered. Now
  it is guaranteed that child builders are created only once.

o CONFIGURATION-688
  Fixed a bug related to the handling of multiple include files in
  PropertiesConfiguration.

o CONFIGURATION-690
  ExprLookup.getVariables() no longer returns null, but a copy of the current
  variables of this lookup object.

o CONFIGURATION-691
  ExprLookup now handles expressions that do not return a string result by
  converting them to string.

o CONFIGURATION-703
  XMLConfiguration now handles elements correctly whose value consists only of
  whitespace if the xml:space attribute is set to preserve.

Other changes
=============
o CONFIGURATION-675
  Added a .gitignore file to the project.

o Some dependencies have been updated to their most recent versions. However,
  as no new features of these dependencies are used, the older versions should
  still work. The following dependencies are affected:
  o Update Apache Commons Lang dependency from 3.6 to 3.7.
  o Update Apache Commons VFS from 2.1 to 2.2.
  o Update Apache Commons Codec from 1.10 to 1.11.
  o Update Spring from 4.3.9.RELEASE to 4.3.18.RELEASE
  o Update optional dependency snakeyaml from 1.18 to 1.21.
  o Update optional dependency Jackson from 2.8.9 to 2.9.6.


Historical list of changes: https://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:

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

=============================================================================

Apache Commons Configuration
Version 2.2
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.

Version 2.2 is another maintenance release for the Configuration 2.x series. It
contains a number of bug fixes and also some new features. Among the highlights
is the new support for JSON and YAML configurations. The release is fully
source and binary compatible with version 2.1.1.

Commons Configuration 2.2 requires Java 1.7 or higher.

New features
============
o CONFIGURATION-666
  Add convenience ctor ConfigurationRuntimeException(String, Object...).

o CONFIGURATION-665
  Add org.apache.commons.configuration2.AbstractHierarchicalConfiguration.toString().

o CONFIGURATION-664
  Add API org.apache.commons.configuration2.tree.ImmutableNode.getChildren(String).

o CONFIGURATION-660
  Add toString() methods here and there to help debugging.

o CONFIGURATION-658
  Add API org.apache.commons.configuration2.DataConfiguration.getURI(String)
  methods.

o CONFIGURATION-656
  Added new YAMLConfiguration class to support configuration files in YAML
  format.

o CONFIGURATION-653
  ConfigurationUtils and ConfigurationConverter now offer better support for
  immutable configurations.

o CONFIGURATION-647
  INIConfiguration can now be configured to use a custom separator between
  properties and values when writing an ini file.

o CONFIGURATION-258
  Added new JSONConfiguration class to support configuration files in JSON
  format.

Fixed Bugs
==========
o CONFIGURATION-671
  Fixed a NPE in INIConfiguration when saving a configuration with an empty
  section.

o CONFIGURATION-669
  The node model returned by SubnodeConfiguration.getNodeModel() has now the
  correct root node set.

Other changes
=============
o CONFIGURATION-673
  Added an Automatic-Module-Name header to the manifest for compatibility with
  the Java 9 module system.

o CONFIGURATION-669
  Update optional Spring dependency from 4.2.5.RELEASE to 4.3.9.RELEASE.

o CONFIGURATION-667
  Update Apache Commons Lang dependency from 3.3.2 to 3.6.

o CONFIGURATION-663
  Fixed a typo in the upgrade to 2.0 guide.

o CONFIGURATION-661
  Update platform requirement from Java 6 to 7.


Historical list of changes: https://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:

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

=============================================================================

Apache Commons Configuration
Version 2.1.1
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.

The release is fully source and binary compatible with version 2.1.

Commons Configuration 2.1 requires Java 1.6 or higher.

Fixed Bugs
==========
o CONFIGURATION-649
  Improved the handling of lists defined by a string with delimiter characters
  in XMLConfiguration. Such lists now retain their original format when the
  configuration is saved.

o CONFIGURATION-648
  Made the IOFactory property of PropertiesBuilderParameter compatible with the
  most recent version of Commons BeanUtils. This version changed the handling
  of properties starting with multiple uppercase letters.

o CONFIGURATION-646
  PropertiesConfiguration now works correctly with the auto-save mode.

o CONFIGURATION-644
  PropertiesConfigurationLayout no longer duplicates a header comment if a file
  with another comment is loaded. Thanks to Andrew DeMaria.

o CONFIGURATION-643
  Documentation improvements for the user's guide.

o CONFIGURATION-641
  Improved documentation of FileBased interface. The Javadocs now state
  explicitly that the methods should not be called by client code. Exception
  handling in configuration classes implementing FileLocatorAware has been
  improved.

o CONFIGURATION-640
  PropertiesConfiguration now correctly unescapes some special characters that
  are always escaped in Java properties files.

Other changes
=============
o CONFIGURATION-639
  In the OSGi bundle manifest of the Commons Configuration bundle the package
  imports for Spring packages are now marked as optional.
  Thanks to Rico Neubauer.

o CONFIGURATION-638
  Improved handling of temporary files and folders in unit tests.
  Thanks to Ahmet Celik.

o CONFIGURATION-627
  Updated dependency to Commons BeanUtils to version 1.9.3. This fixes an issue
  with an exception stacktrace that was logged when a ConfigurationBuilder was
  used.


Historical list of changes: https://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:

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

=============================================================================

                        Commons Configuration Package
Version 2.1
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.

Version 2.1 is a first bug-fix release for the Configuration 2.x series and
also adds a new feature related to the integration with the Spring framework.
A list of all changes can be found below.

The release is fully source and binary compatible with version 2.0.

Commons Configuration 2.1 requires Java 1.6 or higher.

New Features
============
o CONFIGURATION-636
  PropertiesConfigurationLayout now allows manipulating the order of keys when
  the properties file is written.

o CONFIGURATION-624
  Support Commons Configuration as PropertySource in Spring.

Fixed Bugs
==========
o CONFIGURATION-634
  HomeDirectoryLocationStrategy now works correctly in the mode that evaluates
  the FileLocator's base path.

o CONFIGURATION-633
  Interpolation was improved to better support properties with multiple values.

o CONFIGURATION-632
  The methods getStringArray() and getList() of CompositeConfiguration now
  support the interpolation of variables that reference properties with
  multiple values.

o CONFIGURATION-622
  Fixed a problem in INIConfiguration.write() with keys containing a separator
  character. This separator had been duplicated. Such keys are now handled
  correctly when the configuration is saved.

Other changes
=============
o CONFIGURATION-628
  Support for the ant build was dropped.

o CONFIGURATION-626
  ImmutableConfiguration.getArray() has been deprecated. Arrays can now be
  queried using the generic get() method in a type-safe way.

o CONFIGURATION-631
  Updated optional dependency to Apache Commons VFS from 2.0 to 2.1. (The older
  version still works.)

o CONFIGURATION-635
  Updated optional dependency to Apache Commons Codec from 1.9 to 1.10. (The
  older version still works.)


Historical list of changes: https://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 Commons Configuration website:
https://commons.apache.org/proper/commons-configuration/

=============================================================================

Apache Commons Configuration
Version 2.0
Release Notes

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

After a series of alpha and beta releases (please consult the corresponding
release notes below), this is the first final release for Apache Commons
Configuration 2.0.

Version 2.0 is a complete redesign of the Configuration 1.x API with the aim to
fix some limitations in the original design and make the library more flexible
and powerful. Therefore, this release is not a drop-in replacement for Commons
Configuration 1.x; there have been incompatible changes in many areas that
require adaptations on client code. A migration guide is available at

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

that describes all breaking changes and helps when upgrading to the new
version. One obvious breaking change is the renaming of the main package
(all classes are now located under org.apache.commons.configuration2) and the
Maven coordinates (groupId: org.apache.commons, artifactId:
commons-configuration2). This was necessary to allow both versions to coexist
on the classpath without conflicts.

The user's guide has been completely reworked to describe all features of the
new version. It can be found at

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

Changes:
========
o CONFIGURATION-621:
  Moved ConfigurationLogger class to io package to avoid cyclic dependencies
  between packages.
o CONFIGURATION-619:
  CombinedConfigurationBuilder now supports inheritance of its parameters to
  child configuration sources. This is enabled by default.
o CONFIGURATION-615:
  Changed generic types in the signatures of a MapConfiguration constructor
  and AbstractConfiguration.getList(String, List). These changes were made in
  version 1.10 as fixes for CONFIGURATION-557 and CONFIGURATION-558. But it
  had been missed to merge them to trunk.

Fixed Bugs:
===========
o CONFIGURATION-620:
  Fixed two invalid examples in the user's guide for file-based configurations.
o CONFIGURATION-618:
  When using immutable configurations exceptions thrown by the wrapped
  configuration came out as UndeclaredThrowableException. This has been fixed;
  now the correct original exception is thrown.

Commons Configuration 2.0 requires Java 1.6 or higher.

=============================================================================

Apache Commons Configuration
Version 2.0-beta2
Release Notes

After the first beta release in June 2015 there has been some feedback from the
community resulting in (minor) adaptations of the API. In most cases, the
return values of methods have been changed to be more generic. There has also
been a change in the support for logging. Therefore, this second beta release
is provided to make these changes more "official".

This release also includes some bug fixes. The bugs addressed here have partly
existed already in the Configuration 1.0 code base; so these fixes are not all
related to changes introduced in the 2.0 version.

Below is a list of all changes in this version. Please refer to the clirr
report at https://commons.apache.org/proper/commons-configuration/clirr-report.html
for information about changes which break binary compatibility.

Changes:
========
o CONFIGURATION-614:
  References to Commons Logging have been removed from the Configuration API.
  It is still possible to influence logging by making use of the new
  ConfigurationLogger abstraction.
o CONFIGURATION-612:
  The return type of ConfigurationBuilder.getConfiguration() was changed from
  Configuration to ImmutableConfiguration because this is the base interface
  for all configuration objects. Thanks to Jon Weygand.
o CONFIGURATION-608:
  Adapted the return type of ReloadingFileBasedConfigurationBuilder.configure().

Fixed Bugs:
===========
o CONFIGURATION-609:
  Fixed a bug in PropertiesConfiguration related to the loading of include
  files. The FileHandler used for this purpose was not fully initialized.
o CONFIGURATION-605:
  XMLConfiguration no longer drops keys when list delimiter characters occur
  in element values.
o CONFIGURATION-604:
  Fixed a problem in the conversion of a flat configuration to a hierarchical
  one that could cause the loss of properties in a combined configuration
  constructed by an override combiner.

Commons Configuration 2.0-beta2 requires Java 1.6 or higher.

Historical list of changes: https://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 Commons Configuration website:
https://commons.apache.org/proper/commons-configuration/

=============================================================================

Apache Commons Configuration
Version 2.0-beta1
Release Notes

This is the first beta release of Commons Configuration 2.0 after two alpha
versions. There has not been much feedback so far and no requests for API
changes. Therefore, we move forwards to a beta release indicating that the API
can be considered more stable. However, at this stage, changes of the API can
still not be fully excluded.

Below is a list of all changes in this version. Compared to version 2.0-alpha2,
there has only be a single change: an obsolete interface (which had been
overlooked during a major refactoring) was removed. So applications that are
using 2.0-alpha2 should be able to migrate to 2.0-beta1 without problems.

Changes:
========
o CONFIGURATION-598: Removed obsolete ConfigurationBuilder interface in the
                     base package.

=============================================================================

Apache Commons Configuration
Version 2.0-alpha2
Release Notes


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: https://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 Commons Configuration website:

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

=============================================================================

Apache Commons Configuration
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

https://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

https://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: https://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 Commons Configuration website:

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