| 123456789101112131415161718192021222324252627282930313233343536373839 |
- 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<Object> obj;
- Subscriber sub;
- }
-
- Multimap<UUID, Pair> 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() );
- }
- }
|