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

Tools to assist in the reading of configuration/preferences files in various formats; requires Java 8.

Minor release with new features and updated dependencies; requires Java 8 or above.

Changes in this version include:


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

* CONFIGURATION-839:  java.lang.module.FindException: Module servlet.api not found. Thanks to Bob Marinier, Gary Gregory.
* CONFIGURATION-840:  StackOverflowError adding property in AbstractListDelimiterHandler.flattenIterator(). Thanks to Bob Marinier, Gary Gregory.
* CONFIGURATION-841:  StackOverflowError calling ListDelimiterHandler.flatten(Object, int) with a cyclical object tree. Thanks to Gary Gregory.

Changes
-------

*                     Bump jackson-databind from 2.16.1 to 2.17.0 #378. Thanks to Dependabot.
*                     Bump log4j.version from 2.23.0 to 2.23.1 #379. Thanks to Dependabot.
*                     Bump spring.version from 5.3.32 to 5.3.33 #380. Thanks to Dependabot, 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.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; requires Java 8 or above.

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 67. 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.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/
