              Apache Commons BeanUtils 1.9.3
                  RELEASE NOTES

The Apache Commons team is pleased to announce the release of Apache
Commons BeanUtils 1.9.3

Apache Commons BeanUtils provides an easy-to-use but flexible wrapper around
reflection and introspection.

This is a bug fix release, which also improves the tests for building on Java
8.

Note that Java 8 and later no longer support indexed bean properties on
java.util.List, only on arrays like String[]. (BEANUTILS-492).  This affects
PropertyUtils.getPropertyType() and PropertyUtils.getPropertyDescriptor();
their javadoc have therefore been updated to reflect this change in the JDK.


Changes in this version include:

Fixed Bugs:

* BEANUTILS-477: Changed log level in FluentPropertyBeanIntrospector
* BEANUTILS-492: Fixed exception when setting indexed properties on DynaBeans.
  Thanks to Bernhard Seebass.
* BEANUTILS-470: Precision lost when converting BigDecimal. Thanks to Tommy
  Tynjä.
* BEANUTILS-465: Indexed List Setters fixed. Thanks to Daniel Atallah.

Changes:
* BEANUTILS-433: Update dependency from JUnit 3.8.1 to 4.12. 
  Thanks to Benedikt Ritter, Gary Gregory.
* BEANUTILS-469: Update commons-logging from 1.1.1 to 1.2. 
  Thanks to Gary Gregory.
* BEANUTILS-474: FluentPropertyBeanIntrospector does not use the same naming
  algorithm as DefaultBeanIntrospector.  Thanks to Michael Grove.
* BEANUTILS-490: Update Java requirement from Java 5 to 6. 
  Thanks to Gary Gregory.
* BEANUTILS-482: Update commons-collections from 3.2.1 to 3.2.2
  (CVE-2015-4852). Thanks to Gary Gregory.
* BEANUTILS-490: Update java requirement to Java 6. Thanks to Gary Gregory.
* BEANUTILS-492: IndexedPropertyDescriptor tests now pass on Java 8. 
  Thanks to Stian Soiland-Reyes.
* BEANUTILS-495: DateConverterTestBase fails on M/d/yy in Java 9.
  Thanks to Stian Soiland-Reyes.
* BEANUTILS-496: testGetDescriptorInvalidBoolean fails on Java 9.
  Thanks to Stian Soiland-Reyes.


Historical list of changes: https://commons.apache.org/proper/commons-beanutils/changes-report.html

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

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

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

                          Commons BeanUtils Package
                               Version 1.9.2
                               Release Notes

INTRODUCTION:
============

This document contains the release notes for this version of the Commons
BeanUtils package, and highlights changes since the previous version.

For more information on Commons BeanUtils, see
o https://commons.apache.org/beanutils/

Release 1.9.2 mainly addresses a potential security issue when accessing
properties in an uncontrolled way. In a nutshell, if an application that uses
Commons BeanUtils passes property paths from an external source directly to
the getProperty() method of BeanUtilsBean, an attacker can access the class
loader via the class property available on all Java objects.

In version 1.9.2 now a special BeanIntrospector class was added which allows
suppressing this property. Note that this BeanIntrospector is NOT enabled by
default! Commons BeanUtils is a low-level library, and on this layer it cannot
be decided whether access to a certain property is legal or not. Therefore,
an application has to activate this suppressing BeanIntrospector explicitly.
This can be done with the following lines of code:

BeanUtilsBean bub = new BeanUtilsBean();
bub.getPropertyUtils().addBeanIntrospector(
    SuppressPropertiesBeanIntrospector.SUPPRESS_CLASS);

Now all access to properties has to be done via the specially configured
BeanUtilsBean instance. More information about this issue can be found at
https://issues.apache.org/jira/browse/BEANUTILS-463 or in section 2.5 of the
user's guide.

BUGFIXES in version 1.9.2
=========================
* [BEANUTILS-458]
  BaseLocaleConverter.checkConversionResult() no longer throws a
  ConversionException if the result of a conversion is null.

New features in version 1.9.2
=============================
* [BEANUTILS-463]
  Added new SuppressPropertiesBeanIntrospector class to deal with a potential
  class loader vulnerability.

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

                        Release Notes for version 1.9.1

Release 1.9.1 is a bug fix release which addresses a problem with the new
feature of custom introspection introduced with release 1.9.0. It is fully
binary compatible with the previous release. The minimum required Java version
is 1.5.

BUGFIXES in version 1.9.1
=========================
* [BEANUTILS-456]
  For PropertyDescriptors obtained via custom introspection now additional
  information is stored to prevent that write methods are lost during
  garbage collection.

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

                        Release Notes for version 1.9.0

Release 1.9.0 contains some bug fixes and improvements that have accumulated
after the 1.8.3 release. The most obvious change is that the new version now
requires JDK 1.5 or higher, and that language features introduced with Java 5
(mainly generics) are used. A new feature has been introduced, too: the support
for customizing bean introspection.

Compatibility with 1.8.3
========================
Adding generics to the BeanUtils API has been done in a backwards compatible
way. This means that after type erasure the resulting classes look the same as
in the previous version. A drawback of this approach is that sometimes it is
not possible to use the logically correct type parameters because then
backwards compatibility would be broken. One example is the BeanMap class: The
class is now a Map<Object, Object> while its keys actually are strings.
However, implementing Map<String, Object> would change the signatures of some
methods in an incompatible way. More details about limitations of the
generification can be found at
https://issues.apache.org/jira/browse/BEANUTILS-452

One exception from the compatibility rule is the ResultSetIterator class which
now implements the Iterator<DynaBean> interface. This causes a change in the
return value of its next() method. ResultSetIterator is used internally as the
iterator implementation within ResultSetDynaClass (it is probably a mistake that
it is public). So chances are minimal that this change affects existing code.

Another change which may affect compatibility is [BEANUTILS-379] (details can
be found at https://issues.apache.org/jira/browse/BEANUTILS-379). Older
versions of BeanUtils contained some classes that were copied from Commons
Collections. These classes have now been removed, and a dependency to Commons
Collections has been added; the collections jar now has to be contained in the
classpath, too.

Except for the change on ResultSetIterator and the additional dependency to
Commons Collections, Commons BeanUtils 1.9.0 is fully binary compatible with
the previous version 1.8.3.

Changes on Converters
=====================
The convert() method in the Converter interface now uses a type parameter in
the following way:

    <T> T convert(Class<T> type, Object value);

This makes it possible to access the converter's result in a type-safe way.
Applying generics in this way revealed some inconsistencies in the Converter
implementations. There were situations in which converters could return a
result object of a different type as was requested. This was not a problem
before because the result type was just Object. Now the compiler complains if
a converter's result is not compatible with the desired target type.

Because of that Converter implementations have been made more strict. A
converter now checks the passed in target type, and if it cannot handle it,
throws a ConversionException. This prevents unexpected results and makes
converters more reliable (it could be considered a bug that a converter returns
a result object of a different data type as the passed in target type). In a
typical scenario, when converters are accessed via ConvertUtils, this change
should not cause any problems because the converters are only called for the
data types they have been registered for. But if converters are used directly,
they might now throw ConversionExceptions when they did not in a previous
version.

BUGFIXES in version 1.9.0
=========================
* [BEANUTILS-454]
  BeanUtilsBean.copyProperties() no longer throws a ConversionException for
  null properties of certain data types. This fixes a regression introduced in
  version 1.8.0. The issue is related to [BEANUTILS-387].
* [BEANUTILS-411]
  BeanUtilsBean.setProperty throws IllegalArgumentException if getter of nested
  property returns null.
* [BEANUTILS-408]
  MethodUtils.invokeMethod() throws NullPointerException when args==null.
* [BEANUTILS-426]
  ConstructorUtils.invokeConstructor(Class klass, Object arg) throws
  NullPointerException when arg==null.
* [BEANUTILS-380]
  BeanMap methods should initialize the root cause of exceptions that are
  thrown when running on JDK 1.4+.
* [BEANUTILS-379]
  Remove copied Collection classes.
* [BEANUTILS-378]
  BeanMap does not work in osgi (fixed by BEANUTILS-378).
* [BEANUTILS-381]
  MethodUtils getMatchingAccessibleMethod() does not correctly handle
  inheritance and method overloading.

New features in version 1.9.0
=============================
* [BEANUTILS-425]
  Support customization of introspection mechanism.
* [BEANUTILS-428]
  Provide a BeanIntrospector implementation which supports properties in a
  fluent API.
* [BEANUTILS-455]
  WrapDynaBeans can now be configured to use a specific instance of
  PropertyUtilsBean for introspection or property access.

Other changes in version 1.9.0
==============================
* [BEANUTILS-452]
  Add generics.
* [BEANUTILS-449]
  LocaleConverters do not take the target type into account.
* [BEANUTILS-448]
  LocaleConverters do not check their default value.
* [BEANUTILS-447]
  LazyDynaList.toArray() is not conform to the contract defined by the
  Collection interface.
* [BEANUTILS-446]
  Some of the converters ignore the passed in target type.
* [BEANUTILS-445]
  Converters can return an invalid result object if a default value is set.
* [BEANUTILS-441]
  Replace UnmodifiableSet.decorate with Collections.unModifiableSet.
* [BEANUTILS-436]
  Replace package.html with package-info.java.
* [BEANUTILS-438]
  Add @Deprecated and @Override Annotations.
* [BEANUTILS-437]
  Replace Date and Revision SVN keywords with Id.
* [BEANUTILS-431]
  Remove @author tags and move missing authors to pom.xml.
* [BEANUTILS-432]
  Switch to Java 1.5.
* [BEANUTILS-429]
  Delete trailing white spaces and white spaces on empty lines from all files.
* [BEANUTILS-427]
  Configure Checkstyle to check for trailing white spaces and white spaces on
  empty lines.

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

                        Release Notes for version 1.8.3

Compatibility with 1.8.2
========================
BeanUtils 1.8.3 is binary compatible release with Beanutils 1.8.2, containing only bug fixes.

BeanUtils 1.8.3 requires a minimum of JDK 1.3.

Memory Leak
===========
A memory leak was found in BeanUtils 1.7.0 (see BEANUTILS-291) which was fixed
in BeanUtils 1.8.0 for JDK 1.5+.

Testing of BeanUtils 1.8.1 revealed that the leak still appears to exist
in IBM's JDK 1.6 implementation.


see https://issues.apache.org/jira/browse/BEANUTILS-291
    https://issues.apache.org/jira/browse/BEANUTILS-366


BUGS FIXED:
===========

The following is a list of the bugs fixed in this release, with their Jira issue number:

  * [BEANUTILS-373] - MethodUtils is not thread safe because WeakFastHashMap which uses WeakHashMap is not thread-safe
  * [BEANUTILS-371] - Add constructors which have useColumnLabel parameter to ResultSetDynaClass and RowSetDynaClass

