<!--

 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: RELEASE-NOTES.txt,v 1.6 2004/03/06 22:20:54 craigmcc Exp $

                           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 maintenance and code cleanup release,
with some new features.

The following paragraphs document changes since the previous release
(version 1.0.3).


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.

[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.


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.



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.

