package org.jbehave.eclipse.util;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
public class ConcurrentMultimap<K,V> {
private final ConcurrentHashMap<K, ConcurrentLinkedQueue<V>> underlying = New.concurrentHashMap();
public ConcurrentHashMap<K, ConcurrentLinkedQueue<V>> getUnderlying() {
return underlying;
}
public void put(K key, V value) {
ConcurrentLinkedQueue<V> values = underlying.get(key);
if(values==null) {
ConcurrentLinkedQueue<V> newValues = New.concurrentLinkedQueue();
values = underlying.putIfAbsent(key, newValues);
if(values==null)
values = newValues;
}
values.add(value);
}
/**
* @return
* @see java.util.concurrent.ConcurrentHashMap#isEmpty()
*/
public boolean isEmpty() {
return underlying.isEmpty();
}
/**
* @param key
* @return
* @see java.util.concurrent.ConcurrentHashMap#containsKey(java.lang.Object)
*/
public boolean containsKey(Object key) {
return underlying.containsKey(key);
}
/**
* @param key
* @return
* @see java.util.concurrent.ConcurrentHashMap#remove(java.lang.Object)
*/
public ConcurrentLinkedQueue<V> remove(Object key) {
return underlying.remove(key);
}
/**
* @return
* @see java.util.concurrent.ConcurrentHashMap#keySet()
*/
public Set<K> keySet() {
return underlying.keySet();
}
}