package org.leumasjaffe.observer; import java.lang.ref.WeakReference; import java.util.UUID; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; @UtilityClass @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class ObserverDispatch { @AllArgsConstructor @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) private static class Pair { WeakReference obj; Subscriber sub; } Multimap observers = LinkedListMultimap.create(); public void subscribe(Observable target, Object src, Subscriber sub) { observers.put(target.observableId, new Pair(new WeakReference<>(src), sub)); } public void unsubscribeAll(Object src) { if (src == null) return; observers.entries().removeIf( e -> e.getValue().obj == src ); } public void notifySubscribers(Observable target, Object src) { observers.get(target.observableId).stream().filter( p -> p.obj.get() != src ).forEach( p -> p.sub.notifyUpdate() ); } }