/* * 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 //