1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.slf4j.helpers;
26
27 import org.slf4j.spi.MDCAdapter;
28
29 import java.util.*;
30 import java.util.Map;
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public class BasicMDCAdapter implements MDCAdapter {
45
46 private InheritableThreadLocal<Map<String, String>> inheritableThreadLocal = new InheritableThreadLocal<Map<String, String>>();
47
48 static boolean isJDK14() {
49 try {
50 String javaVersion = System.getProperty("java.version");
51 return javaVersion.startsWith("1.4");
52 } catch (SecurityException se) {
53
54 return false;
55 }
56 }
57
58 static boolean IS_JDK14 = isJDK14();
59
60
61
62
63
64
65
66
67
68
69
70
71
72 public void put(String key, String val) {
73 if (key == null) {
74 throw new IllegalArgumentException("key cannot be null");
75 }
76 Map<String, String> map = (Map<String, String>) inheritableThreadLocal.get();
77 if (map == null) {
78 map = Collections.<String, String> synchronizedMap(new HashMap<String, String>());
79 inheritableThreadLocal.set(map);
80 }
81 map.put(key, val);
82 }
83
84
85
86
87 public String get(String key) {
88 Map<String, String> Map = (Map<String, String>) inheritableThreadLocal.get();
89 if ((Map != null) && (key != null)) {
90 return (String) Map.get(key);
91 } else {
92 return null;
93 }
94 }
95
96
97
98
99 public void remove(String key) {
100 Map<String, String> map = (Map<String, String>) inheritableThreadLocal.get();
101 if (map != null) {
102 map.remove(key);
103 }
104 }
105
106
107
108
109 public void clear() {
110 Map<String, String> map = (Map<String, String>) inheritableThreadLocal.get();
111 if (map != null) {
112 map.clear();
113
114
115 if (isJDK14()) {
116 inheritableThreadLocal.set(null);
117 } else {
118 inheritableThreadLocal.remove();
119 }
120 }
121 }
122
123
124
125
126
127
128
129 public Set<String> getKeys() {
130 Map<String, String> map = (Map<String, String>) inheritableThreadLocal.get();
131 if (map != null) {
132 return map.keySet();
133 } else {
134 return null;
135 }
136 }
137
138
139
140
141
142
143 public Map<String, String> getCopyOfContextMap() {
144 Map<String, String> oldMap = (Map<String, String>) inheritableThreadLocal.get();
145 if (oldMap != null) {
146 Map<String, String> newMap = Collections.<String, String> synchronizedMap(new HashMap<String, String>());
147 synchronized (oldMap) {
148 newMap.putAll(oldMap);
149 }
150 return newMap;
151 } else {
152 return null;
153 }
154 }
155
156 public void setContextMap(Map<String, String> contextMap) {
157 Map<String, String> map = Collections.<String, String> synchronizedMap(new HashMap<String, String>(contextMap));
158 inheritableThreadLocal.set(map);
159 }
160
161 }