package org.objectstyle.wolips.eomodeler.core.utils;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class NotificationMap<U, V> implements Map<U, V>, Cloneable {
public static final String CONTENTS = "__contents__";
private Map<U, V> myMap;
private PropertyChangeSupport myPropertyChangeSupport;
public NotificationMap() {
this(null);
}
public NotificationMap(Map<U, V> _map) {
if (_map == null) {
myMap = new HashMap<U, V>();
} else {
myMap = _map;
}
myPropertyChangeSupport = new PropertyChangeSupport(this);
}
@Override
public NotificationMap<U, V> clone() throws CloneNotSupportedException {
NotificationMap map = new NotificationMap<U, V>(new HashMap(myMap));
return map;
}
public void clear() {
myMap.clear();
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
}
public boolean containsKey(Object _key) {
return myMap.containsKey(_key);
}
public boolean containsValue(Object _value) {
return myMap.containsValue(_value);
}
public Set<Map.Entry<U, V>> entrySet() {
return myMap.entrySet();
}
public boolean equals(Object _o) {
return myMap.equals(_o);
}
public V get(Object _key) {
return myMap.get(_key);
}
public int hashCode() {
return myMap.hashCode();
}
public boolean isEmpty() {
return myMap.isEmpty();
}
public Set<U> keySet() {
return myMap.keySet();
}
public V put(U _key, V _value) {
V oldValue = myMap.put(_key, _value);
if (_key instanceof String) {
myPropertyChangeSupport.firePropertyChange((String) _key, oldValue, _value);
if (oldValue == null) {
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
}
} else {
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
}
return oldValue;
}
public V _putWithoutEvents(U _key, V _value) {
V oldValue = myMap.put(_key, _value);
return oldValue;
}
public void putAll(Map<? extends U, ? extends V> _t) {
myMap.putAll(_t);
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
}
public V remove(Object _key) {
V oldValue = myMap.remove(_key);
if (_key instanceof String) {
myPropertyChangeSupport.firePropertyChange((String) _key, oldValue, null);
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
} else {
myPropertyChangeSupport.firePropertyChange(NotificationMap.CONTENTS, null, null);
}
return oldValue;
}
public V _removeWithoutEvents(Object _key) {
V oldValue = myMap.remove(_key);
return oldValue;
}
public int size() {
return myMap.size();
}
public Collection<V> values() {
return myMap.values();
}
public void addPropertyChangeListener(PropertyChangeListener _listener) {
myPropertyChangeSupport.addPropertyChangeListener(_listener);
}
public void addPropertyChangeListener(String _propertyName, PropertyChangeListener _listener) {
myPropertyChangeSupport.addPropertyChangeListener(_propertyName, _listener);
}
public PropertyChangeListener[] getPropertyChangeListeners() {
return myPropertyChangeSupport.getPropertyChangeListeners();
}
public PropertyChangeListener[] getPropertyChangeListeners(String _propertyName) {
return myPropertyChangeSupport.getPropertyChangeListeners(_propertyName);
}
public boolean hasListeners(String _propertyName) {
return myPropertyChangeSupport.hasListeners(_propertyName);
}
public void removePropertyChangeListener(PropertyChangeListener _listener) {
myPropertyChangeSupport.removePropertyChangeListener(_listener);
}
public void removePropertyChangeListener(String _propertyName, PropertyChangeListener _listener) {
myPropertyChangeSupport.removePropertyChangeListener(_propertyName, _listener);
}
public String toString() {
return myMap.toString();
}
}