[
https://issues.apache.org/jira/browse/LOG4J2-1516?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gary Gregory updated LOG4J2-1516:
---------------------------------
Description:
Add API {{ThreadContextMap.putAll(Map<String, String>)}}.
My immediate goal is to be able to build a JUnit Rule to save and restore the
thread context around each unit test method and/or a given class.
See [LOG4J-1517].
was:
Add API {{ThreadContextMap.putAll(Map<String, String>)}}.
My immediate goal is to be able to build a JUnit Rule to save and restore the
thread context around each unit test method and/or a given class.
I have (not committed yet):
{code:java}
/**
* Restores the ThreadContext to it's initial map and stack values after a
JUnit test.
*/
public class ThreadContextRule extends ExternalResource {
private final boolean restoreMap;
private final boolean restoreStack;
private ThreadContextHolder threadContextHolder;
/**
* Constructs an instance initialized to restore the stack and map.
*/
public ThreadContextRule() {
this(true, true);
}
/**
* Constructs an instance initialized to restore the given structures.
*
* @param restoreMap
* Whether to restore the thread context map.
* @param restoreStack
* Whether to restore the thread context stack.
*/
public ThreadContextRule(final boolean restoreMap, final boolean
restoreStack) {
super();
this.restoreMap = restoreMap;
this.restoreStack = restoreStack;
}
@Override
protected void after() {
if (threadContextHolder != null) {
threadContextHolder.restore();
}
}
@Override
protected void before() throws Throwable {
threadContextHolder = new ThreadContextHolder(restoreMap, restoreStack);
if (restoreMap) {
ThreadContext.clearMap();
}
if (restoreStack) {
ThreadContext.clearStack();
}
}
}
{code}
and:
{code:java}
/**
* Holds an immutable copy of the ThreadContext stack and map.
*
* @since 2.7
*/
public class ThreadContextHolder {
private final Map<String, String> immutableContext;
private final ContextStack immutableStack;
private final boolean restoreContext;
private final boolean restoreStack;
/**
* Constructs a new holder initialized with an immutable copy of the
ThreadContext stack and map.
* @param restoreContext
* @param restoreStack
*/
public ThreadContextHolder(final boolean restoreContext, final boolean
restoreStack) {
this.restoreContext = restoreContext;
this.restoreStack = restoreStack;
this.immutableContext = restoreContext ?
ThreadContext.getImmutableContext() : null;
this.immutableStack = restoreStack ? ThreadContext.getImmutableStack()
: null;
}
/**
* Restores the ThreadContext stack and map based on the values saved in
the constructor.
*/
public void restore() {
if (restoreStack) {
ThreadContext.setStack(immutableStack);
}
if (restoreContext) {
ThreadContext.setContext(immutableContext);
}
}
}
{code}
and in ThreadContext:
{code:java}
/**
* Sets this thread's context.
*
* @param map The map to use.
* @since 2.7
*/
public static void setContext(final Map<String, String> map) {
if (map.isEmpty() || !useMap) {
return;
}
contextMap.clear();
contextMap.putAll(map);
}
{code}
> Add ThreadContextMap.putAll(Map<String, String>)
> ------------------------------------------------
>
> Key: LOG4J2-1516
> URL: https://issues.apache.org/jira/browse/LOG4J2-1516
> Project: Log4j 2
> Issue Type: New Feature
> Components: API
> Reporter: Gary Gregory
> Assignee: Gary Gregory
> Fix For: 2.7
>
>
> Add API {{ThreadContextMap.putAll(Map<String, String>)}}.
> My immediate goal is to be able to build a JUnit Rule to save and restore the
> thread context around each unit test method and/or a given class.
> See [LOG4J-1517].
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]