package ch.akuhn.values; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; public class CollectionValue<V> extends ReferenceValue<Collection<V>> implements Collection<V> { public CollectionValue(Collection<V> collection) { this.value = collection; } public CollectionValue() { this(new ArrayList<V>()); } @Override public synchronized boolean add(V element) { boolean changed = value.add(element); if (changed) changed(); return changed; } @Override public synchronized boolean addAll(Collection<? extends V> collection) { boolean changed = value.addAll(collection); if (changed) changed(); return changed; } @Override public synchronized void clear() { if (value.isEmpty()) return; value.clear(); changed(); } @Override public synchronized boolean contains(Object object) { return value.contains(object); } @Override public synchronized boolean containsAll(Collection<?> collection) { return value.containsAll(collection); } @Override public synchronized boolean isEmpty() { return value.isEmpty(); } @Override public Iterator<V> iterator() { return Collections.unmodifiableCollection(value).iterator(); } @Override public synchronized boolean remove(Object object) { boolean changed = value.remove(object); if (changed) changed(); return changed; } @Override public synchronized boolean removeAll(Collection<?> collection) { boolean changed = value.removeAll(collection); if (changed) changed(); return changed; } @Override public synchronized boolean retainAll(Collection<?> collection) { boolean changed = value.retainAll(collection); if (changed) changed(); return changed; } @Override public synchronized int size() { return value.size(); } @Override public synchronized Object[] toArray() { return value.toArray(); } @Override public synchronized <T> T[] toArray(T[] array) { return value.toArray(array); } @Override public synchronized Collection<V> getValue() { return this; } }