You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Gary Gregory (JIRA)" <ji...@apache.org> on 2016/08/15 16:09:20 UTC

[jira] [Updated] (LOG4J2-1516) Add ThreadContextMap.putAll(Map)

     [ 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 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}

  was:Add API {{ThreadContextMap.putAll(Map<String, String>)}}.


> 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 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}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org