/* * Freeplane - mind map editor * Copyright (C) 2009 Dimitry Polivaev * * This file author is Dimitry Polivaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.core.extension; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; public class SmallExtensionMap implements Map<Class<? extends IExtension>, IExtension> { private static final int INITIAL_CAPACITY = 5; private List<IExtension> collection; public void clear() { collection = null; } public boolean containsKey(final Object key) { if (collection == null) { return false; } if (!(key instanceof Class<?>)) { return false; } for (int i = 0; i < collection.size(); i++) { final Object extension = collection.get(i); if (key.equals(extension.getClass())) { return true; } } return false; } public boolean containsValue(final Object value) { if (collection == null) { return false; } if (!(value instanceof IExtension)) { return false; } for (int i = 0; i < collection.size(); i++) { if ( value.equals(collection.get(i))) { return true; } } return false; } private List<IExtension> createCollection() { if (collection == null) { collection = new ArrayList<IExtension>(INITIAL_CAPACITY); } return collection; } public Set<java.util.Map.Entry<Class<? extends IExtension>, IExtension>> entrySet() { throw new NoSuchMethodError(); } private int find(final Class<? extends IExtension> clazz) { if (collection == null) { return -1; } for (int i = 0; i < collection.size(); i++) { if (clazz.equals(collection.get(i).getClass())) { return i; } } return -1; } @SuppressWarnings("unchecked") public IExtension get(final Object key) { if (!(key instanceof Class<?>)) { return null; } final int index = find((Class<? extends IExtension>) key); if (index >= 0) { return collection.get(index); } return null; } public boolean isEmpty() { return collection == null; } public Set<Class<? extends IExtension>> keySet() { throw new NoSuchMethodError(); } public IExtension put(final Class<? extends IExtension> key, final IExtension value) { final int index = find(key); if (index >= 0) { final IExtension oldValue = collection.get(index); collection.set(index, value); return oldValue; } else { if (!key.equals(value.getClass())) { throw new ClassCastException(); } createCollection().add(value); return null; } } public void putAll(final Map<? extends Class<? extends IExtension>, ? extends IExtension> source) { for (final Entry<? extends Class<? extends IExtension>, ? extends IExtension> entry : source.entrySet()) { final Class<? extends IExtension> key = entry.getKey(); final IExtension value = entry.getValue(); put(key, value); } } @SuppressWarnings("unchecked") public IExtension remove(final Object key) { if (collection == null || !(key instanceof Class<?>)) { return null; } final int index = find((Class<? extends IExtension>) key); if (index == -1) { return null; } final IExtension remove = collection.remove(index); removeEmptyCollection(); return remove; } private void removeEmptyCollection() { if (collection.size() == 0) { collection = null; } } public int size() { return collection == null ? 0 : collection.size(); } public Collection<IExtension> values() { final Collection<IExtension> emptyList = Collections.emptyList(); return collection == null ? emptyList : collection; } }