1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.spi;
18
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.Map;
22
23
24
25
26
27
28
29 public class DefaultThreadContextMap implements ThreadContextMap {
30
31 private final boolean useMap;
32
33 private final ThreadLocal<Map<String, String>> localMap =
34 new InheritableThreadLocal<Map<String, String>>() {
35 @Override
36 protected Map<String, String> childValue(final Map<String, String> parentValue) {
37 return parentValue == null || !useMap ? null :
38 Collections.unmodifiableMap(new HashMap<String, String>(parentValue));
39 }
40 };
41
42 public DefaultThreadContextMap(final boolean useMap) {
43 this.useMap = useMap;
44 }
45
46
47
48
49
50
51
52
53
54
55
56 @Override
57 public void put(final String key, final String value) {
58 if (!useMap) {
59 return;
60 }
61 Map<String, String> map = localMap.get();
62 map = map == null ? new HashMap<String, String>() : new HashMap<String, String>(map);
63 map.put(key, value);
64 localMap.set(Collections.unmodifiableMap(map));
65 }
66
67
68
69
70
71
72
73
74 @Override
75 public String get(final String key) {
76 final Map<String, String> map = localMap.get();
77 return map == null ? null : map.get(key);
78 }
79
80
81
82
83
84
85 @Override
86 public void remove(final String key) {
87 final Map<String, String> map = localMap.get();
88 if (map != null) {
89 final Map<String, String> copy = new HashMap<String, String>(map);
90 copy.remove(key);
91 localMap.set(Collections.unmodifiableMap(copy));
92 }
93 }
94
95
96
97
98 @Override
99 public void clear() {
100 localMap.remove();
101 }
102
103
104
105
106
107
108 @Override
109 public boolean containsKey(final String key) {
110 final Map<String, String> map = localMap.get();
111 return map != null && map.containsKey(key);
112 }
113
114
115
116
117
118 @Override
119 public Map<String, String> getCopy() {
120 final Map<String, String> map = localMap.get();
121 return map == null ? new HashMap<String, String>() : new HashMap<String, String>(map);
122 }
123
124
125
126
127
128 @Override
129 public Map<String, String> getImmutableMapOrNull() {
130 return localMap.get();
131 }
132
133
134
135
136
137 @Override
138 public boolean isEmpty() {
139 final Map<String, String> map = localMap.get();
140 return map == null || map.size() == 0;
141 }
142 }