1 package org.shiftone.cache.util; 2 3 4 5 import java.lang.ref.Reference ; 6 import java.lang.ref.ReferenceQueue ; 7 import java.lang.ref.WeakReference ; 8 import java.util.*; 9 10 11 15 public class WeakMap implements Map 16 { 17 18 private static final Log LOG = new Log(WeakMap.class); 19 private ReferenceQueue referenceQueue = new ReferenceQueue (); 20 private Map referenceMap = new TreeMap(); 21 22 public Object put(Object key, Object value) 23 { 24 25 purge(); 26 27 return referenceMap.put(key, new KeyedWeakReference(key, value)); 28 } 29 30 31 public void putAll(Map map) 32 { 33 34 Set set = map.entrySet(); 35 Iterator iterator = set.iterator(); 36 37 while (iterator.hasNext()) 38 { 39 Map.Entry entry = (Map.Entry) iterator.next(); 40 41 put(entry.getKey(), entry.getValue()); 42 } 43 } 44 45 46 public Object get(Object key) 47 { 48 49 purge(); 50 51 Reference ref = (Reference ) referenceMap.get(key); 52 53 return (ref != null) 54 ? ref.get() 55 : null; 56 } 57 58 59 public void clear() 60 { 61 purge(); 62 referenceMap.clear(); 63 } 64 65 66 public Object remove(Object key) 67 { 68 69 purge(); 70 71 return referenceMap.remove(key); 72 } 73 74 75 public Set keySet() 76 { 77 78 purge(); 79 80 return referenceMap.keySet(); 81 } 82 83 84 public boolean containsKey(Object key) 85 { 86 87 purge(); 88 89 return referenceMap.containsKey(key); 90 } 91 92 93 public int size() 94 { 95 96 purge(); 97 98 return referenceMap.size(); 99 } 100 101 102 public boolean isEmpty() 103 { 104 105 purge(); 106 107 return referenceMap.isEmpty(); 108 } 109 110 111 public void purge() 112 { 113 114 KeyedWeakReference ref; 115 116 while ((ref = (KeyedWeakReference) referenceQueue.poll()) != null) 117 { 118 LOG.info("referenceQueue purge : " + ref.getKey() + " ; size=" + size()); 119 referenceMap.remove(ref.getKey()); 120 } 121 } 122 123 124 public boolean containsValue(Object value) 125 { 126 throw new UnsupportedOperationException ("containsValue"); 127 } 128 129 130 public Collection values() 131 { 132 throw new UnsupportedOperationException ("values"); 133 } 134 135 136 public Set entrySet() 137 { 138 throw new UnsupportedOperationException ("entrySet"); 139 } 140 141 142 class KeyedWeakReference extends WeakReference 143 { 144 145 private final Object key; 146 147 public KeyedWeakReference(Object key, Object referent) 148 { 149 150 super(referent, referenceQueue); 151 152 this.key = key; 153 } 154 155 156 public Object getKey() 157 { 158 return key; 159 } 160 } 161 } 162 | Popular Tags |