<!--
   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.
-->
$Id$


                          Commons Digester Package
                               Version 1.8.1
                               Release Notes


INTRODUCTION
============

This is a minor bugfix and maintenance release. Existing projects using
Digester 1.8 are encouraged to upgrade to the 1.8.1 release. New projects are
encouraged to use Digester 2.0, which requires JDK 1.5.

This release is 100% binary and source compatible with the 1.8 release.

DEPENDENCIES
=============

Digester 1.8.1 works with all sets of dependencies that worked for
Digester 1.8. Users should upgrade to the recommended dependency set below
where possible.

The Recommended Dependency Set for Digester 1.8.1 is:
   Digester 1.8.1 + Logging 1.1.1 + BeanUtils 1.8.0

Other Compatible Dependency Sets:
   Digester 1.8.1 + Logging 1.1.x + BeanUtils 1.x + Collections 2.x
   Digester 1.8.1 + Logging 1.1.x + BeanUtils 1.x + Collections 3.x

It is also possible to use Logging 1.0.x or BeanUtils 1.7.0 instead.

BUGS FROM PREVIOUS RELEASE
===========================

 * [DIGESTER-114] SetPropertyRule throws java.lang.IllegalArgumentException:
                  No name specified when matched element has no attributes.

 * [DIGESTER-117] Missing unit tests using Ant and Maven.

 * [DIGESTER-120] Digesting XML content with NodeCreateRule swallows spaces.

 * [DIGESTER-122] Potential NullPointerException if debug is enabled in
                  Digester#resolveEntity()

 * [DIGESTER-125] Clear inputSources list in method Digester.clear()

 * [DIGESTER-126] Potential NullPointerException if debug is enabled in
                  FactoryCreateRule#begin()

IMPROVEMENTS FROM PREVIOUS RELEASE
===================================

 * [DIGESTER-89]  Add jar target to Ant build.xml

 * [DIGESTER-111] Null arguments to all Digester#parse() methods now throw an
                  IllegalArgumentException.

