ObserverDispatch.java 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package org.leumasjaffe.observer;
  2. import java.lang.ref.WeakReference;
  3. import java.util.UUID;
  4. import com.google.common.collect.LinkedListMultimap;
  5. import com.google.common.collect.Multimap;
  6. import lombok.AccessLevel;
  7. import lombok.AllArgsConstructor;
  8. import lombok.experimental.FieldDefaults;
  9. import lombok.experimental.UtilityClass;
  10. @UtilityClass
  11. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  12. public class ObserverDispatch {
  13. @AllArgsConstructor
  14. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  15. private static class Pair {
  16. WeakReference<Object> obj;
  17. Subscriber sub;
  18. }
  19. Multimap<UUID, Pair> observers = LinkedListMultimap.create();
  20. public void subscribe(Observable target, Object src, Subscriber sub) {
  21. observers.put(target.observableId, new Pair(new WeakReference<>(src), sub));
  22. }
  23. public void unsubscribeAll(Object src) {
  24. if (src == null) return;
  25. observers.entries().removeIf( e -> e.getValue().obj == src );
  26. }
  27. public void notifySubscribers(Observable target, Object src) {
  28. observers.get(target.observableId).stream().filter( p -> p.obj.get() != src ).forEach(
  29. p -> p.sub.notifyUpdate() );
  30. }
  31. }