<!--

 Copyright 2001-2004 The Apache Software Foundation.
 
 Licensed 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 Logging Package
                                Version 1.0.4
                                Release Notes


INTRODUCTION:
============

This document contains the release notes for this version of the Commons
Logging package.  It is primarily a service release for downstream users.
The main emphasis maintenance and code cleanup release,
with some new features including support for both the old 1.2.x series
of Log4J releases and the new 1.3.x series of releases.

The following paragraphs document changes since the previous release
(version 1.0.3). The documentation (userguide and javadoc) 
has also been improved.


NEW FEATURES:
============

[ALL FILES]        This version of Commons Logging is released under the
                   Apache License (Version 2.0).  All source files have been
                   modified to reflect this.

[maven.xml]        Added beginnings of a Maven-based build, primarily for the
                   purpose of creating documentation consistent with Mavenized
                   commons projects.  The official build system for the software
                   is still the Ant "build.xml" file.

[AvalonLogger]     Added AvalonLogger, which wraps the logger used by the
                   Avalon framework.  As with other implementations, this
                   is compiled only if the appropriate dependencies are
                   satisfied. This implementation is *NOT* Serializable

[Jdk13LumberjackLogger]
                   Added Jdk13LumberjackLogger, which wraps the implementation
                   of the JSR-47 logging APIs (for JDKs before 1.4) provided
                   by the SourceForge "lumberjack" project.
                   <http://sourceforge.net/projects/lumberjack/>

[LogFactoryImpl]   If an InvocationTargetException is returned during the
                   creation of a new Log instance, unwrap the underlying
                   cause and pass it in to the LogConfigurationException
                   constructor.  This will make the actual cause of the
                   problem easier to diagnose.

[LogFactoryImpl]   If the isAssignableFrom() test fails because there is more
                   than one instance of org.apache.commons.logging.Log visible
                   in the class loader hierarchy, make the exception message
                   that is reported explicitly state this, rather than the
                   potentially misleading claim that an implementation class
                   does not implement Log.

[Log4JLogger]      Changes to allow this logger to support both the existing 1.2.x 
                   series of releases and also the upcoming 1.3.x series of Log4J
                   releases.

[SimpleLog]        Added support for setting date-time format.

BUG FIXES:
=========

[MANIFEST.MF]      Remove reference to Log4J from the manifest classpath.

[LogConfigurationException]
                   Include root cause in the text of the message, if present.

[LogFactory]       Improve usability of error messages reporting
                   configuration problems.

[JDK14Logger]      Implement Serializable, remove "final" declaration for
                   easy subclassing.

[Log4JLogger]      Implement Serializable, remove "final" declaration for
                   easy subclassing.

[NoOpLogger]       Implement Serializable, remove "final" declaration for
                   easy subclassing.

[SimpleLog]        Make SimpleLog more friendly to the security manager
                   in an applet environment, by swallowing any security
                   exceptions when looking up system properties that are
                   not accessible.

[AvalonLogger]     Fix NullPointerException when it when providing a
                   default logger.


DEPRECATIONS:
============

    (These are carried forward from Version 1.0.3)

[LogSource]        Previously deprecated, replaced by LogFactory.

[Log4jFactory]     A proxy instance of this class was transparently created
                   when Log4J logging was selected, yet it serves no useful
                   purpose.  The class is now deprecated, and the proxy
                   instance is no longer created.

[Log4JCategoryLog] This class has been replaced by Log4JLogger, which
                   corresponds to the availability of the new Logger class
                   in Log4J 1.2 and later.

