Specialize JSONCodec to JSONValueWriter
[yangtools.git] / common / util / src / main / java / org / opendaylight / yangtools / util / ListenerRegistry.java
index f44f9f1ceaf7e69822018c72eec1f60a8c024d25..ea6a870ffaf4d9926578ae972df3e7ac544f244b 100644 (file)
@@ -10,26 +10,25 @@ package org.opendaylight.yangtools.util;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
-import java.util.Collections;
+import java.util.Collection;
 import java.util.EventListener;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Consumer;
 import java.util.stream.Stream;
-import javax.annotation.concurrent.ThreadSafe;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Mutable;
 
-@ThreadSafe
+/**
+ * A registry of EventListeners, maintaining a set of registrations. This class is thread-safe.
+ *
+ * @param <T> Type of listeners this registry handles
+ * @deprecated Use {@link ObjectRegistry} instead
+ */
+@Deprecated(since = "12.0.0", forRemoval = true)
 public final class ListenerRegistry<T extends EventListener> implements Mutable {
-
-    private final Set<ListenerRegistration<? extends T>> listeners = ConcurrentHashMap.newKeySet();
-    // This conversion is known to be safe.
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private final Set<ListenerRegistration<T>> unmodifiableView = (Set) Collections.unmodifiableSet(listeners);
-
+    private final Set<RegistrationImpl<? extends T>> listeners = ConcurrentHashMap.newKeySet();
     private final String name;
 
     private ListenerRegistry(final String name) {
@@ -44,8 +43,8 @@ public final class ListenerRegistry<T extends EventListener> implements Mutable
         return new ListenerRegistry<>(requireNonNull(name));
     }
 
-    public @NonNull Set<? extends ListenerRegistration<? extends T>> getRegistrations() {
-        return unmodifiableView;
+    public void clear() {
+        listeners.stream().forEach(RegistrationImpl::close);
     }
 
     public boolean isEmpty() {
@@ -53,11 +52,11 @@ public final class ListenerRegistry<T extends EventListener> implements Mutable
     }
 
     public Stream<? extends T> streamListeners() {
-        return listeners.stream().map(ListenerRegistration::getInstance);
+        return listeners.stream().filter(RegistrationImpl::notClosed).map(RegistrationImpl::getInstance);
     }
 
-    public <L extends T> @NonNull  ListenerRegistration<L> register(final L listener) {
-        final ListenerRegistration<L> ret = new ListenerRegistrationImpl<>(listener, listeners::remove);
+    public <L extends T> @NonNull ListenerRegistration<L> register(final L listener) {
+        final RegistrationImpl<L> ret = new RegistrationImpl<>(listener, listeners);
         listeners.add(ret);
         return ret;
     }
@@ -70,20 +69,19 @@ public final class ListenerRegistry<T extends EventListener> implements Mutable
                 .toString();
     }
 
-    private static final class ListenerRegistrationImpl<T extends EventListener>
-            extends AbstractListenerRegistration<T> {
-        private Consumer<ListenerRegistration<? super T>> removeCall;
+    private static final class RegistrationImpl<T extends EventListener> extends AbstractListenerRegistration<T> {
+        private Collection<?> removeFrom;
 
-        ListenerRegistrationImpl(final T instance, final Consumer<ListenerRegistration<? super T>> removeCall) {
+        RegistrationImpl(final T instance, final Collection<?> removeFrom) {
             super(instance);
-            this.removeCall = requireNonNull(removeCall);
+            this.removeFrom = requireNonNull(removeFrom);
         }
 
         @Override
         protected void removeRegistration() {
-            removeCall.accept(this);
+            removeFrom.remove(this);
             // Do not retain reference to that state
-            removeCall = null;
+            removeFrom = null;
         }
     }
 }