001    /*
002    @license.text@
003     */
004    package biz.hammurapi.cache;
005    
006    import java.lang.ref.Reference;
007    import java.lang.ref.SoftReference;
008    import java.util.HashMap;
009    import java.util.Map;
010    
011    /**
012     * Map with soft-referenced values.
013     * @author Pavel Vlasov
014     * @revision $Revision$
015     */
016    public class SoftHashMap extends HashMap {
017            private Object nullMarker=new Object();
018    
019            /**
020             * 
021             */
022            private static final long serialVersionUID = 4095082501213777588L;
023    
024            public SoftHashMap() {
025                    super();
026            }
027    
028            public SoftHashMap(int initialCapacity) {
029                    super(initialCapacity);
030            }
031    
032            public SoftHashMap(int initialCapacity, float loadFactor) {
033                    super(initialCapacity, loadFactor);
034            }
035    
036            public SoftHashMap(Map m) {
037                    super(m);
038            }
039            
040            public Object put(Object key, Object value) {
041                    return super.put(key, new SoftReference(value==null ? nullMarker : value));
042            }
043            
044            public Object get(Object key) {
045                    Reference ref = (Reference) super.get(key);
046                    if (ref==null) {
047                            return null;
048                    }
049                    
050                    Object value = ref.get();
051                    if (value==null) {
052                            remove(key);
053                    }
054                    return value==nullMarker ? null : value;
055            }
056    
057    }