<?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>Upgrade from 2.0 to 2.1</title>
  <author email="dev@commons.apache.org">Commons Documentation Team</author>
 </properties>
<body>

<section name="Upgrade">
<p>
These are the release notes and advice for upgrading Commons-Lang from
version 2.0 to version 2.1.
<source>
INTRODUCTION:

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

- 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 behaviour (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:

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


NEW FEATURES:

New:
- Mutable package - contains basic classes that hold an Object or primitive
and provide both get and set methods.
- DurationFormatUtils - provides various methods for formatting durations
- CharEncoding - definitions of constants for character encoding work
- CharUtils - utilities for working with characters

Updated:
- ArrayUtils - many more methods, especially List-like methods
- BooleanUtils - isTrue and isFalse methods that handle null
- ClassUtils - primitive to wrapper class conversion methods
- ClassUtils - class name comparator
- IllegalClassException - extra constructor for common instanceof case
- NotImplementedException - supports nested exceptions
- ObjectUtils - hashcode method handling null
- StringUtils - isAsciiPrintable to check the contents of a string
             -- ordinalIndexOf to find the nth index of a string
             -- various remove methods to remove parts of a string
             -- various split methods to provide more control over splitting a string
             -- defaultIfEmpty to default a string if null or empty
- SystemUtils - methods to get system properties as File objects
             -- extra constants representing system properties
- Validate - new methods to check whether all elements in a collection are of a specific type
- WordUtils - new methods to capitalize based on a set of specified delimiters

- EqualsBuilder - now provides setter to internal state
- ToStringStyle - new style, short prefix style
- ReflectionToStringBuilder - more flags to control the output with regards to statics

- ExceptionUtils - added indexOfType methods that check subclasses, thus leaving the existing
indexOfThrowable method untouched (see incompatible changes section)

- NumberUtils - various string to number parsing methods added

- DateUtils - methods added to compare dates in various ways
           -- method to parse a date string using multiple patterns
- FastDateFormat - extra formatting methods that take in a millisecond long value
                -- additional static factory methods
- StopWatch - new methods for split behaviour


BUG FIXES:

19331  General case: infinite loop: ToStringBuilder.reflectionToString
23174  EqualsBuilder.append(Object[], Object[]) throws NPE
23356  Make DurationFormatUtils public!
23557  WordUtils.capitalizeFully(String str) should take a delimiters
23683  New method for converting a primitive Class to its corresponding wrapper
23430  Minor javadoc fixes for StringUtils.contains(String, String)
23590  make optional parameters in FastDateFormat really optional
24056  Documentation error in StringUtils.replace
25227  StringEscapeUtils.unescapeHtml() doesn't handle hex entities
25454  new StringUtils.replaceChars behaves differently from old Ch
25560  DateUtils.truncate() is off by one hour when using a date in DST switch 'zone'
25627  DateUtils constants should be long
25683  Add method that validates Collection elements are a correct
25849  Add SystemUtils methods for directory properties.
26616  ClassCastException in Enum.equals(Object)
26699  Tokenizer Enhancements: reset input string, static CSV
26734  NullPointerException in EqualsBuilder.append(Object[], Object[])
26877  Add SystemUtils.AWT_TOOLKIT and others.
26922  public static boolean DateUtils.equals(Date dt1, Date dt2)
27592  WordUtils capitalize improvement
27876  ReflectionToStringBuilder.toString(null) throws exception by design
27877  Make ClassUtils methods null-safe and not throw an IAE.
28468  StringUtils.defaultString: Documentation error
28554  Add hashCode-support to class ObjectUtils
29082  Enhancement of ExceptionUtils.CAUSE_METHOD_NAMES
29149  StringEscapeUtils.unescapeHtml() doesn't handle an empty entity
29294  lang.math.Fraction class deficiencies
29673  ExceptionUtils: new getCause() methodname (for tomcat)
29794  Add convenience format(long) methods to FastDateForma
30328  HashCodeBuilder does not use the same values as Boolean (fixed as documentation)
30334  New class proposal: CharacterEncoding
30674  parseDate class from HttpClient's DateParser class
30815  ArrayUtils.isEquals() throws ClassCastException when array1
30929  Nestable.indexOfThrowable(Class)  uses Class.equals() to match
31395  DateUtils.truncate oddity at the far end of the Date spectrum
31478  Compile error with JDK 5 "enum" is a keyword
31572  o.a.c.lang.enum.ValuedEnum: 'enum'is a keyword in JDK1.5.0
31933  ToStringStyle setArrayEnd handled null incorrectly
32133  SystemUtils fails init on HP-UX
32198  Error in JavaDoc for StringUtils.chomp(String, String)
32625  Can't subclass EqualsBuilder because isEquals is private
33067  EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
33069  EqualsBuilder.append(Object[], Object[]) incorrectly checks that rhs[i] is instance of lhs[i]'s class
33574  unbalanced ReflectionToStringBuilder
33737  ExceptionUtils.addCauseMethodName(String) does not check for duplicates.
</source>
</p>
</section>

</body>
</document>
