$Id$


                          Commons Digester Package
                                Version 1.7
                               Release Notes


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

This is a minor bugfix and maintenance release. A few small features have been added.
New projects are encouraged to use this release of digester, but there is no urgency
for existing projects to upgrade; Digester 1.6 has proven to be a stable release.

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

IMPORTANT NOTES
===============
* The jakarta commons project has migrated to the Subversion version control system
  (previously, CVS was used). There should be no effect on users of the Digester
  library, but obviously the process of examining the latest source code, and of
  creating patches for Digester has now changed. Please see the jakarta commons
  website for details (http://jakarta.apache.org/commons).

Dependencies
=============
Release 1.7 has the same dependencies as release 1.6.

Compatible Dependency Sets:
   Digester 1.7 + Logging 1.0.x + BeanUtils 1.x + Collections 2.x
   Digester 1.7 + Logging 1.0.x + BeanUtils 1.x + Collections 3.x
   Digester 1.7 + Logging 1.0.x + BeanUtils 1.7

NEW FEATURES
=============

Improved Documentation
----------------------
As usual, documentation has improved in this release. 

Minor Javadoc improvements occur in the following classes:
   Rule, RulesBase, ExtendedBaseRules,
   NodeCreateRule, CallMethodRule, CallParamRule, SetNextRule

The javadoc package documentation (package.html) has also had minor
updates to the following topics:
  * How Digester can be used as a SAX content handler.
  * How wildcard rules are ignored if non-wildcard matches
    are available.

Digester
--------
Named stacks are now cleared by the clear() method. Note that it is recommended
that a new Digester instance be created for each document parsed, hence this
should not be necessary.

Method resetRoot has been added. Again, this should only be relevant for programs
that attempt to reuse a single Digester instance to process multiple documents
(which is not recommended).

Method peek(String stackname, int n) has been added for consistency, to allow
access to arbitrary objects on named stacks. Thanks to Brian Hanafee for the
suggestion (bugzilla #33873).

Method setCustomContentHandler/getCustomContentHandler have been added so
rule classes can redirect SAX events without setting the parser's
contentHandler method during a parse. This new feature was then used to
resolve bug#34819.
     
SetNestedPropertiesRule
------------------------
The toString method has been improved, for better logging diagnostics.
Patch provided by Wendy Smoak.

The addressbook sample now demonstrates use of SetNestedPropertiesRule.

SetPropertiesRule
-----------------
A new ignoreMissingProperty flag can be set false to cause
an exception to be generated when the xml contains an
attribute not available on the target bean. Patch contributed
by Gabriele Carcassi.

Xmlrules Enhancements
----------------------
The xmlrules module has had a number of minor updates to provide access
to functionality that was previously accessable only via the digester
API:
     -- add set-nested-properties-rule tag. Much of this
        patch provided by Wendy Smoak.

     -- add targetoffset attribute to call-method-rule tag,
        to allow the target object whose method is invoked
	to be any object on the digester stack. Patch by
	Wendy Smoak (bugzilla #33550).

     -- add stack-index attribute to call-param-rule tag,
        to allow passing any object on the digester stack
	as a parameter to a target method. Patch by
	Kris Nuttycombe, inspired by Blake Meike.

The digester-rules.dtd file has also been slightly cleaned up to
remove unnecessary duplication.

Plugins Enhancements
--------------------
PluginCreateRule can now have an associated "factory" object for the Rules
object created at each "plugin point". This allows Rules implementations
other than RulesBase to be used with plugins. It also gives user code the
chance to set up default Rule objects within the Rules object which will
apply to all plugins. This change affects classes PluginRules,
PluginCreateRule and (new class) RulesFactory.

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

Reports Addressed
------------------
#31393 SetNestedPropertiesRule causes StackOverflowError
       -- thanks to James Pine

#28739 Problem with parse(File) on windows machines
       -- thanks to John Taylor

#34819 NodeCreateRule fails with Aelfred xml parser

Fixes without Bugzilla entries
------------------------------
* SetNestedPropertiesRule
     new SetNestedPropertiesRule("foo", null)
  was not ignoring element "foo".


DEPRECATIONS
============
None

