001package org.slf4j.helpers;
002
003import java.util.ArrayDeque;
004import java.util.Deque;
005import java.util.HashMap;
006import java.util.Map;
007
008
009/**
010 * A simple implementation of ThreadLocal backed Map containing values of type 
011 * Deque<String>.
012 * 
013 * @author Ceki Guuml;c&uuml;
014 * @since 2.0.0
015 */
016public class ThreadLocalMapOfStacks {
017
018    final ThreadLocal<Map<String, Deque<String>>> tlMapOfStacks = new ThreadLocal<>();
019
020    public void pushByKey(String key, String value) {
021        if (key == null)
022            return;
023
024        Map<String, Deque<String>> map = tlMapOfStacks.get();
025
026        if (map == null) {
027            map = new HashMap<>();
028            tlMapOfStacks.set(map);
029        }
030
031        Deque<String> deque = map.get(key);
032        if (deque == null) {
033            deque = new ArrayDeque<>();
034        }
035        deque.push(value);
036        map.put(key, deque);
037    }
038
039    public String popByKey(String key) {
040        if (key == null)
041            return null;
042
043        Map<String, Deque<String>> map = tlMapOfStacks.get();
044        if (map == null)
045            return null;
046        Deque<String> deque = map.get(key);
047        if (deque == null)
048            return null;
049        return deque.pop();
050    }
051
052    public Deque<String> getCopyOfDequeByKey(String key) {
053        if (key == null)
054            return null;
055
056        Map<String, Deque<String>> map = tlMapOfStacks.get();
057        if (map == null)
058            return null;
059        Deque<String> deque = map.get(key);
060        if (deque == null)
061            return null;
062
063        return new ArrayDeque<String>(deque);
064    }
065    
066    /**
067     * Clear the deque(stack) referenced by 'key'. 
068     * 
069     * @param key identifies the  stack
070     * 
071     * @since 2.0.0
072     */
073    public void clearDequeByKey(String key) {
074        if (key == null)
075            return;
076
077        Map<String, Deque<String>> map = tlMapOfStacks.get();
078        if (map == null)
079            return;
080        Deque<String> deque = map.get(key);
081        if (deque == null)
082            return;
083        deque.clear();
084    }
085
086}