Skip to content

Commit 09d129d

Browse files
committed
feat(#461):add support for peekByKey in MDCAdapter
Signed-off-by: youjie23 <[email protected]>
1 parent 183aaa5 commit 09d129d

File tree

5 files changed

+73
-30
lines changed

5 files changed

+73
-30
lines changed

slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* @author Ceki Gulcu
3939
* @author Maarten Bosteels
4040
* @author Lukasz Cwik
41-
*
41+
*
4242
* @since 1.5.0
4343
*/
4444
public class BasicMDCAdapter implements MDCAdapter {
@@ -156,9 +156,14 @@ public void pushByKey(String key, String value) {
156156

157157
@Override
158158
public String popByKey(String key) {
159-
return threadLocalMapOfDeques.popByKey(key);
159+
return threadLocalMapOfDeques.popByKey(key);
160160
}
161161

162+
@Override
163+
public String peekByKey(String key) {
164+
return threadLocalMapOfDeques.peekByKey(key);
165+
}
166+
162167
@Override
163168
public Deque<String> getCopyOfDequeByKey(String key) {
164169
return threadLocalMapOfDeques.getCopyOfDequeByKey(key);

slf4j-api/src/main/java/org/slf4j/helpers/ThreadLocalMapOfStacks.java

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/**
1010
* A simple implementation of ThreadLocal backed Map containing values of type
1111
* Deque<String>.
12-
*
12+
*
1313
* @author Ceki Guuml;c&uuml;
1414
* @since 2.0.0
1515
*/
@@ -40,50 +40,53 @@ public void pushByKey(String key, String value) {
4040
}
4141

4242
public String popByKey(String key) {
43-
if (key == null)
43+
Deque<String> deque = getDeque(key);
44+
if (deque == null)
4445
return null;
4546

46-
Map<String, Deque<String>> map = tlMapOfStacks.get();
47-
if (map == null)
48-
return null;
49-
Deque<String> deque = map.get(key);
47+
return deque.pop();
48+
}
49+
50+
public String peekByKey(String key) {
51+
Deque<String> deque = getDeque(key);
5052
if (deque == null)
5153
return null;
52-
return deque.pop();
54+
55+
return deque.peek();
5356
}
5457

5558
public Deque<String> getCopyOfDequeByKey(String key) {
59+
Deque<String> deque = getDeque(key);
60+
if (deque == null)
61+
return null;
62+
63+
return new ArrayDeque<String>(deque);
64+
}
65+
66+
private Deque<String> getDeque(String key) {
5667
if (key == null)
5768
return null;
5869

5970
Map<String, Deque<String>> map = tlMapOfStacks.get();
6071
if (map == null)
6172
return null;
62-
Deque<String> deque = map.get(key);
63-
if (deque == null)
64-
return null;
6573

66-
return new ArrayDeque<String>(deque);
74+
return map.get(key);
6775
}
68-
76+
6977
/**
70-
* Clear the deque(stack) referenced by 'key'.
71-
*
78+
* Clear the deque(stack) referenced by 'key'.
79+
*
7280
* @param key identifies the stack
73-
*
81+
*
7482
* @since 2.0.0
7583
*/
7684
public void clearDequeByKey(String key) {
77-
if (key == null)
78-
return;
79-
80-
Map<String, Deque<String>> map = tlMapOfStacks.get();
81-
if (map == null)
82-
return;
83-
Deque<String> deque = map.get(key);
85+
Deque<String> deque = getDeque(key);
8486
if (deque == null)
8587
return;
88+
8689
deque.clear();
8790
}
8891

89-
}
92+
}

slf4j-api/src/main/java/org/slf4j/spi/MDCAdapter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ public interface MDCAdapter {
110110
*/
111111
public String popByKey(String key);
112112

113+
/**
114+
* peek the stack referenced by 'key' and return the value possibly null.
115+
*
116+
* @param key identifies the deque(stack)
117+
* @return the value just peeked. May be null/
118+
* @since 2.0.18
119+
*/
120+
default public String peekByKey(String key){
121+
Deque<String> deque = getCopyOfDequeByKey(key);
122+
if(deque == null)
123+
return null;
124+
return deque.peek();
125+
}
113126
/**
114127
* Returns a copy of the deque(stack) referenced by 'key'. May be null.
115128
*

slf4j-api/src/test/java/org/slf4j/helpers/MDCAdapterTestBase.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,16 @@
2424

2525
package org.slf4j.helpers;
2626

27-
import static org.junit.Assert.assertEquals;
28-
import static org.junit.Assert.assertFalse;
29-
import static org.junit.Assert.assertNull;
30-
import static org.junit.Assert.fail;
31-
3227
import java.lang.Thread.UncaughtExceptionHandler;
3328
import java.util.Map;
29+
import java.util.NoSuchElementException;
3430

3531
import org.junit.After;
3632
import org.junit.Test;
3733
import org.slf4j.spi.MDCAdapter;
3834

35+
import static org.junit.Assert.*;
36+
3937
/**
4038
* Tests for {@link BasicMDCAdapter}
4139
*
@@ -64,6 +62,25 @@ public void testSettingAndGettingWithMDC() {
6462
assertEquals(mdc.get("testKey"), "testValue");
6563
}
6664

65+
@Test
66+
public void testPushingAndPoppingWithMDC() {
67+
assertNull(mdc.popByKey("testKey"));
68+
mdc.pushByKey("testKey", "testValue");
69+
mdc.pushByKey("testKey", "differentTestValue");
70+
assertEquals(mdc.popByKey("testKey"), "differentTestValue");
71+
assertEquals(mdc.popByKey("testKey"), "testValue");
72+
assertThrows(NoSuchElementException.class, () -> mdc.popByKey("testKey"));
73+
}
74+
75+
@Test
76+
public void testPushingAndPeekingWithMDC() {
77+
assertNull(mdc.peekByKey("testKey"));
78+
mdc.pushByKey("testKey", "testValue");
79+
mdc.pushByKey("testKey", "differentTestValue");
80+
assertEquals(mdc.peekByKey("testKey"), "differentTestValue");
81+
assertEquals(mdc.peekByKey("testKey"), "differentTestValue");
82+
}
83+
6784
@Test
6885
public void testOverwritingAKeyInMDC() {
6986
assertNull(mdc.get("testKey"));

slf4j-reload4j/src/main/java/org/slf4j/reload4j/Reload4jMDCAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ public String popByKey(String key) {
114114
return threadLocalMapOfDeques.popByKey(key);
115115
}
116116

117+
@Override
118+
public String peekByKey(String key) {
119+
return threadLocalMapOfDeques.peekByKey(key);
120+
}
121+
117122
@Override
118123
public Deque<String> getCopyOfDequeByKey(String key) {
119124
return threadLocalMapOfDeques.getCopyOfDequeByKey(key);

0 commit comments

Comments
 (0)