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
020 package org.crsh.util;
021
022 import java.util.AbstractMap;
023 import java.util.AbstractSet;
024 import java.util.Iterator;
025 import java.util.Set;
026
027 public 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 }