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

com.cookingfox.rxbus_eventbus.DefaultRxBus Maven / Gradle / Ivy

The newest version!
package com.cookingfox.rxbus_eventbus;

import rx.Observable;
import rx.Observer;
import rx.Subscription;
import rx.functions.Action1;
import rx.functions.Func0;
import rx.functions.Func1;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;

import java.util.Objects;

/**
 * Default implementation of {@link RxBus}.
 */
public class DefaultRxBus implements RxBus {

    //----------------------------------------------------------------------------------------------
    // PROPERTIES
    //----------------------------------------------------------------------------------------------

    /**
     * Serialized publish subject.
     */
    protected final Subject subject;

    //----------------------------------------------------------------------------------------------
    // CONSTRUCTORS
    //----------------------------------------------------------------------------------------------

    public DefaultRxBus() {
        this(null);
    }

    public DefaultRxBus(Subject subject) {
        if (subject == null) {
            subject = PublishSubject.create();
        }

        if (!(subject instanceof SerializedSubject)) {
            subject = subject.toSerialized();
        }

        this.subject = subject;
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS: RxBusEmitter
    //----------------------------------------------------------------------------------------------

    @Override
    public  void emit(T event) {
        subject.onNext(validateEvent(event));
    }

    @Override
    public  void post(T event) {
        subject.onNext(validateEvent(event));
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS: RxBusForwarder
    //----------------------------------------------------------------------------------------------

    @Override
    public  Subscription forward(Observable source, Func0 eventProducer) {
        validateEventProducer(eventProducer);

        return source.map(o -> eventProducer.call()).subscribe(this::emit);
    }

    @Override
    public  Subscription forward(Observable source, Func0 eventProducer, Action1 onError) {
        validateEventProducer(eventProducer);

        return source.map(o -> eventProducer.call()).subscribe(this::emit, onError);
    }

    @Override
    public  Subscription forward(Observable source, Func1 eventProducer) {
        validateEventProducer(eventProducer);

        return source.map(eventProducer).subscribe(this::emit);
    }

    @Override
    public  Subscription forward(Observable source, Func1 eventProducer, Action1 onError) {
        validateEventProducer(eventProducer);

        return source.map(eventProducer).subscribe(this::emit, onError);
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS: RxBusObserver
    //----------------------------------------------------------------------------------------------

    @Override
    public Observable observe() {
        return subject.asObservable();
    }

    @Override
    public  Observable observe(Class eventClass) {
        return subject.ofType(validateEventClass(eventClass));
    }

    @Override
    public Observable on() {
        return observe();
    }

    @Override
    public  Observable on(Class eventClass) {
        return observe(eventClass);
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS: RxBusSubscriber
    //----------------------------------------------------------------------------------------------

    @Override
    public Subscription subscribe(Observer observer) {
        return subject.subscribe(observer);
    }

    @Override
    public Subscription subscribe(Action1 onNext) {
        return subject.subscribe(onNext);
    }

    @Override
    public Subscription subscribe(Action1 onNext, Action1 onError) {
        return subject.subscribe(onNext, onError);
    }

    @Override
    public  Subscription subscribe(Class eventClass, Observer observer) {
        return subject.ofType(validateEventClass(eventClass))
                .subscribe(observer);
    }

    @Override
    public  Subscription subscribe(Class eventClass, Action1 onNext) {
        return subject.ofType(validateEventClass(eventClass))
                .subscribe(onNext);
    }

    @Override
    public  Subscription subscribe(Class eventClass, Action1 onNext, Action1 onError) {
        return subject.ofType(validateEventClass(eventClass))
                .subscribe(onNext, onError);
    }

    //----------------------------------------------------------------------------------------------
    // PROTECTED METHODS
    //----------------------------------------------------------------------------------------------

    protected Object validateEvent(Object event) {
        Objects.requireNonNull(event, "Event can not be null");

        return event;
    }

    protected  Class validateEventClass(Class eventClass) {
        Objects.requireNonNull(eventClass, "Event class can not be null");

        return eventClass;
    }

    protected  Func0 validateEventProducer(Func0 eventProducer) {
        Objects.requireNonNull(eventProducer, "Event producer can not be null");

        return eventProducer;
    }

    protected  Func1 validateEventProducer(Func1 eventProducer) {
        Objects.requireNonNull(eventProducer, "Event producer can not be null");

        return eventProducer;
    }

}