/*
  * @see org.alfresco.util.OneToManyBiMap#removeValue(V)
  */
 public K removeValue(V value) {
   K key = inverse.remove(value);
   Set<V> values = map.get(key);
   values.remove(value);
   if (values.size() == 0) map.remove(key);
   return key;
 }
 public Set<V> put(K key, Set<V> values) {
   map.put(key, values);
   for (V value : values) {
     inverse.put(value, key);
   }
   return null;
 }
 public Set<V> remove(Object key) {
   Set<V> values = map.remove(key);
   for (V value : values) {
     inverse.remove(value);
   }
   return values;
 }
 public void putAll(Map<? extends K, ? extends Set<V>> m) {
   map.putAll(m);
   for (Entry<? extends K, ? extends Set<V>> entry : m.entrySet()) {
     K key = entry.getKey();
     for (V value : entry.getValue()) {
       inverse.put(value, key);
     }
   }
 }
 public V putSingleValue(K key, V value) {
   inverse.put(value, key);
   return map.putSingleValue(key, value);
 }
 public Set<K> keySet() {
   return map.keySet();
 }
 public boolean isEmpty() {
   return map.isEmpty();
 }
 public Set<V> get(Object key) {
   return map.get(key);
 }
 public Set<Entry<K, V>> entries() {
   return map.entries();
 }
 public Set<Entry<K, Set<V>>> entrySet() {
   return map.entrySet();
 }
 public boolean containsValue(Object value) {
   return map.containsValue(value);
 }
 public boolean containsKey(Object key) {
   return map.containsKey(key);
 }
 public void clear() {
   map.clear();
   inverse.clear();
 }
 public Collection<Set<V>> values() {
   return map.values();
 }
 public int size() {
   return map.size();
 }
 public void putAllSingleValues(Map<? extends K, ? extends V> m) {
   map.putAllSingleValues(m);
   for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
     inverse.put(entry.getValue(), entry.getKey());
   }
 }