@Override public MaybeSource<Object> apply(Maybe<Object> v) throws Exception { return v.onErrorResumeNext(Maybe.just(1)); } });
/** * Instructs a Maybe to pass control to another {@link MaybeSource} rather than invoking * {@link MaybeObserver#onError onError} if it encounters an error. * <p> * <img width="640" height="310" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/onErrorResumeNext.png" alt=""> * <p> * You can use this to prevent errors from propagating or to supply fallback data should errors be * encountered. * <dl> * <dt><b>Scheduler:</b></dt> * <dd>{@code onErrorResumeNext} does not operate by default on a particular {@link Scheduler}.</dd> * </dl> * * @param next * the next {@code MaybeSource} that will take over if the source Maybe encounters * an error * @return the new Maybe instance * @see <a href="http://reactivex.io/documentation/operators/catch.html">ReactiveX operators documentation: Catch</a> */ @CheckReturnValue @NonNull @SchedulerSupport(SchedulerSupport.NONE) public final Maybe<T> onErrorResumeNext(final MaybeSource<? extends T> next) { ObjectHelper.requireNonNull(next, "next is null"); return onErrorResumeNext(Functions.justFunction(next)); }
@Override public Object transform( Object publisherResult) { if (publisherResult instanceof Maybe) { Maybe<?> maybe = (Maybe) publisherResult; // add 404 handling for maybe return maybe.onErrorResumeNext(throwable -> { if (throwable instanceof HttpClientResponseException) { HttpClientResponseException responseException = (HttpClientResponseException) throwable; if (responseException.getStatus() == HttpStatus.NOT_FOUND) { return Maybe.empty(); } } return Maybe.error(throwable); }); } return publisherResult; } }
/** * Instructs a Maybe to pass control to another MaybeSource rather than invoking * {@link MaybeObserver#onError onError} if it encounters an error. * <p> * <img width="640" height="310" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/onErrorResumeNext.png" alt=""> * <p> * You can use this to prevent errors from propagating or to supply fallback data should errors be * encountered. * <dl> * <dt><b>Scheduler:</b></dt> * <dd>{@code onErrorResumeNext} does not operate by default on a particular {@link Scheduler}.</dd> * </dl> * * @param next * the next Maybe source that will take over if the source Maybe encounters * an error * @return the new Maybe instance * @see <a href="http://reactivex.io/documentation/operators/catch.html">ReactiveX operators documentation: Catch</a> */ @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public final Maybe<T> onErrorResumeNext(final MaybeSource<? extends T> next) { ObjectHelper.requireNonNull(next, "next is null"); return onErrorResumeNext(Functions.justFunction(next)); }
@Test public void onErrorResumeNextError() { Maybe.error(new RuntimeException("some error")) .onErrorResumeNext(Maybe.empty()) .test() .assertNoValues() .assertNoErrors() .assertComplete(); }
@SuppressWarnings("unchecked") @Test public void onErrorResumeNextFunctionThrows() { TestHelper.assertCompositeExceptions(Maybe.error(new TestException()) .onErrorResumeNext(new Function<Throwable, Maybe<Object>>() { @Override public Maybe<Object> apply(Throwable v) throws Exception { throw new IOException(); } }) .test(), TestException.class, IOException.class); }
@Test public void onErrorNextDispose() { TestHelper.checkDisposed(PublishProcessor.create().singleElement().onErrorResumeNext(Maybe.just(1))); }
@Test public void onErrorResumeNextValue() { Maybe.just(1) .onErrorResumeNext(Maybe.<Integer>empty()) .test() .assertNoErrors() .assertValue(1); }
@Test public void onErrorResumeNext() { Maybe.error(new TestException()) .onErrorResumeNext(Functions.justFunction(Maybe.just(1))) .test() .assertResult(1); }
@Test public void onErrorResumeNextEmpty() { Maybe.empty() .onErrorResumeNext(Maybe.just(1)) .test() .assertNoValues() .assertNoErrors() .assertComplete(); }
@Test public void onErrorNextIsAlsoError() { Maybe.error(new TestException("Main")) .onErrorResumeNext(Maybe.error(new TestException("Secondary"))) .test() .assertFailureAndMessage(TestException.class, "Secondary"); } }
@Override public Maybe<IdentityProvider> findById(String id) { LOGGER.debug("Find identity provider by ID: {}", id); return identityProviderRepository.findById(id) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find an identity provider using its ID: {}", id, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find an identity provider using its ID: %s", id), ex)); }); }
@Override public Maybe<Scope> findById(String id) { LOGGER.debug("Find scope by ID: {}", id); return scopeRepository.findById(id) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find a scope using its ID: {}", id, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find a scope using its ID: %s", id), ex)); }); }
@Override public Maybe<Group> findById(String id) { LOGGER.debug("Find group by id : {}", id); return groupRepository.findById(id) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find a group using its ID", id, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find a group using its ID: %s", id), ex)); }); }
@Override public Maybe<Client> findByDomainAndClientId(String domain, String clientId) { LOGGER.debug("Find client by domain: {} and client id: {}", domain, clientId); return clientRepository.findByClientIdAndDomain(clientId, domain) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find client by domain: {} and client id: {}", domain, clientId, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find client by domain: %s and client id: %s", domain, clientId), ex)); }); }
@Override public Maybe<User> get(String userId, String baseUrl) { LOGGER.debug("Find user by id : {}", userId); return userRepository.findById(userId) .map(user1 -> convert(user1, baseUrl, false)) .flatMap(scimUser -> setGroups(scimUser).toMaybe()) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find a user using its ID", userId, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find a user using its ID: %s", userId), ex)); }); }
@Override public Maybe<User> get(String userId, String baseUrl) { LOGGER.debug("Find user by id : {}", userId); return userRepository.findById(userId) .map(user1 -> convert(user1, baseUrl, false)) .flatMap(scimUser -> setGroups(scimUser).toMaybe()) .onErrorResumeNext(ex -> { LOGGER.error("An error occurs while trying to find a user using its ID", userId, ex); return Maybe.error(new TechnicalManagementException( String.format("An error occurs while trying to find a user using its ID: %s", userId), ex)); }); }
@Override protected Maybe<User> resolveResourceOwner(TokenRequest tokenRequest, Client client) { return userAuthenticationManager.loadUserByUsername(tokenRequest.getSubject()) .onErrorResumeNext(ex -> { return Maybe.error(new InvalidGrantException()); }); }
@Override protected Maybe<User> resolveResourceOwner(TokenRequest tokenRequest, Client client) { final String subject = tokenRequest.getSubject(); if (subject == null) { return Maybe.empty(); } return userAuthenticationManager.loadUserByUsername(subject) .onErrorResumeNext(ex -> { return Maybe.error(new InvalidGrantException()); }); }
@Override protected Maybe<User> resolveResourceOwner(TokenRequest tokenRequest, Client client) { final String subject = tokenRequest.getSubject(); if (subject == null) { return Maybe.empty(); } return userAuthenticationManager.loadUserByUsername(subject) .onErrorResumeNext(ex -> { return Maybe.error(new InvalidGrantException()); }); }