LOG4J2-1349 let DefaultThreadContextMap implement the ContextData interface. This results in a much more efficiently performing implementation of the new ContextDataInjector::rawContextData() method introduced in LOG4J2-1010.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/def057ff Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/def057ff Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/def057ff Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext Commit: def057ff0bab9054a80cfee9d7b408c28fe6a4bd Parents: 1600bb2 Author: rpopma <[email protected]> Authored: Mon Aug 29 00:32:39 2016 +0900 Committer: rpopma <[email protected]> Committed: Mon Aug 29 00:32:39 2016 +0900 ---------------------------------------------------------------------- .../log4j/spi/DefaultThreadContextMap.java | 44 +++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/def057ff/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 b659c19..0bd100c 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 @@ -20,7 +20,9 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.apache.logging.log4j.util.BiConsumer; import org.apache.logging.log4j.util.PropertiesUtil; +import org.apache.logging.log4j.util.TriConsumer; /** * The actual ThreadContext Map. A new ThreadContext Map is created each time it is updated and the Map stored is always @@ -28,7 +30,7 @@ import org.apache.logging.log4j.util.PropertiesUtil; * expected that the Map will be passed to many more log events than the number of keys it contains the performance * should be much better than if the Map was copied for each event. */ -public class DefaultThreadContextMap implements ThreadContextMap2 { +public class DefaultThreadContextMap implements ThreadContextMap2, ContextData { /** * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain @@ -113,12 +115,46 @@ public class DefaultThreadContextMap implements ThreadContextMap2 { } @Override + public Map<String, String> asMap() { + return getCopy(); + } + + @Override public boolean containsKey(final String key) { final Map<String, String> map = localMap.get(); return map != null && map.containsKey(key); } @Override + public <V> void forEach(final BiConsumer<String, ? super V> action) { + final Map<String, String> map = localMap.get(); + if (map == null) { + return; + } + for (Map.Entry<String, String> entry : map.entrySet()) { + action.accept(entry.getKey(), (V) entry.getValue()); + } + } + + @Override + public <V, S> void forEach(final TriConsumer<String, ? super V, S> action, final S state) { + final Map<String, String> map = localMap.get(); + if (map == null) { + return; + } + for (Map.Entry<String, String> entry : map.entrySet()) { + action.accept(entry.getKey(), (V) entry.getValue(), state); + } + } + + @SuppressWarnings("unchecked") + @Override + public <V> V getValue(final String key) { + final Map<String, String> map = localMap.get(); + return (V) (map == null ? null : map.get(key)); + } + + @Override public Map<String, String> getCopy() { final Map<String, String> map = localMap.get(); return map == null ? new HashMap<String, String>() : new HashMap<>(map); @@ -136,6 +172,12 @@ public class DefaultThreadContextMap implements ThreadContextMap2 { } @Override + public int size() { + final Map<String, String> map = localMap.get(); + return map == null ? 0 : map.size(); + } + + @Override public String toString() { final Map<String, String> map = localMap.get(); return map == null ? "{}" : map.toString();
