001    package org.crsh.util;
002    
003    import java.util.AbstractMap;
004    import java.util.AbstractSet;
005    import java.util.Iterator;
006    import java.util.Set;
007    
008    /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */
009    public abstract class SimpleMap<K, V> extends AbstractMap<K, V> {
010    
011      protected abstract Iterator<K> keys();
012    
013      @Override
014      public abstract V get(Object key);
015    
016      @Override
017      public final boolean containsKey(Object key) {
018        return get(key) != null;
019      }
020    
021      @Override
022      public final Set<Entry<K, V>> entrySet() {
023        return entries;
024      }
025    
026      private AbstractSet<Entry<K, V>> entries = new AbstractSet<Entry<K, V>>() {
027    
028        @Override
029        public Iterator<Entry<K, V>> iterator() {
030          final Iterator<K> names = keys();
031          return new Iterator<Entry<K, V>>() {
032            public boolean hasNext() {
033              return names.hasNext();
034            }
035    
036            public Entry<K, V> next() {
037              final K name = names.next();
038              return new Entry<K, V>() {
039                public K getKey() {
040                  return name;
041                }
042    
043                public V getValue() {
044                  return get(name);
045                }
046    
047                public V setValue(V value) {
048                  throw new UnsupportedOperationException();
049                }
050              };
051            }
052    
053            public void remove() {
054              throw new UnsupportedOperationException();
055            }
056          };
057        }
058    
059        @Override
060        public int size() {
061          int size = 0;
062          for (Iterator<K> names = keys();names.hasNext();) {
063            size++;
064          }
065          return size;
066        }
067      };
068    }