Skip to content

Commit 46b53f6

Browse files
youjie_liyoujie23
authored andcommitted
add support for peekByKey in MDC
Signed-off-by: youjie23 <[email protected]>
1 parent 183aaa5 commit 46b53f6

File tree

5 files changed

+75
-23
lines changed

5 files changed

+75
-23
lines changed

slf4j-api/src/main/java/org/slf4j/MDC.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,20 @@ static public String popByKey(String key) {
313313
return getMDCAdapter().popByKey(key);
314314
}
315315

316+
/**
317+
* Peek the stack referenced by 'key' and return the value possibly null.
318+
*
319+
* @param key identifies the deque(stack)
320+
* @return the value just peeked. May be null/
321+
* @since 2.0.18
322+
*/
323+
static public String peekByKey(String key) {
324+
if (getMDCAdapter() == null) {
325+
throw new IllegalStateException(MDC_APAPTER_CANNOT_BE_NULL_MESSAGE);
326+
}
327+
return getMDCAdapter().peekByKey(key);
328+
}
329+
316330
/**
317331
* Returns a copy of the deque(stack) referenced by 'key'. May be null.
318332
*

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ public String popByKey(String key) {
159159
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: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,32 +40,40 @@ 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
/**
7078
* Clear the deque(stack) referenced by 'key'.
7179
*
@@ -74,15 +82,10 @@ public Deque<String> getCopyOfDequeByKey(String key) {
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

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"));

0 commit comments

Comments
 (0)