001/*
002 * Copyright (C) 2012 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019
020package org.crsh.util;
021
022import java.util.AbstractMap;
023import java.util.AbstractSet;
024import java.util.Iterator;
025import java.util.Set;
026
027public abstract class SimpleMap<K, V> extends AbstractMap<K, V> {
028
029  protected abstract Iterator<K> keys();
030
031  @Override
032  public abstract V get(Object key);
033
034  @Override
035  public final boolean containsKey(Object key) {
036    return get(key) != null;
037  }
038
039  @Override
040  public final Set<Entry<K, V>> entrySet() {
041    return entries;
042  }
043
044  private AbstractSet<Entry<K, V>> entries = new AbstractSet<Entry<K, V>>() {
045
046    @Override
047    public Iterator<Entry<K, V>> iterator() {
048      final Iterator<K> names = keys();
049      return new Iterator<Entry<K, V>>() {
050        public boolean hasNext() {
051          return names.hasNext();
052        }
053
054        public Entry<K, V> next() {
055          final K name = names.next();
056          return new Entry<K, V>() {
057            public K getKey() {
058              return name;
059            }
060
061            public V getValue() {
062              return get(name);
063            }
064
065            public V setValue(V value) {
066              throw new UnsupportedOperationException();
067            }
068          };
069        }
070
071        public void remove() {
072          throw new UnsupportedOperationException();
073        }
074      };
075    }
076
077    @Override
078    public int size() {
079      int size = 0;
080      for (Iterator<K> names = keys();names.hasNext();) {
081        size++;
082        names.next();
083      }
084      return size;
085    }
086  };
087}