blob: 5af915caa32eeea5be60fa7f81290c5dbfae8ab1 [file] [log] [blame]
/*
* WeakValueMap.java created on 31.10.2006
*
* To change this generated comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package org.codehaus.groovy.runtime;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import java.util.WeakHashMap;
public class ReferenceMap extends WeakHashMap {
private static class HardReference extends SoftReference {
private Object value;
public HardReference(Object arg) {
super(null);
value = arg;
}
public Object get() {
return value;
}
}
private ReferenceQueue queue = new ReferenceQueue();
public ReferenceMap() {
super();
}
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
public Set entrySet() {
throw new UnsupportedOperationException();
}
public Object get(Object key) {
Object ret = super.get(key);
if (ret!=null) {
SoftReference weak = (SoftReference) ret;
ret = weak.get();
if (ret==null) remove(key);
}
return ret;
}
public Object put(Object key, Object value) {
removeDereferencedEntries();
if (value!=null) {
value = new SoftReference(value,queue);
}
return super.put(key, value);
}
public Object putStrong(Object key, Object value) {
removeDereferencedEntries();
if (value!=null) {
value = new HardReference(value);
}
return super.put(key, value);
}
public Collection values() {
removeDereferencedEntries();
Collection origColl = super.values();
ArrayList newColl = new ArrayList(origColl.size());
for (Iterator iter = origColl.iterator(); iter.hasNext();) {
SoftReference element = (SoftReference) iter.next();
if (element!=null) {
Object strong = element.get();
if (strong==null) continue;
newColl.add(strong);
} else {
newColl.add(null);
}
}
return newColl;
}
private void removeDereferencedEntries(){
SoftReference e;
while ( (e = (SoftReference) queue.poll()) != null) {
Object strong = e.get();
if (strong==null) continue;
remove(strong);
}
}
}