Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1685 028ae4b45 -> 6123dc6fa


LOG4J2-1679 Add ThreadContextMap3 interface supporting method 
removeAll(Iterable<String>)


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/922e4829
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/922e4829
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/922e4829

Branch: refs/heads/LOG4J2-1685
Commit: 922e4829f28ca9279e4c8971d1c89d7ba71d40ca
Parents: abf29af
Author: Mikael StÃ¥ldal <[email protected]>
Authored: Fri Nov 11 15:14:45 2016 +0100
Committer: Mikael StÃ¥ldal <[email protected]>
Committed: Fri Nov 11 15:14:45 2016 +0100

----------------------------------------------------------------------
 .../org/apache/logging/log4j/ThreadContext.java | 20 ++++++++++
 .../CopyOnWriteSortedArrayThreadContextMap.java | 13 +++++++
 .../log4j/spi/DefaultThreadContextMap.java      | 11 ++++++
 .../GarbageFreeSortedArrayThreadContextMap.java | 10 +++++
 .../log4j/spi/ObjectThreadContextMap.java       |  4 +-
 .../logging/log4j/spi/ThreadContextMap2.java    |  2 +
 .../logging/log4j/spi/ThreadContextMap3.java    | 39 ++++++++++++++++++++
 .../org/apache/logging/slf4j/MDCContextMap.java | 18 ++++++---
 src/changes/changes.xml                         |  3 ++
 9 files changed, 113 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
index 5242993..4af2674 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
@@ -33,6 +33,7 @@ import org.apache.logging.log4j.spi.NoOpThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap2;
+import org.apache.logging.log4j.spi.ThreadContextMap3;
 import org.apache.logging.log4j.spi.ThreadContextMapFactory;
 import org.apache.logging.log4j.spi.ThreadContextStack;
 import org.apache.logging.log4j.status.StatusLogger;
@@ -289,6 +290,25 @@ public final class ThreadContext {
     }
 
     /**
+     * Removes the context values identified by the <code>keys</code> 
parameter.
+     *
+     * @param keys The keys to remove.
+     *
+     * @since 2.8
+     */
+    public static void removeAll(final Iterable<String> keys) {
+        if (contextMap instanceof ThreadContextMap3) {
+            ((ThreadContextMap3) contextMap).removeAll(keys);
+        } else if (contextMap instanceof DefaultThreadContextMap) {
+            ((DefaultThreadContextMap) contextMap).removeAll(keys);
+        } else {
+            for (final String key : keys) {
+                contextMap.remove(key);
+            }
+        }
+    }
+
+    /**
      * Clears the context map.
      */
     public static void clearMap() {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
index 3b91dbb..7b70e55 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
@@ -156,6 +156,19 @@ class CopyOnWriteSortedArrayThreadContextMap implements 
ReadOnlyThreadContextMap
     }
 
     @Override
+    public void removeAll(Iterable<String> keys) {
+        final StringMap map = localMap.get();
+        if (map != null) {
+            final StringMap copy = createStringMap(map);
+            for (final String key : keys) {
+                copy.remove(key);
+            }
+            copy.freeze();
+            localMap.set(copy);
+        }
+    }
+
+    @Override
     public void clear() {
         localMap.remove();
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
index 4a016be..fbf21d9 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
@@ -109,6 +109,17 @@ public class DefaultThreadContextMap implements 
ThreadContextMap, ReadOnlyString
         }
     }
 
+    public void removeAll(Iterable<String> keys) {
+        final Map<String, String> map = localMap.get();
+        if (map != null) {
+            final Map<String, String> copy = new HashMap<>(map);
+            for (final String key : keys) {
+                copy.remove(key);
+            }
+            localMap.set(Collections.unmodifiableMap(copy));
+        }
+    }
+
     @Override
     public void clear() {
         localMap.remove();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
index 7113d9f..3eadb2c 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
@@ -150,6 +150,16 @@ class GarbageFreeSortedArrayThreadContextMap implements 
ReadOnlyThreadContextMap
     }
 
     @Override
+    public void removeAll(Iterable<String> keys) {
+        final StringMap map = localMap.get();
+        if (map != null) {
+            for (final String key : keys) {
+                map.remove(key);
+            }
+        }
+    }
+
+    @Override
     public void clear() {
         final StringMap map = localMap.get();
         if (map != null) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
index a3e3715..31d6dd0 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
@@ -20,10 +20,10 @@ package org.apache.logging.log4j.spi;
  * Extension service provider interface to allow putting Object values in the
  * {@link org.apache.logging.log4j.ThreadContext}.
  *
- * @see ThreadContextMap2
+ * @see ThreadContextMap3
  * @since 2.8
  */
-public interface ObjectThreadContextMap extends ThreadContextMap2 {
+public interface ObjectThreadContextMap extends ThreadContextMap3 {
 
     /**
      * Returns the Object value for the specified key, or {@code null} if the 
specified key does not exist in this

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
index 6c07b2e..e86f3c7 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
@@ -24,6 +24,8 @@ import org.apache.logging.log4j.util.StringMap;
  * Extension service provider interface to implement additional custom MDC 
behavior for
  * {@link org.apache.logging.log4j.ThreadContext}.
  *
+ * Consider implementing {@link ThreadContextMap3} instead.
+ *
  * @see ThreadContextMap
  * @since 2.7
  */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java
new file mode 100644
index 0000000..46ac85a
--- /dev/null
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.logging.log4j.spi;
+
+/**
+ * Extension service provider interface to implement additional custom MDC 
behavior for
+ * {@link org.apache.logging.log4j.ThreadContext}.
+ *
+ * @see ThreadContextMap
+ * @since 2.8
+ */
+public interface ThreadContextMap3 extends ThreadContextMap2 {
+
+    /**
+     * Removes all given context map keys from the current thread's context 
map.
+     *
+     * <p>If the current thread does not have a context map it is
+     * created as a side effect.</p>
+
+     * @param keys The keys.
+     * @since 2.8
+     */
+    void removeAll(final Iterable<String> keys);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
----------------------------------------------------------------------
diff --git 
a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java 
b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
index f41fdb6..219323a 100644
--- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
+++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
@@ -19,15 +19,15 @@ package org.apache.logging.slf4j;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.spi.ThreadContextMap2;
+import org.apache.logging.log4j.spi.ThreadContextMap3;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
+import org.apache.logging.log4j.util.StringMap;
 import org.slf4j.MDC;
 
 /**
  * Bind the ThreadContextMap to the SLF4J MDC.
  */
-public class MDCContextMap implements ThreadContextMap2 {
+public class MDCContextMap implements ThreadContextMap3 {
 
     private static final StringMap EMPTY_CONTEXT_DATA = new 
SortedArrayStringMap(1);
     static {
@@ -41,9 +41,9 @@ public class MDCContextMap implements ThreadContextMap2 {
 
     @Override
     public void putAll(final Map<String, String> m) {
-       for (final Entry<String, String> entry : m.entrySet()) {
+        for (final Entry<String, String> entry : m.entrySet()) {
             MDC.put(entry.getKey(), entry.getValue());
-               }
+        }
     }
 
     @Override
@@ -56,6 +56,14 @@ public class MDCContextMap implements ThreadContextMap2 {
         MDC.remove(key);
     }
 
+
+    @Override
+    public void removeAll(Iterable<String> keys) {
+        for (final String key : keys) {
+            MDC.remove(key);
+        }
+    }
+
     @Override
     public void clear() {
         MDC.clear();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ec8d7f1..48c389d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.8" date="2016-MM-DD" description="GA Release 2.8">
+      <action issue="LOG4J2-1689" dev="mikes" type="fix">
+        Add ThreadContextMap3 interface supporting method 
removeAll(Iterable&lt;String&gt;).
+      </action>
       <action issue="LOG4J2-1679" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in StructuredDataFilter.
       </action>

Reply via email to