From b3d0303f32140ca24ca65f4bcc10d8769a99a7cd Mon Sep 17 00:00:00 2001 From: Brian Chung Date: Tue, 15 Nov 2016 16:04:18 -0800 Subject: [PATCH] Upgrade to rxjava2 --- gradle.properties | 2 +- libraries.gradle | 2 +- ...riber.java => DeferredResultObserver.java} | 17 +++++------ .../async/ObservableDeferredResult.java | 6 ++-- .../rxjava/async/ObservableSseEmitter.java | 6 ++-- ....java => ResponseBodyEmitterObserver.java} | 17 +++++------ .../rxjava/async/SingleDeferredResult.java | 6 ++-- .../config/RxJavaMvcAutoConfiguration.java | 4 +-- .../mvc/ObservableReturnValueHandler.java | 2 +- .../rxjava/mvc/SingleReturnValueHandler.java | 2 +- .../io/jmnarloch/spring/boot/rxjava/Demo.java | 2 +- .../async/ObservableDeferredResultTest.java | 8 +++--- .../async/ObservableSseEmitterTest.java | 2 +- .../async/SingleDeferredResultTest.java | 2 +- .../mvc/ObservableReturnValueHandlerTest.java | 28 ++++++++++++++++--- .../mvc/SingleReturnValueHandlerTest.java | 2 +- 16 files changed, 61 insertions(+), 47 deletions(-) rename src/main/java/io/jmnarloch/spring/boot/rxjava/async/{DeferredResultSubscriber.java => DeferredResultObserver.java} (76%) rename src/main/java/io/jmnarloch/spring/boot/rxjava/async/{ResponseBodyEmitterSubscriber.java => ResponseBodyEmitterObserver.java} (80%) diff --git a/gradle.properties b/gradle.properties index dfa5e8c..eeaf91e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ #Mon, 25 Jan 2016 00:55:50 +0100 -version=1.0.1-SNAPSHOT +version=2.0.0-SNAPSHOT diff --git a/libraries.gradle b/libraries.gradle index 53dac6f..6f56678 100644 --- a/libraries.gradle +++ b/libraries.gradle @@ -7,7 +7,7 @@ ext { springBootWeb : 'org.springframework.boot:spring-boot-starter-web:1.3.1.RELEASE', springBootTest : 'org.springframework.boot:spring-boot-starter-test:1.3.1.RELEASE', - rxJava : 'io.reactivex:rxjava:1.0.14', + rxJava : 'io.reactivex.rxjava2:rxjava:2.0.0', junit : 'junit:junit:4.12', mockito : 'org.mockito:mockito-all:1.10.19' diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultSubscriber.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultObserver.java similarity index 76% rename from src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultSubscriber.java rename to src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultObserver.java index 2d4e199..1dd896a 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultSubscriber.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/DeferredResultObserver.java @@ -15,10 +15,9 @@ */ package io.jmnarloch.spring.boot.rxjava.async; +import io.reactivex.Observable; +import io.reactivex.observers.DisposableObserver; import org.springframework.web.context.request.async.DeferredResult; -import rx.Observable; -import rx.Subscriber; -import rx.Subscription; /** * A subscriber that sets the single value produced by the {@link Observable} on the {@link DeferredResult}. @@ -27,17 +26,15 @@ * @author Robert Danci * @see DeferredResult */ -class DeferredResultSubscriber extends Subscriber implements Runnable { +class DeferredResultObserver extends DisposableObserver implements Runnable { private final DeferredResult deferredResult; - private final Subscription subscription; - - public DeferredResultSubscriber(Observable observable, DeferredResult deferredResult) { + public DeferredResultObserver(Observable observable, DeferredResult deferredResult) { this.deferredResult = deferredResult; this.deferredResult.onTimeout(this); this.deferredResult.onCompletion(this); - this.subscription = observable.subscribe(this); + observable.subscribe(this); } @Override @@ -51,11 +48,11 @@ public void onError(Throwable e) { } @Override - public void onCompleted() { + public void onComplete() { } @Override public void run() { - this.subscription.unsubscribe(); + this.dispose(); } } diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResult.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResult.java index b2f352b..822f30b 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResult.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResult.java @@ -17,7 +17,7 @@ import org.springframework.util.Assert; import org.springframework.web.context.request.async.DeferredResult; -import rx.Observable; +import io.reactivex.Observable; import java.util.List; @@ -31,7 +31,7 @@ public class ObservableDeferredResult extends DeferredResult> { private static final Object EMPTY_RESULT = new Object(); - private final DeferredResultSubscriber> subscriber; + private final DeferredResultObserver> observer; public ObservableDeferredResult(Observable observable) { this(null, EMPTY_RESULT, observable); @@ -45,6 +45,6 @@ public ObservableDeferredResult(Long timeout, Object timeoutResult, Observable>(observable.toList(), this); + observer = new DeferredResultObserver>(observable.toList().toObservable(), this); } } diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitter.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitter.java index c885fcf..c9bb64f 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitter.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitter.java @@ -17,7 +17,7 @@ import org.springframework.http.MediaType; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import rx.Observable; +import io.reactivex.Observable; /** * A specialized {@link SseEmitter} that handles {@link Observable} types. The emitter subscribes to the @@ -28,7 +28,7 @@ */ public class ObservableSseEmitter extends SseEmitter { - private final ResponseBodyEmitterSubscriber subscriber; + private final ResponseBodyEmitterObserver observer; public ObservableSseEmitter(Observable observable) { this(null, observable); @@ -40,6 +40,6 @@ public ObservableSseEmitter(MediaType mediaType, Observable observable) { public ObservableSseEmitter(Long timeout, MediaType mediaType, Observable observable) { super(timeout); - this.subscriber = new ResponseBodyEmitterSubscriber(mediaType, observable, this); + this.observer = new ResponseBodyEmitterObserver(mediaType, observable, this); } } diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterSubscriber.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterObserver.java similarity index 80% rename from src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterSubscriber.java rename to src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterObserver.java index 823b9e3..60095d6 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterSubscriber.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/ResponseBodyEmitterObserver.java @@ -15,11 +15,10 @@ */ package io.jmnarloch.spring.boot.rxjava.async; +import io.reactivex.Observable; +import io.reactivex.observers.DisposableObserver; import org.springframework.http.MediaType; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; -import rx.Observable; -import rx.Subscriber; -import rx.Subscription; import java.io.IOException; @@ -29,23 +28,21 @@ * * @author Jakub Narloch */ -class ResponseBodyEmitterSubscriber extends Subscriber implements Runnable { +class ResponseBodyEmitterObserver extends DisposableObserver implements Runnable { private final MediaType mediaType; - private final Subscription subscription; - private final ResponseBodyEmitter responseBodyEmitter; private boolean completed; - public ResponseBodyEmitterSubscriber(MediaType mediaType, Observable observable, ResponseBodyEmitter responseBodyEmitter) { + public ResponseBodyEmitterObserver(MediaType mediaType, Observable observable, ResponseBodyEmitter responseBodyEmitter) { this.mediaType = mediaType; this.responseBodyEmitter = responseBodyEmitter; this.responseBodyEmitter.onTimeout(this); this.responseBodyEmitter.onCompletion(this); - this.subscription = observable.subscribe(this); + observable.subscribe(this); } @Override @@ -66,7 +63,7 @@ public void onError(Throwable e) { } @Override - public void onCompleted() { + public void onComplete() { if(!completed) { completed = true; responseBodyEmitter.complete(); @@ -75,6 +72,6 @@ public void onCompleted() { @Override public void run() { - subscription.unsubscribe(); + this.dispose(); } } diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResult.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResult.java index 54cb610..3e0a418 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResult.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResult.java @@ -17,7 +17,7 @@ import org.springframework.util.Assert; import org.springframework.web.context.request.async.DeferredResult; -import rx.Single; +import io.reactivex.Single; /** * A specialized {@link DeferredResult} that handles {@link Single} return type. @@ -29,7 +29,7 @@ public class SingleDeferredResult extends DeferredResult { private static final Object EMPTY_RESULT = new Object(); - private final DeferredResultSubscriber subscriber; + private final DeferredResultObserver observer; public SingleDeferredResult(Single single) { this(null, EMPTY_RESULT, single); @@ -43,6 +43,6 @@ public SingleDeferredResult(Long timeout, Object timeoutResult, Single single super(timeout, timeoutResult); Assert.notNull(single, "single can not be null"); - subscriber = new DeferredResultSubscriber(single.toObservable(), this); + observer = new DeferredResultObserver(single.toObservable(), this); } } diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/config/RxJavaMvcAutoConfiguration.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/config/RxJavaMvcAutoConfiguration.java index db86b98..849b6a5 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/config/RxJavaMvcAutoConfiguration.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/config/RxJavaMvcAutoConfiguration.java @@ -27,8 +27,8 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import rx.Observable; -import rx.Single; +import io.reactivex.Observable; +import io.reactivex.Single; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandler.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandler.java index c2bec4f..064e5ff 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandler.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandler.java @@ -21,7 +21,7 @@ import org.springframework.web.context.request.async.WebAsyncUtils; import org.springframework.web.method.support.AsyncHandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; -import rx.Observable; +import io.reactivex.Observable; /** * A specialized {@link AsyncHandlerMethodReturnValueHandler} that handles {@link Observable} return types. diff --git a/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandler.java b/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandler.java index 09cab77..0da1c74 100644 --- a/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandler.java +++ b/src/main/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandler.java @@ -21,7 +21,7 @@ import org.springframework.web.context.request.async.WebAsyncUtils; import org.springframework.web.method.support.AsyncHandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; -import rx.Single; +import io.reactivex.Single; /** * A specialized {@link AsyncHandlerMethodReturnValueHandler} that handles {@link Single} return types. diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/Demo.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/Demo.java index e562906..f28a306 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/Demo.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/Demo.java @@ -36,7 +36,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Observable; +import io.reactivex.Observable; import java.util.Date; import java.util.List; diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResultTest.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResultTest.java index 402e178..3ba25ab 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResultTest.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableDeferredResultTest.java @@ -34,8 +34,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Observable; -import rx.functions.Func1; +import io.reactivex.Observable; +import io.reactivex.functions.Function; import java.util.Arrays; import java.util.Collections; @@ -101,9 +101,9 @@ public ObservableDeferredResult error() { @RequestMapping(method = RequestMethod.GET, value = "/timeout") public ObservableDeferredResult timeout() { - return new ObservableDeferredResult(Observable.timer(1, TimeUnit.MINUTES).map(new Func1() { + return new ObservableDeferredResult(Observable.timer(1, TimeUnit.MINUTES).map(new Function() { @Override - public String call(Long aLong) { + public String apply(Long aLong) { return "single value"; } })); diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitterTest.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitterTest.java index 3f95bf8..bdb88d5 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitterTest.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/ObservableSseEmitterTest.java @@ -32,7 +32,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Observable; +import io.reactivex.Observable; import java.util.Date; import java.util.GregorianCalendar; diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResultTest.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResultTest.java index 4670721..bd0da44 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResultTest.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/async/SingleDeferredResultTest.java @@ -32,7 +32,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Single; +import io.reactivex.Single; import java.util.Date; diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandlerTest.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandlerTest.java index e399c63..c957587 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandlerTest.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/ObservableReturnValueHandlerTest.java @@ -15,8 +15,11 @@ */ package io.jmnarloch.spring.boot.rxjava.mvc; +import io.reactivex.Observable; +import io.reactivex.functions.Function; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; @@ -31,9 +34,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Observable; -import rx.functions.Func1; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import javax.annotation.PostConstruct; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -64,6 +70,20 @@ public class ObservableReturnValueHandlerTest { @RestController protected static class Application { + @Autowired + private RequestMappingHandlerAdapter adapter; + + @PostConstruct + public void prioritizeCustomReturnValueHandlers () { + final List returnValueHandlers = + new ArrayList<>(adapter.getReturnValueHandlers()); + final List customReturnValueHandlers = + adapter.getCustomReturnValueHandlers(); + returnValueHandlers.removeAll(customReturnValueHandlers); + returnValueHandlers.addAll(0, customReturnValueHandlers); + adapter.setReturnValueHandlers(returnValueHandlers); + } + @RequestMapping(method = RequestMethod.GET, value = "/empty") public Observable empty() { return Observable.empty(); @@ -86,9 +106,9 @@ public Observable error() { @RequestMapping(method = RequestMethod.GET, value = "/timeout") public Observable timeout() { - return Observable.timer(1, TimeUnit.MINUTES).map(new Func1() { + return Observable.timer(1, TimeUnit.MINUTES).map(new Function() { @Override - public String call(Long aLong) { + public String apply(Long aLong) { return "single value"; } }); diff --git a/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandlerTest.java b/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandlerTest.java index bece31a..558fe2b 100644 --- a/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandlerTest.java +++ b/src/test/java/io/jmnarloch/spring/boot/rxjava/mvc/SingleReturnValueHandlerTest.java @@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import rx.Single; +import io.reactivex.Single; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull;