<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
 <properties>
  <title>2.3 Release Notes</title>
  <author email="dev@commons.apache.org">Commons Documentation Team</author>
 </properties>
<body>

<section name="Lang 2.3 Release Notes">
<p>
These are the release notes and advice for upgrading Commons-Lang from
version 2.2 to version 2.3.
<source>
INTRODUCTION:

This document contains the release notes for the 2.3 version of Apache 
Jakarta Commons Lang.
Commons Lang is a set of utility functions and reusable components that
should be of use in any Java environment.

INCOMPATIBLE CHANGES WITH VERSION 2.2:

- Calling stop on a suspended StopWatch will no longer change the underlying time. 
  It's very unlikely anyone was relying on that bug as a feature.

ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:

- The Nestable interface defines the method indexOfThrowable(Class).
Previously the implementations checked only for a specific Class.
Now they check for subclasses of that Class as well.
For most situations this will be the expected behavior (i.e. it's a bug fix).
If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
However, we don't recommend that as a long-term solution.)

- The StopWatch class has had much extra validation added.
If your code previously relied on unusual aspects, it may no longer work.

- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
junit.jar to ANT_HOME/lib. You can get JUnit from https://www.junit.org. See the developer's guide
for more details.

DEPRECATIONS FROM 2.2 to 2.3:

- None

DEPRECATIONS FROM 2.1 to 2.2:

- None

DEPRECATIONS FROM 2.0 to 2.1:

- The enum package has been renamed to enums for JDK 1.5 compliance.
All functionality is identical, just the package has changed.
This package will be removed in v3.0.

- NumberUtils.stringToInt - renamed to toInt

- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
as int not long. The replacements are MILLIS_PER_*. 


BUG FIXES IN 2.3:

    * [LANG-69 ] - ToStringBuilder throws StackOverflowError when an Object cycle exists
    * [LANG-102] - Refactor Entities methods
    * [LANG-153] - Can't XMLDecode an Enum
    * [LANG-262] - Use of enum prevents a classloader from being garbage collected resulting in out of memory exceptions.
    * [LANG-279] - HashCodeBuilder throws java.lang.StackOverflowError when an object contains a cycle.
    * [LANG-281] - DurationFormatUtils returns wrong result
    * [LANG-286] - Serialization - not backwards compatible
    * [LANG-292] - unescapeXml("&amp;12345678;") should be "&amp;12345678;"
    * [LANG-294] - StrBuilder.replaceAll and StrBuilder.deleteAll can throw ArrayIndexOutOfBoundsException.
    * [LANG-295] - StrBuilder contains usages of thisBuf.length when they should use size
    * [LANG-299] - Bug in method appendFixedWidthPadRight of class StrBuilder causes an ArrayIndexOutOfBoundsException
    * [LANG-300] - NumberUtils.createNumber throws NumberFormatException for one digit long
    * [LANG-303] - FastDateFormat.mRules is not transient or serializable
    * [LANG-304] - NullPointerException in isAvailableLocale(Locale)
    * [LANG-313] - Wrong behavior of Entities.unescape
    * [LANG-315] - StopWatch: suspend() acts as split(), if followed by stop()

IMPROVEMENTS IN 2.3:

    * [LANG-258] - Enum Javadoc
    * [LANG-266] - Wish for StringUtils.join(Collection, *)
    * [LANG-268] - StringUtils.join should allow you to pass a range for it (so it only joins a part of the array)
    * [LANG-275] - StringUtils substringsBetween
    * [LANG-282] - Create more tests to test out the +=31 replacement code in DurationFormatUtils.
    * [LANG-287] - Optimize StringEscapeUtils.unescapeXml(String)
    * [LANG-289] - NumberUtils.max(byte[]) and NumberUtils.min(byte[]) are missing
    * [LANG-291] - Null-safe comparison methods for finding most recent / least recent dates.
    * [LANG-306] - StrBuilder appendln/appendAll/appendSeparator
    * [LANG-310] - BooleanUtils isNotTrue/isNotFalse
    * [LANG-314] - Tests fail to pass when building with Maven 2

</source>
</p>
</section>

</body>
</document>
