package com.indyforge.foxnet.rmi.pattern.change.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import com.indyforge.foxnet.rmi.pattern.change.Change; /** * * @author Christopher Probst * * @param <T> */ public final class CompositeChange<T> implements Change<T> { /** * */ private static final long serialVersionUID = 1L; /* * Used to store all changes. */ private final List<Change<T>> changes = new ArrayList<Change<T>>(), readOnlyChanges = Collections.unmodifiableList(changes); /** * Collects all changes. * * @param change * The change. */ private void collect(Change<T> change) { if (change != null) { if (change instanceof CompositeChange) { // Go through all changes for (Change<T> ptr : ((CompositeChange<T>) change).changes()) { collect(ptr); } } else { this.changes.add(change); } } } public CompositeChange(Collection<? extends Change<T>> changes) { if (changes != null) { for (Change<T> change : changes) { collect(change); } } } /** * @return an unmodifiable list of all changes. */ public List<Change<T>> changes() { return readOnlyChanges; } /* * (non-Javadoc) * * @see * com.indyforge.foxnet.rmi.pattern.change.Change#apply(java.lang.Object) */ @Override public void apply(T ctx) { // Simply apply all stored changes for (Change<T> change : changes) { if (change != null) { change.apply(ctx); } } } }