Author: ceki Date: Wed Oct 15 23:57:03 2008 New Revision: 1190 Added: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLoggerFactory.java Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
Log: Fixing bug 106 Essentially, loggerFactory is now momentarily set to NOPLoggerFactory while the underlying logging system auto-configures itself. http://bugzilla.slf4j.org/show_bug.cgi?id=106 Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java ============================================================================== --- slf4j/trunk/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java (original) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java Wed Oct 15 23:57:03 2008 @@ -24,6 +24,7 @@ package org.slf4j; +import org.slf4j.helpers.NOPLoggerFactory; import org.slf4j.helpers.Util; import org.slf4j.impl.StaticLoggerBinder; @@ -58,28 +59,18 @@ } static { - try { - String actualVer = StaticLoggerBinder.VERSION; - if (!EXPECTED_VERSION.equals(actualVer)) { - Util.reportFailure("The version " + actualVer - + " of your slf4j-binding differs from " + EXPECTED_VERSION - + ", the expected version."); - Util.reportFailure("See " + VERSION_MISMATCH + " for further details."); - } - } catch (java.lang.NoSuchFieldError nsfe) { - Util - .reportFailure("The version of your slf4j-binding is probably older than 1.5.4, and differs from " - + EXPECTED_VERSION + ", the expected version."); - Util.reportFailure("See " + VERSION_MISMATCH + " for further details."); - } catch (Throwable e) { - Util - .reportFailure("An unexpected problem occured while checking the version of your slf4j-binding"); - e.printStackTrace(); - } + staticInitialize(); + versionSanityCheck(); + } + private final static void staticInitialize() { try { + // support re-entrant behavior. + // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106 + loggerFactory = new NOPLoggerFactory(); loggerFactory = StaticLoggerBinder.SINGLETON.getLoggerFactory(); } catch (NoClassDefFoundError ncde) { + loggerFactory = null; // undo NOPLoggerFactory String msg = ncde.getMessage(); if (msg != null && msg.indexOf("org/slf4j/impl/StaticLoggerBinder") != -1) { Util @@ -90,12 +81,35 @@ } throw ncde; } catch (Exception e) { + loggerFactory = null; // undo NOPLoggerFactory // we should never get here Util.reportFailure("Failed to instantiate logger [" + StaticLoggerBinder.SINGLETON.getLoggerFactoryClassStr() + "]", e); } } + private final static void versionSanityCheck() { + try { + String actualVer = StaticLoggerBinder.VERSION; + if (!EXPECTED_VERSION.equals(actualVer)) { + Util.reportFailure("The version " + actualVer + + " of your slf4j-binding differs from " + EXPECTED_VERSION + + ", the expected version."); + Util.reportFailure("See " + VERSION_MISMATCH + " for further details."); + } + } catch (java.lang.NoSuchFieldError nsfe) { + Util + .reportFailure("The version of your slf4j-binding is probably older than 1.5.4, and differs from " + + EXPECTED_VERSION + ", the expected version."); + Util.reportFailure("See " + VERSION_MISMATCH + " for further details."); + } catch (Throwable e) { + Util + .reportFailure("An unexpected problem occured while checking the version of your slf4j-binding"); + e.printStackTrace(); + } + } + + /** * Return a logger named according to the name parameter using the statically * bound [EMAIL PROTECTED] ILoggerFactory} instance. Added: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLoggerFactory.java ============================================================================== --- (empty file) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLoggerFactory.java Wed Oct 15 23:57:03 2008 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.helpers; + +import org.slf4j.ILoggerFactory; +import org.slf4j.Logger; +import org.slf4j.helpers.NOPLogger; + + +/** + * NOPLoggerFactory is an trivial implementation of [EMAIL PROTECTED] + * ILoggerFactory} which always returns the unique instance of + * NOPLogger. + * + * @author Ceki Gülcü + */ +public class NOPLoggerFactory implements ILoggerFactory { + + public NOPLoggerFactory() { + // nothing to do + } + + public Logger getLogger(String name) { + return NOPLogger.NOP_LOGGER; + } + +} _______________________________________________ dev mailing list dev@slf4j.org http://www.slf4j.org/mailman/listinfo/dev