All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.collections.event.AbstractEventCollection Maven / Gradle / Ivy

package net.sf.javagimmicks.collections.event;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

import net.sf.javagimmicks.collections.decorators.AbstractUnmodifiableCollectionDecorator;

public abstract class AbstractEventCollection extends AbstractUnmodifiableCollectionDecorator
{
   private static final long serialVersionUID = -8335291555421718053L;

   public AbstractEventCollection(Collection decorated)
   {
      super(decorated);
   }

   @Override
   public boolean add(E e)
   {
      boolean result = getDecorated().add(e);
      
      if(result)
      {
         fireElementAdded(e);
      }
      
      return result;
   }
   
   @Override
   public boolean addAll(Collection c)
   {
      final Collection decorated = getDecorated();
      final ArrayList added = new ArrayList();
      
      for(E element : c)
      {
         if(decorated.add(element))
         {
            added.add(element);
         }
      }
      
      if(!added.isEmpty())
      {
         fireElementsAdded(added);
         return true;
      }
      else
      {
         return false;
      }
   }

   @Override
   public Iterator iterator()
   {
      return new EventCollectionIterator(getDecorated().iterator());
   }

   @SuppressWarnings("unchecked")
   @Override
   public boolean remove(Object o)
   {
      boolean result = getDecorated().remove(o);
      
      if(result)
      {
         fireElementRemoved((E)o);
      }
      
      return result;
   }

   abstract protected void fireElementsAdded(Collection c);
   abstract protected void fireElementRemoved(E element);
   
   protected void fireElementAdded(E element)
   {
      fireElementsAdded(Collections.singleton(element));
   }
   
   protected class EventCollectionIterator implements Iterator
   {
      protected final Iterator _decorated;
      protected E _lastElement = null;
      
      public EventCollectionIterator(Iterator decorated)
      {
         _decorated = decorated;
      }

      public boolean hasNext()
      {
         return _decorated.hasNext();
      }

      public E next()
      {
         _lastElement = _decorated.next();
         
         return _lastElement;
      }

      public void remove()
      {
         _decorated.remove();
         
         fireElementRemoved(_lastElement);
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy