/** * */ package com.yoursway.commons.dependencies; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; import com.yoursway.commons.dependencies.internal.DependencyCollector; import com.yoursway.utils.disposable.DisposableImpl; import com.yoursway.utils.disposable.DisposedException; import com.yoursway.utils.disposable.Disposer; public abstract class DependentSection extends DisposableImpl implements Observer, Runnable { private Map<Mutable, Boolean> previousDependencies = new IdentityHashMap<Mutable, Boolean>(); protected DependentSection(Disposer disposer) { super(disposer); execute(); } public final void observedObjectDidChange() { execute(); } private void execute() { for (Map.Entry<Mutable, Boolean> entry : previousDependencies .entrySet()) entry.setValue(Boolean.FALSE); try { Dependencies.run(this, new DependencyCollector() { public void dependency(Mutable observable) { if (previousDependencies.put(observable, Boolean.TRUE) == null) EventBus.subscribe(observable, DependentSection.this); } }); for (Iterator<Map.Entry<Mutable, Boolean>> iterator = previousDependencies .entrySet().iterator(); iterator.hasNext();) { Map.Entry<Mutable, Boolean> entry = iterator.next(); if (entry.getValue() == Boolean.FALSE) { EventBus.unsubscribe(entry.getKey(), DependentSection.this); iterator.remove(); } } } catch (DisposedException e) { dispose(); } } @Override protected void disposeAdditionalResources() { for (Map.Entry<Mutable, Boolean> entry : previousDependencies .entrySet()) EventBus.unsubscribe(entry.getKey(), DependentSection.this); previousDependencies.clear(); super.disposeAdditionalResources(); } }