diff options
Diffstat (limited to 'source/com/c2kernel/utils/TransientCache.java')
| -rwxr-xr-x | source/com/c2kernel/utils/TransientCache.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/source/com/c2kernel/utils/TransientCache.java b/source/com/c2kernel/utils/TransientCache.java new file mode 100755 index 0000000..b93bbd7 --- /dev/null +++ b/source/com/c2kernel/utils/TransientCache.java @@ -0,0 +1,115 @@ +
+package com.c2kernel.utils;
+import java.lang.ref.*;
+import java.util.*;
+/**************************************************************************
+ * TransientCache - Uses transient references to allow unused entries to be
+ * reaped by the java garbage collector.
+ *
+ * $Revision: 1.1 $
+ * $Date: 2004/04/20 09:37:02 $
+ *
+ * Copyright (C) 2003 CERN - European Organization for Nuclear Research
+ * All rights reserved.
+ **************************************************************************/
+public abstract class TransientCache extends AbstractMap {
+
+ private Map map = new Hashtable();
+ public synchronized Set entrySet() {
+ Map newMap;
+ Iterator iter;
+ newMap = new Hashtable();
+ iter = map.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry me = (Map.Entry)iter.next();
+ Reference ref = (Reference)me.getValue();
+ Object o = ref.get();
+ if (o == null) {
+ // Delete cleared reference
+ iter.remove();
+ } else {
+ // Copy out interior object
+ newMap.put(me.getKey(), o);
+ }
+ }
+ // Return set of interior objects
+ return newMap.entrySet();
+ }
+
+ public synchronized Object put(Object key, Object value) {
+ Reference ref = makeReference(value);
+ ref = (Reference)map.put(key, ref);
+ if (ref != null)
+ return (ref.get());
+ return null;
+ }
+
+ public abstract Reference makeReference(Object value);
+
+ public Object remove(Object key) {
+ Iterator i = map.entrySet().iterator();
+ Entry correctEntry = null;
+ if (key == null) {
+ while (correctEntry == null && i.hasNext()) {
+ Entry e = (Entry)i.next();
+ if (e.getKey() == null)
+ correctEntry = e;
+ }
+ } else {
+ while (correctEntry == null && i.hasNext()) {
+ Entry e = (Entry)i.next();
+ if (key.equals(e.getKey()))
+ correctEntry = e;
+ }
+ }
+ Object oldValue = null;
+ if (correctEntry != null) {
+ Reference correctReference = (Reference)correctEntry.getValue();
+ oldValue = correctReference.get();
+ i.remove();
+ }
+ return oldValue;
+ }
+ /**
+ *
+ */
+ public void clear() {
+ map.entrySet().clear();
+ }
+
+ private transient Set keySet = null;
+
+ public Set keySet() {
+ if (keySet == null) {
+ keySet = new AbstractSet() {
+ public Iterator iterator() {
+ return new Iterator() {
+ private Iterator i = map.entrySet().iterator();
+
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ public Object next() {
+ return ((Entry)i.next()).getKey();
+ }
+
+ public void remove() {
+ i.remove();
+ }
+ };
+ }
+
+ public int size() {
+ return TransientCache.this.size();
+ }
+
+ public boolean contains(Object k) {
+ return TransientCache.this.containsKey(k);
+ }
+ };
+ }
+ return keySet;
+ }
+
+}
|
