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

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

The newest version!
package net.sf.javagimmicks.collections.event;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import net.sf.javagimmicks.collections.decorators.AbstractEntryDecorator;
import net.sf.javagimmicks.collections.decorators.AbstractIteratorDecorator;
import net.sf.javagimmicks.collections.decorators.AbstractUnmodifiableMapDecorator;

public abstract class AbstractEventMap extends AbstractUnmodifiableMapDecorator
{
   private static final long serialVersionUID = -2690296055006665266L;

   public AbstractEventMap(Map decorated)
   {
      super(decorated);
   }
   
   @Override
   public Set> entrySet()
   {
      return new EventMapEntrySet(getDecorated().entrySet());
   }

   @Override
   public V put(K key, V value)
   {
      boolean isUpdate = containsKey(key);
      V oldValue = getDecorated().put(key, value);
      
      if(isUpdate)
      {
         fireEntryUpdated(key, oldValue, value);
      }
      else
      {
         fireEntryAdded(key, value);
      }
      
      return oldValue;
   }

   abstract protected void fireEntryAdded(K key, V value);
   abstract protected void fireEntryUpdated(K key, V oldValue, V newValue);
   abstract protected void fireEntryRemoved(K key, V value);
   
   protected class EventMapEntrySet extends AbstractEventSet>
   {
      private static final long serialVersionUID = 4496963842926801525L;

      protected EventMapEntrySet(Set> decorated)
      {
         super(decorated);
      }
      
      @Override
      public Iterator> iterator()
      {
         return new AbstractIteratorDecorator>(super.iterator())
         {
            @Override
            public Entry next()
            {
               return new AbstractEntryDecorator(super.next())
               {
                  private static final long serialVersionUID = -6377534237333144069L;

                  @Override
                  public V setValue(V value)
                  {
                     final V oldValue = super.setValue(value);
                     
                     fireEntryUpdated(getKey(), oldValue, value);
                     
                     return oldValue;
                  }
               };
            }
         };
      }

      @Override
      public boolean add(Entry e)
      {
         throw new UnsupportedOperationException("Cannot directly add entries to the EntrySet of an AbstractEventMap!");
      }

      @Override
      protected void fireElementAdded(Entry element)
      {
      }

      @Override
      protected void fireElementReadded(Entry element)
      {
      }

      @Override
      protected void fireElementRemoved(Entry element)
      {
         fireEntryRemoved(element.getKey(), element.getValue());
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy