/*
* WeakRefVectorModel.java, (c) Raimond Reichert July 1999
*/
package mldemo;
import java.util.*;
import java.lang.ref.*;
/**
* Implements VectorModel with weak references, ie, using
* a Vector to hold WeakReferences which in turn
* hold the references to the VectorModel.Listeners.
*
*
When ever a VectorModel.Listener event is fired,
* "dead" listeners are removed when traversing the list of the listeners.
*
* @author Raimond Reichert
*/
public class WeakRefVectorModel implements VectorModel {
private Vector vector;
private Vector listeners;
public WeakRefVectorModel() {
vector = new Vector();
listeners = new Vector();
} // WeakRefVectorModel //
public void addElement (Object object) {
vector.addElement (object);
fireElementAdded (object);
} // addElement //
public void removeElement (Object object) {
vector.removeElement (object);
fireElementRemoved (object);
} // removeElement //
public Object elementAt (int index) {
return vector.elementAt (index);
} // elementAt //
public int size() {
return vector.size();
} // size //
public void addListener (VectorModel.Listener l) {
WeakReference wr = new WeakReference (l);
listeners.addElement (wr);
} // addListener //
/**
* When looking up l, weak references which have been cleared
* (ie, they reference only null anymore) are thrown out
* of the listeners vector.
*/
public void removeListener (VectorModel.Listener l) {
int size = listeners.size();
int i = 0;
while (i < size) {
WeakReference wr = (WeakReference)listeners.elementAt(i);
VectorModel.Listener vml = (VectorModel.Listener)wr.get();
if (vml == null) {
listeners.removeElement (wr);
size--;
}
else {
if (vml == l)
listeners.removeElement (wr);
i++;
}
}
} // removeListener //
/**
* When firing the event, weak references which have been cleared
* (ie, they reference only null anymore) are thrown out
* of the listeners vector.
*/
protected void fireElementAdded (Object object) {
VectorModel.Event e = null;
int size = listeners.size();
int i = 0;
while (i < size) {
WeakReference wr = (WeakReference)listeners.elementAt(i);
VectorModel.Listener vml = (VectorModel.Listener)wr.get();
if (vml == null) {
listeners.removeElement (wr);
size--;
System.out.println (
"WeakRefVectorModel.fireElementAdded: found dead reference"
);
}
else {
if (e == null) // lazily create event
e = new VectorModel.Event (this, object);
vml.elementAdded (e);
i++;
}
}
} // fireElementAdded //
protected void fireElementRemoved (Object object) {
VectorModel.Event e = null;
int size = listeners.size();
int i = 0;
while (i < size) {
WeakReference wr = (WeakReference)listeners.elementAt(i);
VectorModel.Listener vml = (VectorModel.Listener)wr.get();
if (vml == null) {
listeners.removeElement (wr);
size--;
System.out.println (
"WeakRefVectorModel.fireElementRemoved: found dead reference"
);
}
else {
if (e == null) // lazily create event
e = new VectorModel.Event (this, object);
vml.elementRemoved (e);
i++;
}
}
} // fireElementRemoved //
} // WeakRefVectorModel //