@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { onError(e_); } else { s.request(1); } return; } actual.onNext(v); }
@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { onError(e_); } else { s.request(1); } return; } actual.onNext(v); }
@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } else { s.request(1); } Operators.onDiscard(t, this.ctx); return; } if (b) { actual.onNext(t); } else { Operators.onDiscard(t, this.ctx); s.request(1); } }
@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } else { s.request(1); } Operators.onDiscard(t, this.ctx); return; } if (b) { actual.onNext(t); } else { s.request(1); Operators.onDiscard(t, this.ctx); } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return true; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); return actual.tryOnNext(v); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { onError(e_); return true; } else { return false; } } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return true; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); return actual.tryOnNext(v); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { done = true; actual.onError(e_); return true; } else { return false; } } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return false; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } Operators.onDiscard(t, this.ctx); return false; } if (b) { return actual.tryOnNext(t); } else { Operators.onDiscard(t, this.ctx); return false; } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return false; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } Operators.onDiscard(t, this.ctx); return false; } if (b) { actual.onNext(t); return true; } Operators.onDiscard(t, this.ctx); return false; }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return false; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } Operators.onDiscard(t, this.ctx); return false; } if (b) { actual.onNext(t); } else { Operators.onDiscard(t, this.ctx); } return b; }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, this.ctx); return false; } boolean b; try { b = predicate.test(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, this.ctx, s); if (e_ != null) { onError(e_); } Operators.onDiscard(t, this.ctx); return false; } if (b) { return actual.tryOnNext(t); } else { Operators.onDiscard(t, this.ctx); return false; } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return false; } final Consumer<? super T> nextHook = parent.onNextCall(); if (nextHook != null) { try { nextHook.accept(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ == null) { return false; } else { onError(e_); return true; } } } return actual.tryOnNext(t); }
@Override public void onNext(T t) { if (sourceMode == ASYNC) { actual.onNext(null); } else { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { onError(e_); } else { s.request(1); } return; } actual.onNext(v); } }
@Override public void onNext(T t) { if (sourceMode == ASYNC) { actual.onNext(null); } else { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } R v; try { v = Objects.requireNonNull(mapper.apply(t), "The mapper returned a null value."); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ != null) { onError(e_); } else { s.request(1); } return; } actual.onNext(v); } }
@Override public boolean tryOnNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return false; } final Consumer<? super T> nextHook = parent.onNextCall(); if (nextHook != null) { try { nextHook.accept(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ == null) { return false; } else { onError(e_); return true; } } } return actual.tryOnNext(t); }
@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } final Consumer<? super T> nextHook = parent.onNextCall(); if(nextHook != null) { try { nextHook.accept(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ == null) { request(1); return; } else { onError(e_); return; } } } actual.onNext(t); }
@Override public void onNext(T t) { if (done) { Operators.onNextDropped(t, actual.currentContext()); return; } final Consumer<? super T> nextHook = parent.onNextCall(); if (nextHook != null) { try { nextHook.accept(t); } catch (Throwable e) { Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s); if (e_ == null) { request(1); return; } else { onError(e_); return; } } } actual.onNext(t); }
@Test public void onNextErrorModeLocalStrategy() { List<Object> nextDropped = new ArrayList<>(); List<Object> errorDropped = new ArrayList<>(); Hooks.onNextDropped(nextDropped::add); Hooks.onErrorDropped(errorDropped::add); Hooks.onNextError(OnNextFailureStrategy.STOP); Context c = Context.of(OnNextFailureStrategy.KEY_ON_NEXT_ERROR_STRATEGY, OnNextFailureStrategy.RESUME_DROP); Exception error = new IllegalStateException("boom"); DeferredSubscription s = new Operators.DeferredSubscription(); try { assertThat(s.isCancelled()).as("s initially cancelled").isFalse(); Throwable e = Operators.onNextError("foo", error, c, s); assertThat(e).isNull(); assertThat(nextDropped).containsExactly("foo"); assertThat(errorDropped).containsExactly(error); assertThat(s.isCancelled()).as("s cancelled").isFalse(); } finally { Hooks.resetOnNextDropped(); Hooks.resetOnErrorDropped(); Hooks.resetOnNextError(); } }
@Test public void onNextFailureWithStrategyMatchingDoesntCancel() { Context context = Context.of(OnNextFailureStrategy.KEY_ON_NEXT_ERROR_STRATEGY, new OnNextFailureStrategy() { @Override public boolean test(Throwable error, @Nullable Object value) { return true; } @Nullable @Override public Throwable process(Throwable error, @Nullable Object value, Context context) { return null; } }); Operators.DeferredSubscription s = new Operators.DeferredSubscription(); Throwable t = Operators.onNextError("foo", new NullPointerException("bar"), context, s); assertThat(t).as("exception processed").isNull(); assertThat(s.isCancelled()).as("subscription cancelled").isFalse(); }
@Test public void onNextFailureWithStrategyMatchingButNotNullDoesCancel() { Context context = Context.of(OnNextFailureStrategy.KEY_ON_NEXT_ERROR_STRATEGY, new OnNextFailureStrategy() { @Override public boolean test(Throwable error, @Nullable Object value) { return true; } @Override public Throwable process(Throwable error, @Nullable Object value, Context context) { return error; } }); Operators.DeferredSubscription s = new Operators.DeferredSubscription(); Throwable t = Operators.onNextError("foo", new NullPointerException("bar"), context, s); assertThat(t).as("exception processed") .isNotNull() .isInstanceOf(NullPointerException.class) .hasNoSuppressedExceptions() .hasNoCause(); assertThat(s.isCancelled()).as("subscription cancelled").isTrue(); }
@Test public void onNextFailureWithStrategyNotMatchingDoesCancel() { Context context = Context.of(OnNextFailureStrategy.KEY_ON_NEXT_ERROR_STRATEGY, new OnNextFailureStrategy() { @Override public boolean test(Throwable error, @Nullable Object value) { return false; } @Override public Throwable process(Throwable error, @Nullable Object value, Context context) { return error; } }); Operators.DeferredSubscription s = new Operators.DeferredSubscription(); Throwable t = Operators.onNextError("foo", new NullPointerException("bar"), context, s); assertThat(t).as("exception processed") .isNotNull() .isInstanceOf(NullPointerException.class) .hasNoSuppressedExceptions() .hasNoCause(); assertThat(s.isCancelled()).as("subscription cancelled").isTrue(); }