/*
* Created on 1 Nov 2006
* Created by Paul Gardner
* Copyright (C) 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 63.529,40 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.core3.util;
import java.lang.ref.WeakReference;
import java.util.*;
public class
DebugWeakList
{
final static boolean DEBUG = Constants.isCVSVersion();
private String name;
private List list;
public
DebugWeakList(
String _name )
{
name = _name;
list = new ArrayList();
}
public
DebugWeakList(
String _name,
DebugWeakList l )
{
name = _name;
list = new ArrayList( l.list );
}
public void
add(
Object obj )
{
if ( DEBUG ){
list.add( new Object[]{ obj.getClass(), new WeakReference( obj )});
}else{
list.add( obj );
}
}
public void
remove(
Object obj )
{
if ( DEBUG ){
Iterator it = list.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
WeakReference wr = (WeakReference)entry[1];
Object target = wr.get();
if ( target == null ){
it.remove();
logRemoved((Class)entry[0]);
}else if ( target == obj ){
it.remove();
return;
}
}
}else{
list.remove( obj );
}
}
public boolean
contains(
Object obj )
{
if ( DEBUG ){
Iterator it = list.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
WeakReference wr = (WeakReference)entry[1];
Object target = wr.get();
if ( target == null ){
it.remove();
logRemoved((Class)entry[0]);
}else if ( target == obj ){
return( true );
}
}
return( false );
}else{
return( list.contains( obj ));
}
}
protected void
logRemoved(
Class cla )
{
Debug.out( "Object '" + cla + "' was not removed correctly from " + name );
}
public Iterator
iterator()
{
if ( DEBUG ){
return( new WeakListIterator());
}else{
return( list.iterator());
}
}
public int
estimatedSize()
{
return( list.size());
}
protected class
WeakListIterator
implements Iterator
{
private Iterator it = list.iterator();
private Object pending_result;
private Object last_result;
public boolean
hasNext()
{
if ( pending_result != null ){
return( true );
}
while( it.hasNext()){
Object[] entry = (Object[])it.next();
WeakReference wr = (WeakReference)entry[1];
Object target = wr.get();
if ( target == null ){
it.remove();
logRemoved((Class)entry[0]);
}else{
pending_result = target;
return( true );
}
}
return( false );
}
public Object
next()
throws NoSuchElementException
{
if ( pending_result == null ){
hasNext();
}
if ( pending_result == null ){
throw( new NoSuchElementException());
}
last_result = pending_result;
pending_result = null;
return( last_result );
}
public void
remove()
{
Object lr = last_result;
if ( lr == null ){
throw( new NoSuchElementException());
}
last_result = null;
if ( pending_result == null ){
it.remove();
}else{
// has next has skipped on beyond last result, need to manually fix up...
Iterator temp_it = list.iterator();
while( temp_it.hasNext()){
Object[] entry = (Object[])temp_it.next();
WeakReference wr = (WeakReference)entry[1];
Object target = wr.get();
if ( target == lr ){
it = temp_it;
it.remove();
return;
}
}
// not found (Garbage collected), nothing to do
}
}
}
}