Apache Commons Configuration
Version 2.10.0
Release Notes

Introducing Apache Commons Configuration
----------------------------------------

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

*                     Add AbstractConfiguration.getKeysInternal(String, String) #300. Thanks to KeijoB, Gary Gregory.
*                     Add ImmutableConfiguration.getKeys(String, String) #300. Thanks to KeijoB, Gary Gregory.
*                     Add PrefixedKeysIterator.PrefixedKeysIterator(Iterator<String%gt;, String, String) #300. Thanks to KeijoB, Gary Gregory.
*                     Add Maven property project.build.outputTimestamp for build reproducibility. Thanks to Gary Gregory.
*                     Guard PatternSubtreeConfigurationWrapper constructor against null #365. Thanks to Heewon Lee.

Fixed Bugs
----------

*                     [StepSecurity] ci: Harden GitHub Actions #307. Thanks to step-security-bot, Gary Gregory.
* CONFIGURATION-834:  ConfirgurationPropertySource doesn't supply resolved values #309. Thanks to Keith Barlow, Gary Gregory.
*                     Take prefix delimiter into account when SubsetConfiguration.getKeysInternal() is called #300. Thanks to KeijoB, Gary Gregory.
*                     Guard ConfigurationMap against null configuration #355. Thanks to Heewon Lee, Gary Gregory.
* CONFIGURATION-838:  Properties parser stack overflows on large single-key inputs #369. Thanks to Ian Lynagh.
*                     DatabaseConfiguration.AbstractJdbcOperation.execute() throws NullPointerException when no data source is set #368. Thanks to Heewon Lee, Gary Gregory.

Changes
-------

*                     Bump jackson-databind from 2.14.2 to 2.16.1 #297, #303, #326, #331, #340. Thanks to Dependabot.
*                     Bump commons-io:commons-io from 2.11.0 to 2.15.1. Thanks to Gary Gregory.
*                     Bump spring-* from 5.3.26 to 5.3.32. Thanks to Gary Gregory.
*                     Bump commons-parent from 57 to 66. Thanks to Gary Gregory.
*                     Bump commons-codec:commons-codec from 1.15 to 1.16.1. Thanks to Gary Gregory.
*                     Bump commons-lang3 from 3.11 to 3.14.0. Thanks to Gary Gregory.
*                     Bump org.yaml:snakeyaml from 2.0 to 2.2 #312, #315. Thanks to Dependabot.
*                     Bump slf4j.version from 2.0.7 to 2.0.12 #358. Thanks to Dependabot.
*                     Bump org.apache.commons:commons-dbcp2 from 2.9.0 to 2.12.0. Thanks to Gary Gregory.
*                     Bump org.apache.commons:commons-pool2 from 2.11.1 to 2.12.0. Thanks to Gary Gregory.
*                     Bump org.apache.logging.log4j:log4j-1.2-* from 2.20.0 to 2.23.0 #334, #339, #367. Thanks to Gary Gregory, Dependabot.
*                     Bump org.apache.commons:commons-text from 1.10.0 to 1.11.0. Thanks to Gary Gregory.
*                     Bump commons-logging:commons-logging from 1.2 to 1.3.0. 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.9.0
Release Notes


Introducing Apache Commons Configuration
----------------------------------------

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

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

Fixed Bugs
----------

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

Changes
-------

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


Introducing Apache Commons Configuration
----------------------------------------

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

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

Fixed Bugs
----------

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

Changes
-------

*                     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.
*                     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.
*                     Bump actions/cache from 2 to 3.0.4 #99, #151, #169. Thanks to Dependabot, Gary Gregory.
*                     Bump actions/checkout from 1 to 3 #47, #62, #70, #85, #150, #163. Thanks to Dependabot.
*                     Bump actions/setup-java from 1.4.0 to 3 #63, #65, #73, #174. Thanks to Dependabot, Gary Gregory.
*                     Bump codeql-action from v1 to v2. Thanks to Dependabot, Matt Juntunen.
*                     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.
*                     Bump commons-parent from 52 to 53. Thanks to Dependabot, Matt Juntunen.
* CONFIGURATION-787:  Bump Apache Commons Lang from 3.9 to 3.12.0. Thanks to Gary Gregory.
* CONFIGURATION-790:  Bump com.fasterxml.jackson.core:jackson-databind from 2.10.3 to 2.13.3, #60. Thanks to Gary Gregory, Dependabot.
*                     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.
*                     Bump commons-parent from 50 to 52. Thanks to Dependabot.
*                     Bump mailapi from 1.6.4 to 1.6.7 #48. Thanks to Dependabot, Gary Gregory.
*                     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.
*                     Bump hsqldb from 2.5.0 to 2.5.2 #54, #128. Thanks to Dependabot.
*                     Bump commons-text from 1.8 to 1.9. Thanks to Gary Gregory.
*                     Bump servlet-api from 2.4 to 2.5 #58. Thanks to Gary Gregory.
*                     Bump maven-checkstyle-plugin from 3.1.0 to 3.1.2, #57, #97. Thanks to Gary Gregory.
*                     Bump commons-pool2 from 2.8.0 to 2.10.0, #61, #124. Thanks to Dependabot, Gary Gregory.
*                     Bump optional commons-codec from 1.14 to 1.15. Thanks to Gary Gregory.
*                     Bump checkstyle from 8.26 to 9.3, #66, #71, #90, #101, #118, #121, #132, #155. Thanks to Dependabot, Gary Gregory.
*                     Bump commons.jacoco.version 0.8.5 to 0.8.8 (Fixes Java 15 builds). Thanks to Gary Gregory.
*                     Bump tests from commons-pool2 2.10.0 to 2.11.1. Thanks to Gary Gregory.
*                     Bump tests from commons-dbcp2 2.7.0 to 2.9.0. Thanks to Gary Gregory.
*                     Bump snakeyaml from 1.26 to 1.30 #68, #126, #137. Thanks to Dependabot, Gary Gregory.
*                     Bump commons.japicmp.version from 0.14.1 to 0.15.7. Thanks to Gary Gregory.
*                     Bump junit from 4.13 to 4.13.2 #78. Thanks to Dependabot, Gary Gregory.
*                     Bump Apache Commons VFS 2.6.0 -> 2.9.0. Thanks to Gary Gregory.
*                     Bump jackson-databind from 2.11.3 to 2.13.2.2 ,#88, #94, #127, #159, #168, #173. Thanks to Dependabot.
*                     Bump commons.animal-sniffer.version 1.19 -> 1.20. Thanks to Gary Gregory.
*                     Bump commons.javadoc.version from 3.1.1 to 3.4.0. Thanks to Gary Gregory.
*                     Bump org.dbunit:dbunit from 2.7.0 to 2.7.3, #167. Thanks to Gary Gregory, Dependabot.
*                     Bump tests to hamcrest v2.2 #143. Thanks to John Patrick.
*                     Bump slf4j.version from 1.7.33 to 1.7.36 #166. Thanks to Dependabot.
*                     Bump mailapi from 1.6.6 to 2.0.1 #186. Thanks to Dependabot.
*                     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


Introducing Apache Commons Configuration
----------------------------------------

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

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

Fixed Bugs
----------

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

Changes
-------

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


Introducing Apache Commons Configuration
----------------------------------------

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

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

Fixed Bugs
----------

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

Changes
-------

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


Introducing Apache Commons Configuration
----------------------------------------

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

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

Changes
-------

* CONFIGURATION-738:  Update Jackson from 2.9.7 to 2.9.8. Thanks to Gary Gregory.
* CONFIGURATION-739:  Update Apache Commons Codec from 1.11 to 1.12. Thanks to Gary Gregory.
* CONFIGURATION-740:  Update Apache Commons VFS from 2.2 to 2.3. Thanks to Gary Gregory.
* CONFIGURATION-741:  Update Spring from 4.3.19 to 4.3.22. Thanks to Gary Gregory.
* CONFIGURATION-743:  Update optional library snakeyaml from 1.23 to 1.24. Thanks to Gary Gregory.
* CONFIGURATION-747:  Update Apache Commons Lang from 3.8.1 to 3.9. Thanks to Gary Gregory.
* CONFIGURATION-746:  Update Jackson from 2.9.8 to 2.9.9. Thanks to Gary Gregory.
* CONFIGURATION-747:  Update Spring from 4.3.22 to 4.3.24. Thanks to Gary Gregory.
* 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


Introducing Apache Commons Configuration
----------------------------------------

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

* 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.
* CONFIGURATION-713:  Configuration properties can now be converted to regular expressions. Thanks to Lars W.
* 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.
* 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.
* CONFIGURATION-724:  Add support for Commons Text 1.4 localhost string lookup as a default lookup.
* CONFIGURATION-726:  Add support for Commons Text 1.5 new string lookups as default lookups.

Fixed Bugs
----------

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

Changes
-------

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


Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-692
  ConversionExceptions thrown when accessing the properties of a configuration
  now contain the original cause of the exception.

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

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

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

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

Fixed Bugs
----------

* CONFIGURATION-652
  Root node attributes are now updated correctly when loading XML configuration
  files.

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

* 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.

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

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

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

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

Other changes
-------------

* CONFIGURATION-675
  Added a .gitignore file to the project.

* 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


Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-666
  Add convenience ctor ConfigurationRuntimeException(String, Object...).

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

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

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

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

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

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

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

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

Fixed Bugs
----------

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

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

Other changes
-------------

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

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

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

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

* 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


Introducing Apache Commons Configuration
----------------------------------------

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

* 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.

* 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.

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

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

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

* 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.

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

Other changes
-------------

* 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.

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

* 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

Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-636
  PropertiesConfigurationLayout now allows manipulating the order of keys when
  the properties file is written.

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

Fixed Bugs
----------

* CONFIGURATION-634
  HomeDirectoryLocationStrategy now works correctly in the mode that evaluates
  the FileLocator's base path.

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

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

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

* CONFIGURATION-628
  Support for the ant build was dropped.

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

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

* 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

Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-621:
  Moved ConfigurationLogger class to io package to avoid cyclic dependencies
  between packages.
* CONFIGURATION-619:
  CombinedConfigurationBuilder now supports inheritance of its parameters to
  child configuration sources. This is enabled by default.
* 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
----------

* CONFIGURATION-620:
  Fixed two invalid examples in the user's guide for file-based configurations.
* 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

Introducing Apache Commons Configuration
----------------------------------------

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

* 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.
* 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.
* CONFIGURATION-608:
  Adapted the return type of ReloadingFileBasedConfigurationBuilder.configure().

Fixed Bugs
----------

* CONFIGURATION-609:
  Fixed a bug in PropertiesConfiguration related to the loading of include
  files. The FileHandler used for this purpose was not fully initialized.
* CONFIGURATION-605:
  XMLConfiguration no longer drops keys when list delimiter characters occur
  in element values.
* 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

Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-598: Removed obsolete ConfigurationBuilder interface in the
                     base package.

-----------------------------------------------------------------------------

Apache Commons Configuration
Version 2.0-alpha2
Release Notes


Introducing Apache Commons Configuration
----------------------------------------

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

* 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.
* CONFIGURATION-565:  Added support for querying encoded properties.
* CONFIGURATION-200:  A size() method was added to the ImmutableConfiguration interface.

Fixed Bugs
----------

* 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.
* 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

Introducing Apache Commons Configuration
----------------------------------------

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

* CONFIGURATION-579:  A migration guide has been created which supports when upgrading from
                      version 1.x to 2.0.
* CONFIGURATION-559:  It is now possible to define default values for initialization
                      properties of configurations.
* 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.
* CONFIGURATION-550:  Conversion to Character is now supported.
* CONFIGURATION-541:  Multi-file configurations are no longer restricted to XML configuration
                      files. Arbitrary file-based configurations are now supported.
* CONFIGURATION-535:  DatabaseConfiguration now provides get methods for querying its
                      properties defining the underlying database structures.
* CONFIGURATION-533:  DatabaseConfiguration now automatically converts CLOBs to strings if
                      they appear in property values.
* 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.
* CONFIGURATION-519:  Configuration objects are now created via configuration builders. A new
                      API for configuration builders has been added.
* CONFIGURATION-517:  Hierarchical configurations now provide methods to obtain sub
                      configurations for all child elements of a given key.
* CONFIGURATION-514:  Bean declarations now support constructor invocations.
* 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.
* 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.
* CONFIGURATION-204:  With the new reloading mechanism automatic and periodic reloading checks
                      can be performed.
* CONFIGURATION-202:  Reloading checks can now be performed in a background thread.

Fixed Bugs
----------

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

Changes
-------

* CONFIGURATION-591:  Removed methods from ConfigurationConverter related to ExtendedProperties.
                      This class is no longer supported by recent versions of Commons
                      Collections.
* CONFIGURATION-590:  Removed Serializable interface from all configuration implementations.
                      Some configuration classes declared this interface without being
                      actually serializable.
* 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.
* 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.
* CONFIGURATION-578:  The user's guide has been fully reworked to cover all new and enhanced
                      features of version 2.0.
* CONFIGURATION-577:  The dependency to Commons Collections is no longer needed.
* 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.
* 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.
* CONFIGURATION-573:  XPathExpressionEngine can now deal with namespace prefixes in node and
                      attribute names.
* CONFIGURATION-563:  The DefaultExpressionEngine class is now immutable. An instance can be
                      shared between multiple configuration objects.
* CONFIGURATION-562:  Improved the API of ExprLookup.
* 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.
* 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.
* 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.
* CONFIGURATION-546:  BeanHelper can now process BeanDefinitions initializing properties of
                      collection types of their target beans. Thanks to Justin Couch.
* CONFIGURATION-544:  Added missing dependencies to build.xml. Thanks to Oliver Kopp.
* 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.
* 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.
* CONFIGURATION-539:  The deprecated INIConfiguration class was removed.
                      HierarchicalINIConfiguration was renamed to INIConfiguration.
* CONFIGURATION-537:  The deprecated ConfigurationFactory class was removed.
* 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.
* CONFIGURATION-534:  The includesAllowed property of PropertyConfiguration is now independent
                      from the existence of a base path.
* 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.
* CONFIGURATION-527:  AbstractConfiguration.clearPropertyDirect() is now abstract. Thanks to Matthias Richter.
* CONFIGURATION-526:  XMLPropertiesConfiguration now supports loading from and saving to DOM
                      nodes. Thanks to Oliver Kopp.
* CONFIGURATION-524:  Interpolation now works correctly after a configuration was cloned.
                      The ConfigurationInterpolator instance is now cloned, too.
* CONFIGURATION-521:  ConfigurationUtils.fileFromUrl() now correctly handles URL containing
                      encoded percent characters. Thanks to Oliver Kopp.
* CONFIGURATION-520:  Support for reloading of configuration data has been reworked.
* 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.
* CONFIGURATION-516:  PropertiesConfiguration no longer escapes double quotes on saving.
* 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.
* CONFIGURATION-513:  HierarchicalConfiguration is now an interface. The base implementation
                      class is named BaseHierarchicalConfiguration.
* CONFIGURATION-506:  Removed obsolete nested classes Node and NodeVisitor of
                      HierarchicalConfiguration. The related deprecated class
                      ConfigurationKey was removed, too.
* 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.
* 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.
* CONFIGURATION-500:  XMLConfiguration now adds attributes of elements defining a list to
                      all list nodes.
* CONFIGURATION-496:  Concurrent access to configurations and reloading have been completely
                      redesigned. This should reduce the amount of synchronization.
* 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.
* CONFIGURATION-462:  Updated dependency to Commons Lang from version 2.6 to 3.1.
* CONFIGURATION-419:  EventSource is now an interface. With BaseEventSource there is a
                      default implementation.
* 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.
* CONFIGURATION-330:  Concurrent access to configurations has been reworked.
* CONFIGURATION-153:  It is now possible to define the strategy used for locating
                      configuration files.
* 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.
* 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/
