Package org.gudy.azureus2.core3.util

Source Code of org.gudy.azureus2.core3.util.DebugWeakList$WeakListIterator

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

Related Classes of org.gudy.azureus2.core3.util.DebugWeakList$WeakListIterator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.