| CachedCollection.java |
/***************************************
* *
* JBoss: The OpenSource J2EE WebOS *
* *
* Distributable under LGPL license. *
* See terms of license at gnu.org. *
* *
***************************************/
package org.jboss.util.collection;
import java.util.Collection;
import java.util.AbstractCollection;
import java.util.Iterator;
import java.lang.ref.ReferenceQueue;
import org.jboss.util.SoftObject;
import org.jboss.util.Objects;
/**
* A wrapper around a <code>Collection</code> which translates added objects
* into {@link SoftObject} references, allowing the VM to garbage collect
* objects in the collection when memory is low.
*
* @version <tt>$Revision: 1.3 $</tt>
* @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
*/
public class CachedCollection
extends AbstractCollection
{
/** Reference queue */
protected final ReferenceQueue queue = new ReferenceQueue();
/** Wrapped collection */
protected final Collection collection;
/**
* Construct a CachedCollection.
*
* @param collection Collection to wrap.
*/
public CachedCollection(final Collection collection) {
this.collection = collection;
}
/**
* Returns an iterator over the elements contained in this collection.
*
* @return An iterator over the elements contained in this collection.
*/
public Iterator iterator() {
maintain();
return new MyIterator(collection.iterator());
}
/**
* Returns the size of the collection.
*
* @return The number of elements in the collection.
*/
public int size() {
maintain();
return collection.size();
}
/**
* Add an object to the collection.
*
* @param obj Object (or <i>null</i> to add to the collection.
* @return True if object was added.
*/
public boolean add(final Object obj) {
maintain();
SoftObject soft = SoftObject.create(obj, queue);
return collection.add(soft);
}
/**
* Maintains the collection by removing garbage collected objects.
*/
private void maintain() {
SoftObject obj;
int count = 0;
while ((obj = (SoftObject)queue.poll()) != null) {
count++;
collection.remove(obj);
}
if (count != 0) {
// some temporary debugging fluff
System.err.println("vm reclaimed " + count + " objects");
}
}
/////////////////////////////////////////////////////////////////////////
// De-Referencing Iterator //
/////////////////////////////////////////////////////////////////////////
/**
* A dereferencing iterator.
*/
private final class MyIterator
implements Iterator
{
private final Iterator iter;
public MyIterator(final Iterator iter) {
this.iter = iter;
}
public boolean hasNext() {
maintain();
return iter.hasNext();
}
private Object nextObject() {
Object obj = iter.next();
return Objects.deref(obj);
}
public Object next() {
maintain();
return nextObject();
}
public void remove() {
maintain();
iter.remove();
}
}
}
| CachedCollection.java |