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

io.reactiverse.reactivecontexts.propagators.rxjava1.ContextPropagatorOnObservableCreateAction Maven / Gradle / Ivy

The newest version!
package io.reactiverse.reactivecontexts.propagators.rxjava1;

import io.reactiverse.reactivecontexts.core.Context;
import io.reactiverse.reactivecontexts.core.ContextState;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
import rx.functions.Func1;

public class ContextPropagatorOnObservableCreateAction implements Func1 {

	@Override
	public OnSubscribe call(OnSubscribe t) {
		return new ContextCapturerObservable(t);
	}

	final static class ContextCapturerObservable implements Observable.OnSubscribe {

	    final Observable.OnSubscribe source;

		private ContextState states;

	    public ContextCapturerObservable(Observable.OnSubscribe source) {
	        this.source = source;
	        states = Context.capture();
	    }

		@Override
		public void call(Subscriber t) {
			ContextState previousStates = states.install();
			try {
	    		source.call(new OnAssemblyObservableSubscriber(t, states));
			}finally {
				previousStates.restore();
			}

		}

	    static final class OnAssemblyObservableSubscriber extends Subscriber {

	        final Subscriber actual;
			private final ContextState states;

	        public OnAssemblyObservableSubscriber(Subscriber actual, ContextState states) {
	        	super(actual);
	            this.actual = actual;
	            this.states = states;
	            actual.add(this);
	        }

	        @Override
	        public void onError(Throwable e) {
	        	ContextState previousStates = states.install();
				try {
					actual.onError(e);
				}finally {
					previousStates.restore();
				}
	        }

	        @Override
	        public void onNext(T t) {
	        	ContextState previousStates = states.install();
				try {
					actual.onNext(t);
				}finally {
					previousStates.restore();
				}
	        }

	        @Override
	        public void onCompleted() {
	        	ContextState previousStates = states.install();
				try {
					actual.onCompleted();
				}finally {
					previousStates.restore();
				}
	        }
        }
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy