
com.github.davidmoten.rx.subjects.PublishSubjectSingleSubscriber Maven / Gradle / Ivy
package com.github.davidmoten.rx.subjects;
import java.util.concurrent.atomic.AtomicReference;
import rx.Subscriber;
import rx.subjects.Subject;
/**
* A {@link Subject} that supports a maximum of one {@link Subscriber}. When
* there is no subscriber any notifications (onNext
,
* onError
, onCompleted
) are ignored.
*
* @param
* type of items being emitted/observed by this subject
*/
public final class PublishSubjectSingleSubscriber extends Subject {
// Visible for testing
static final String ONLY_ONE_SUBSCRIPTION_IS_ALLOWED = "only one subscription is allowed";
private final SingleSubscribeOnSubscribe onSubscribe;
private PublishSubjectSingleSubscriber(SingleSubscribeOnSubscribe onSubscribe) {
super(onSubscribe);
this.onSubscribe = onSubscribe;
}
private PublishSubjectSingleSubscriber() {
this(new SingleSubscribeOnSubscribe());
}
/**
* Returns a new instance of a {@link PublishSubjectSingleSubscriber}.
*
* @return the new instance
* @param
* type of items being emitted/observed by this subject
*/
public static PublishSubjectSingleSubscriber create() {
return new PublishSubjectSingleSubscriber();
}
@Override
public void onCompleted() {
Subscriber super T> sub = onSubscribe.subscriber.get();
if (sub != null) {
sub.onCompleted();
}
}
@Override
public void onError(Throwable e) {
Subscriber super T> sub = onSubscribe.subscriber.get();
if (sub != null) {
sub.onError(e);
}
}
@Override
public void onNext(T t) {
Subscriber super T> sub = onSubscribe.subscriber.get();
if (sub != null) {
sub.onNext(t);
}
}
private static class SingleSubscribeOnSubscribe implements OnSubscribe {
final AtomicReference> subscriber = new AtomicReference>();
@Override
public void call(Subscriber super T> sub) {
if (!subscriber.compareAndSet(null, sub))
throw new RuntimeException(ONLY_ONE_SUBSCRIPTION_IS_ALLOWED);
}
}
@Override
public boolean hasObservers() {
return onSubscribe.subscriber.get() != null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy