package com.tibco.as.spacebar.ui.editor.continuous; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.Map; import java.util.Set; import com.tibco.as.space.Tuple; public class ObservableTuple implements Map<String, Object>, Comparable<ObservableTuple> { private final Tuple tuple; private PropertyChangeSupport support = new PropertyChangeSupport(this); private PropertyChangeListener changeListener; private int id; public ObservableTuple(Tuple map, int id, PropertyChangeListener changeListener) { this.tuple = map; this.id = id; this.changeListener = changeListener; addPropertyChangeListener(this.changeListener); } public void addPropertyChangeListener(PropertyChangeListener listener) { support.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { support.removePropertyChangeListener(listener); support.removePropertyChangeListener(changeListener); } @Override public int compareTo(ObservableTuple o) { return 0; } @Override public Object put(String key, Object value) { Object previous = tuple.put(key, value); if (!equals(previous, value)) { support.firePropertyChange(key, previous, value); } return previous; } private boolean equals(Object oldValue, Object newValue) { if (newValue == null) { return oldValue == null; } return newValue.equals(oldValue); } @Override public Object get(Object key) { return tuple.get(key); } @Override public int hashCode() { return id; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ObservableTuple other = (ObservableTuple) obj; if (id != other.id) return false; return true; } public int getId() { return id; } @Override public int size() { return tuple.size(); } @Override public boolean isEmpty() { return tuple.isEmpty(); } @Override public boolean containsKey(Object key) { return tuple.containsKey(key); } @Override public boolean containsValue(Object value) { return tuple.containsValue(value); } @Override public Object remove(Object key) { return tuple.remove(key); } @Override public void putAll(Map<? extends String, ? extends Object> m) { tuple.putAll(m); } @Override public void clear() { tuple.clear(); } @Override public Set<String> keySet() { return tuple.keySet(); } @Override public Collection<Object> values() { return tuple.values(); } @Override public Set<java.util.Map.Entry<String, Object>> entrySet() { return tuple.entrySet(); } public Tuple getTuple() { return tuple; } }