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 }