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

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

package io.reactiverse.reactivecontexts.propagators.rxjava1;

import io.reactiverse.reactivecontexts.core.Context;
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 Object[] states;

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

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

	    static final class OnAssemblyObservableSubscriber extends Subscriber {

	        final Subscriber actual;
			private final Object[] states;


	        public OnAssemblyObservableSubscriber(Subscriber actual, Object[] states) {
	            this.actual = actual;
	            this.states = states;
	            actual.add(this);
	        }

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

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

	        @Override
	        public void onCompleted() {
	        	Object[] previousStates = Context.install(states);
				try {
					actual.onCompleted();
				}finally {
					Context.restore(previousStates);
				}
	        }
}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy