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