KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > shiftone > cache > util > WeakMap


1 package org.shiftone.cache.util;
2
3
4
5 import java.lang.ref.Reference JavaDoc;
6 import java.lang.ref.ReferenceQueue JavaDoc;
7 import java.lang.ref.WeakReference JavaDoc;
8 import java.util.*;
9
10
11 /**
12  * @version $Revision: 1.5 $
13  * @author <a HREF="mailto:jeff@shiftone.org">Jeff Drost</a>
14  */

15 public class WeakMap implements Map
16 {
17
18     private static final Log LOG = new Log(WeakMap.class);
19     private ReferenceQueue JavaDoc referenceQueue = new ReferenceQueue JavaDoc();
20     private Map referenceMap = new TreeMap();
21
22     public Object JavaDoc put(Object JavaDoc key, Object JavaDoc 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 JavaDoc get(Object JavaDoc key)
47     {
48
49         purge();
50
51         Reference JavaDoc ref = (Reference JavaDoc) 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 JavaDoc remove(Object JavaDoc 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 JavaDoc 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 JavaDoc value)
125     {
126         throw new UnsupportedOperationException JavaDoc("containsValue");
127     }
128
129
130     public Collection values()
131     {
132         throw new UnsupportedOperationException JavaDoc("values");
133     }
134
135
136     public Set entrySet()
137     {
138         throw new UnsupportedOperationException JavaDoc("entrySet");
139     }
140
141
142     class KeyedWeakReference extends WeakReference JavaDoc
143     {
144
145         private final Object JavaDoc key;
146
147         public KeyedWeakReference(Object JavaDoc key, Object JavaDoc referent)
148         {
149
150             super(referent, referenceQueue);
151
152             this.key = key;
153         }
154
155
156         public Object JavaDoc getKey()
157         {
158             return key;
159         }
160     }
161 }
162
Popular Tags