[logback-dev] svn commit: r2083 - in logback/trunk/logback-classic/src: main/java/org/slf4j/impl test/java/ch/qos/logback/classic

noreply.ceki at qos.ch noreply.ceki at qos.ch
Thu Dec 18 14:22:04 CET 2008


Author: ceki
Date: Thu Dec 18 14:22:04 2008
New Revision: 2083

Modified:
   logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
   logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java

Log:
Fixed LBCLASSIC-98 (NPE thrown when calling setContextMap on a fresh MDC)


Modified: logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java	(original)
+++ logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java	Thu Dec 18 14:22:04 2008
@@ -10,12 +10,9 @@
  * A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument
  * for distinguishing interleaved log output from different sources. Log output
  * is typically interleaved when a server handles multiple clients
- * near-simultaneously.
- * <p>
- * <b><em>The MDC is managed on a per thread basis</em></b>. A child thread
- * automatically inherits a <em>copy</em> of the mapped diagnostic context of
- * its parent.
- * <p>
+ * near-simultaneously. <p> <b><em>The MDC is managed on a per thread basis</em></b>.
+ * A child thread automatically inherits a <em>copy</em> of the mapped
+ * diagnostic context of its parent. <p>
  * 
  * For more information about MDC, please refer to the online manual at
  * http://logback.qos.ch/manual/mdc.html
@@ -24,7 +21,8 @@
  */
 public class LogbackMDCAdapter implements MDCAdapter {
 
-  //final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new CopyOnInheritThreadLocal();
+  // final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new
+  // CopyOnInheritThreadLocal();
 
   final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new CopyOnInheritThreadLocal();
 
@@ -36,13 +34,11 @@
    * the <code>key</code> parameter into the current thread's context map.
    * Note that contrary to log4j, the <code>val</code> parameter can be null.
    * 
-   * <p>
-   * If the current thread does not have a context map it is created as a side
-   * effect of this call.
+   * <p> If the current thread does not have a context map it is created as a
+   * side effect of this call.
    * 
-   * <p>
-   * Each time a value is added, a new instance of the map is created. This is
-   * to be certain that the serialization process will operate on the updated
+   * <p> Each time a value is added, a new instance of the map is created. This
+   * is to be certain that the serialization process will operate on the updated
    * map and not send a reference to the old map, thus not allowing the remote
    * logback component to see the latest changes.
    * 
@@ -68,8 +64,7 @@
   /**
    * Get the context identified by the <code>key</code> parameter.
    * 
-   * <p>
-   * This method has no side effects.
+   * <p> This method has no side effects.
    */
   public String get(String key) {
     HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
@@ -84,11 +79,10 @@
   /**
    * Remove the the context identified by the <code>key</code> parameter.
    * 
-   * <p>
-   * Each time a value is removed, a new instance of the map is created. This is
-   * to be certain that the serialization process will operate on the updated
-   * map and not send a reference to the old map, thus not allowing the remote
-   * logback component to see the latest changes.
+   * <p> Each time a value is removed, a new instance of the map is created.
+   * This is to be certain that the serialization process will operate on the
+   * updated map and not send a reference to the old map, thus not allowing the
+   * remote logback component to see the latest changes.
    */
   public void remove(String key) {
     HashMap<String, String> oldMap = copyOnInheritThreadLocal.get();
@@ -160,7 +154,9 @@
     copyOnInheritThreadLocal.set(newMap);
 
     // hints for the garbage collector
-    oldMap.clear();
-    oldMap = null;
+    if (oldMap != null) {
+      oldMap.clear();
+      oldMap = null;
+    }
   }
 }

Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java	(original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java	Thu Dec 18 14:22:04 2008
@@ -12,7 +12,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
+import java.util.HashMap;
+
 import org.junit.Test;
+import org.slf4j.MDC;
 
 public class MDCTest {
 
@@ -37,4 +40,9 @@
 
   }
 
+  @Test
+  public void testLBCLASSIC_98() {
+    MDC.setContextMap(new HashMap<String, String>());
+  }
+  
 }


More information about the logback-dev mailing list