package com.revolsys.collection.map;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
public class ThreadLocalMap<K, V> implements Map<K, V> {
private final ThreadLocal<Map<K, V>> map = new ThreadLocal<>();
private final Supplier<Map<K, V>> factory;
public ThreadLocalMap() {
this(Maps.factoryHash());
}
public ThreadLocalMap(final Supplier<Map<K, V>> factory) {
this.factory = factory;
}
@Override
public void clear() {
this.map.set(null);
}
@Override
public boolean containsKey(final Object key) {
final Map<K, V> localMap = getMap();
return localMap.containsKey(key);
}
@Override
public boolean containsValue(final Object value) {
final Map<K, V> localMap = getMap();
return localMap.containsValue(value);
}
@Override
public Set<Map.Entry<K, V>> entrySet() {
final Map<K, V> localMap = getMap();
return localMap.entrySet();
}
@Override
public V get(final Object key) {
final Map<K, V> localMap = getMap();
return localMap.get(key);
}
public Map<K, V> getMap() {
Map<K, V> localMap = this.map.get();
if (localMap == null) {
localMap = this.factory.get();
this.map.set(localMap);
}
return localMap;
}
@Override
public boolean isEmpty() {
final Map<K, V> localMap = this.map.get();
return localMap == null || localMap.isEmpty();
}
@Override
public Set<K> keySet() {
final Map<K, V> localMap = getMap();
return localMap.keySet();
}
@Override
public V put(final K key, final V value) {
final Map<K, V> localMap = getMap();
return localMap.put(key, value);
}
@Override
public void putAll(final Map<? extends K, ? extends V> t) {
final Map<K, V> localMap = getMap();
localMap.putAll(t);
}
@Override
public V remove(final Object key) {
final Map<K, V> localMap = getMap();
return localMap.remove(key);
}
@Override
public int size() {
final Map<K, V> localMap = getMap();
return localMap.size();
}
@Override
public String toString() {
final Map<K, V> localMap = this.map.get();
if (localMap == null) {
return "{}";
} else {
return localMap.toString();
}
}
@Override
public Collection<V> values() {
final Map<K, V> localMap = getMap();
return localMap.values();
}
}