[slf4j-dev] svn commit: r1190 - in slf4j/trunk/slf4j-api/src/main/java/org/slf4j: . helpers

ceki at slf4j.org ceki at slf4j.org
Wed Oct 15 23:57:04 CEST 2008


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 {@link 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 {@link
+ * 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;
+  }
+
+}



More information about the slf4j-dev mailing list