/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.graph.util;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MultiMap implements Map, Serializable {
private Map m_map = null;
private Class m_collectionClass;
public MultiMap(Map map, Class collectionClass) {
m_map = map;
m_collectionClass = collectionClass;
}
public Object put(Object key, Object value) {
Collection c = null;
if ((c = (Collection)m_map.get(key)) == null) {
try {
c = (Collection)m_collectionClass.newInstance();
}
catch (InstantiationException e) {
throw new IllegalStateException(
e.getClass().getName() + ": " + e.getMessage()
);
}
catch (IllegalAccessException e) {
throw new IllegalStateException(
e.getClass().getName() + ": " + e.getMessage()
);
}
m_map.put(key, c);
}
c.add(value);
return(c);
}
public void putItems(Object key, Collection items) {
m_map.put(key, items);
}
public int size() {
return(m_map.size());
}
public void clear() {
m_map.clear();
}
public boolean isEmpty() {
return(m_map.isEmpty());
}
public boolean containsKey(Object key) {
return(m_map.containsKey(key));
}
public boolean containsValue(Object value) {
for (Iterator itr = values().iterator(); itr.hasNext();) {
Collection c = (Collection)itr.next();
if (c.contains(value)) return(true);
}
return(false);
}
public Collection values() {
return(m_map.values());
}
public void putAll(Map t) {
for (Iterator itr = t.entrySet().iterator(); itr.hasNext();) {
Map.Entry entry = (Map.Entry)itr.next();
put(entry.getKey(), entry.getValue());
}
}
public Set entrySet() {
return(m_map.entrySet());
}
public Set keySet() {
return(m_map.keySet());
}
public Object get(Object key) {
Object obj = null;
if ((obj = m_map.get(key)) == null) {
try {
obj = m_collectionClass.newInstance();
}
catch (InstantiationException e) {
throw new IllegalStateException(
e.getClass().getName() + ": " + e.getMessage()
);
}
catch (IllegalAccessException e) {
throw new IllegalStateException(
e.getClass().getName() + ": " + e.getMessage()
);
}
putItems(key, (Collection)obj);
}
return(obj);
}
public Collection getItems(Object key) {
return((Collection)get(key));
}
public Object remove(Object key) {
return(m_map.remove(key));
}
public Object remove(Object key, Object value) {
Collection c = (Collection)m_map.get(key);
c.remove(value);
return(value);
}
}