package nebula.data.sample; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import nebula.data.BrokerHandler; import nebula.data.DataWatcher; public class AAA extends AA implements BrokerHandler<AA> { protected AA _actualValue; protected List<DataWatcher<AA>> _listeners; public AAA() { } @Override public AA get() { return this; } @Override public AA getActualValue() { return this._actualValue; } @Override public void addWatcher(DataWatcher<AA> listener) { _listeners = _addWatcher(_listeners, listener, _actualValue); } @Override public void setNewValue(AA newValue) { this._actualValue = newValue; _notify(_listeners, newValue, _actualValue); } @Override public String getName() { return this._actualValue.getName(); } @Override public void setName(String name) { this._actualValue.setName(name); } private <TT> void _notify(List<DataWatcher<TT>> listeners, TT newValue, TT oldValue) { boolean hasLostReference = false; if (listeners == null) return; for (DataWatcher<TT> listener : listeners) { if (listener != null) { boolean result = listener.onUpdate(newValue, oldValue); if (result) break; } else { hasLostReference = true; } } if (hasLostReference) { for (int i = listeners.size() - 1; i >= 0; i--) { DataWatcher<TT> listener = listeners.get(i); if (listener == null) { listeners.remove(i); } } } } private <TT> List<DataWatcher<TT>> _addWatcher(List<DataWatcher<TT>> listeners, DataWatcher<TT> listener, TT actualValue) { if (listeners == null) { listeners = new CopyOnWriteArrayList<DataWatcher<TT>>(); } listeners.add(listener); listener.onUpdate(actualValue, null); return listeners; } }