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.

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

                        Commons Lang Package
                            Version 2.2
                           Release Notes


INTRODUCTION:

This document contains the release notes for the 2.2 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.1:

- None

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 (ie. its 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 http://www.junit.org. See the developer's guide
for more details.

DEPRECATIONS FROM 2.1 to 2.2:

- None

DEPRECATIONS FROM 2.0 to 2.1:

- The enum package has been renamed to enums for JDK1.5 compilance.
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.2:

LANG-2    javadoc example for StringUtils.splitByWholeSeparator incorrect
LANG-3    PADDING array in StringUtils overflows on '\uffff'
LANG-10   [patch] ClassUtils.primitiveToWrapper and Void
LANG-21   escapeXML() -> Not escaping low characters
LANG-25   DurationFormatUtils.formatDurationISO() javadoc is missing T in duration string between date and time part
LANG-37   unit test for org.apache.commons.lang.text.StrBuilder
LANG-42   EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
LANG-45   StrBuilderTest#testReplaceStringString fails.
LANG-50   Replace Clover with Cobertura
LANG-59   DateUtils.truncate method is buggy when dealing with DST switching hours
LANG-100  RandomStringUtils.random() family of methods create invalid unicode sequences
LANG-105  ExceptionUtils goes into infinite loop in getThrowables is throwable.getCause() == throwable
LANG-106  StringUtils#getLevenshteinDistance() performance is sub-optimal
LANG-112  Wrong length check in StrTokenizer.StringMatcher
LANG-117  FastDateFormat: wrong format for date "01.01.1000"
LANG-122  EscapeUtil.escapeHtml() should clarify that it does not escape ' chars to &apos;
LANG-123  Unclear javadoc for DateUtils.iterator()
LANG-127  Minor tweak to fix of bug # 26616
LANG-130  Memory "leak" in StringUtils
LANG-140  DurationFormatUtils.formatPeriod() returns the wrong result
LANG-141  Fraction.toProperString() returns -1/1 for -1
LANG-148  Performance modifications on StringUtils.replace
LANG-150  StringEscapeUtils.unescapeHtml skips first entity after standalone ampersand
LANG-152  DurationFormatUtils.formatDurationWords "11 <unit>s" gets converted to "11 <unit>"
LANG-259  ValuedEnum.compareTo(Object other) not typesafe - it easily could be...
LANG-261  Error in an example in the javadoc of the StringUtils.splitPreserveAllTokens() method
LANG-264  ToStringBuilder/HashCodeBuilder javadoc code examples
LANG-271  LocaleUtils test fails under Mustang
LANG-272  Minor build and checkstyle changes
LANG-277  Javadoc errors on StringUtils.splitPreserveAllTokens(String, char)
LANG-278  javadoc for StringUtils.removeEnd is incorrect

IMPROVEMENTS IN 2.2:

LANG-159  Add WordUtils.getInitials(String)
LANG-161  Add methods and tests to StrBuilder
LANG-162  replace() length calculation improvement
LANG-165  parseDate with TimeZone
LANG-166  New interpolation features
LANG-169  Implementation of escape/unescapeHtml methods with Writer
LANG-176  CompareToBuilder excludeFields for reflection method
LANG-186  Request for MutableBoolean implementation
LANG-194  add generic add method to DateUtils
LANG-198  New method for EqualsBuilder
LANG-212  New ExceptionUtils method setCause()
LANG-216  Provides a Class.getPublicMethod which returns public invocable Method
LANG-217  Add Mutable<Type> to<Type>() methods.
LANG-220  Tokenizer Enhancements: reset input string, static CSV/TSV factories
LANG-226  Using ReflectionToStringBuilder and excluding secure fields
LANG-242  Trivial cleanup of javadoc in various files
LANG-246  CompositeFormat
LANG-250  Performance boost for RandomStringUtils
LANG-254  Enhanced Class.forName version
LANG-260  StringEscapeUtils should expose escape*() methods taking Writer argument
LANG-263  Add StringUtils.containsIgnoreCase(...)
LANG-267  Support char array converters on ArrayUtils
LANG-270  minor javadoc improvements for StringUtils.stripXxx() methods
          New ExceptionUtils methods getMessage/getRootCauseMessage

