package org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.gef;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
class WeakValueHashMap implements Map {
public int size() {
cleanRefs();
return myHashMap.size();
}
public boolean isEmpty() {
cleanRefs();
return myHashMap.isEmpty();
}
public boolean containsKey(Object key) {
cleanRefs();
return myHashMap.containsKey(key);
}
public boolean containsValue(Object val) {
throw new UnsupportedOperationException();
}
public Object get(Object key) {
cleanRefs();
RefWithUin ref = (RefWithUin)myHashMap.get(key);
if (ref==null) {
return null;
} else {
return ref.get();
}
}
public Object put(Object key, Object value) {
cleanRefs();
RefWithUin ref = new RefWithUin(value, key);
RefWithUin oldRef = (RefWithUin)myHashMap.put(key, ref);
if (oldRef == null) {
return null;
} else {
return oldRef.get();
}
}
public Object remove(Object key) {
cleanRefs();
RefWithUin oldRef = (RefWithUin)myHashMap.remove(key);
if (oldRef == null) {
return null;
} else {
return oldRef.get();
}
}
public void putAll(Map map) {
throw new UnsupportedOperationException();
}
public void clear() {
myHashMap.clear();
}
public Set keySet() {
cleanRefs();
return myHashMap.keySet();
}
public Collection values() {
throw new UnsupportedOperationException();
}
public Set entrySet() {
throw new UnsupportedOperationException();
}
///////////////////////////////////////////////////////////////////////////
/// Implementation
protected void cleanRefs() {
for (RefWithUin ref = (RefWithUin)myQueue.poll(); ref != null; ref = (RefWithUin)myQueue.poll()) {
Object value = myHashMap.get(ref.getKey());
if (value == ref) {
myHashMap.remove(ref.getKey());
}
}
}
private class RefWithUin extends WeakReference {
public RefWithUin(Object obj, Object key) {
super(obj, myQueue);
myKey = key;
}
public Object getKey() {
return myKey;
}
private final Object myKey;
}
private final HashMap myHashMap = new HashMap();
private final ReferenceQueue myQueue = new ReferenceQueue();
}