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) {
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() {
}
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;
}
.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;
}
}
}