All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 sub = onSubscribe.subscriber.get();
        if (sub != null) {
            sub.onCompleted();
        }
    }

    @Override
    public void onError(Throwable e) {
    	Subscriber sub = onSubscribe.subscriber.get();
        if (sub != null) {
            sub.onError(e);
        }
    }

    @Override
    public void onNext(T t) {
        Subscriber 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 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