From 8d50bce120395bda6723519eeb392cb615c04df4 Mon Sep 17 00:00:00 2001 From: hantsy Date: Tue, 28 Sep 2021 16:06:59 +0800 Subject: [PATCH] chore: add Smallrye Mutiny support --- pom.xml | 8 ++++ .../util/ReactiveWrapperConverters.java | 44 +++++++++++++++++++ .../repository/util/ReactiveWrappers.java | 7 ++- .../ReactiveWrapperConvertersUnitTests.java | 9 ++++ .../util/ReactiveWrappersUnitTests.java | 6 +++ 5 files changed, 73 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96d5e3af98..3b40363778 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,14 @@ true + + + io.smallrye.reactive + mutiny + ${smallrye-mutiny} + true + + diff --git a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java index 74f445a005..d0e449aa38 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java @@ -17,6 +17,8 @@ import io.reactivex.Flowable; import io.reactivex.Maybe; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; import kotlinx.coroutines.flow.Flow; import kotlinx.coroutines.flow.FlowKt; import kotlinx.coroutines.reactive.ReactiveFlowKt; @@ -104,6 +106,11 @@ public abstract class ReactiveWrapperConverters { REACTIVE_WRAPPERS.add(FlowWrapper.INSTANCE); } + if (ReactiveWrappers.isAvailable(ReactiveLibrary.MUTINY)) { + REACTIVE_WRAPPERS.add(UniWrapper.INSTANCE); + REACTIVE_WRAPPERS.add(MultiWrapper.INSTANCE); + } + registerConvertersIn(GENERIC_CONVERSION_SERVICE); } @@ -527,6 +534,43 @@ public io.reactivex.rxjava3.core.Flowable map(Object wrapper, Function> { + + INSTANCE; + + @Override + public Class> getWrapperClass() { + return io.smallrye.mutiny.Uni.class; + } + + @Override + public io.smallrye.mutiny.Uni map(Object wrapper, Function function) { + return ((io.smallrye.mutiny.Uni) wrapper).map(function::apply); + } + } + + /** + * Wrapper for SmallRye Mutiny's {@link io.smallrye.mutiny.Multi}. + */ + private enum MultiWrapper implements ReactiveTypeWrapper> { + + INSTANCE; + + @Override + public Class> getWrapperClass() { + return io.smallrye.mutiny.Multi.class; + } + + @Override + public io.smallrye.mutiny.Multi map(Object wrapper, Function function) { + return ((io.smallrye.mutiny.Multi) wrapper).map(function::apply); + } + } + + // ------------------------------------------------------------------------- // ReactiveStreams converters // ------------------------------------------------------------------------- diff --git a/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java b/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java index d30c464d80..f3d793221b 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java @@ -83,6 +83,9 @@ public abstract class ReactiveWrappers { private static final boolean KOTLIN_COROUTINES_PRESENT = ClassUtils.isPresent("kotlinx.coroutines.reactor.MonoKt", ReactiveWrappers.class.getClassLoader()); + private static final boolean MUTINY_PRESENT = ClassUtils.isPresent("io.smallrye.mutiny.Multi", + ReactiveWrappers.class.getClassLoader()); + private ReactiveWrappers() {} /** @@ -104,7 +107,7 @@ public enum ReactiveLibrary { * @deprecated since 2.6, use RxJava 3 instead. To be removed with Spring Data 3.0. */ @Deprecated - RXJAVA2, RXJAVA3, KOTLIN_COROUTINES; + RXJAVA2, RXJAVA3, KOTLIN_COROUTINES, MUTINY; } /** @@ -138,6 +141,8 @@ public static boolean isAvailable(ReactiveLibrary reactiveLibrary) { return RXJAVA3_PRESENT; case KOTLIN_COROUTINES: return PROJECT_REACTOR_PRESENT && KOTLIN_COROUTINES_PRESENT; + case MUTINY: + return MUTINY_PRESENT; default: throw new IllegalArgumentException(String.format("Reactive library %s not supported", reactiveLibrary)); } diff --git a/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java b/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java index b196901d0f..6b8f299156 100644 --- a/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java @@ -18,6 +18,8 @@ import static org.assertj.core.api.AssertionsForClassTypes.*; import io.reactivex.Maybe; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; import kotlinx.coroutines.flow.Flow; import kotlinx.coroutines.flow.FlowKt; import kotlinx.coroutines.reactive.ReactiveFlowKt; @@ -82,6 +84,13 @@ void shouldSupportKotlinFlow() { assertThat(ReactiveWrapperConverters.supports(io.reactivex.rxjava3.core.Completable.class)).isTrue(); } + @Test + void shouldSupportMutinyTypes() { + + assertThat(ReactiveWrapperConverters.supports(Uni.class)).isTrue(); + assertThat(ReactiveWrapperConverters.supports(Multi.class)).isTrue(); + } + @Test // DATACMNS-836 void toWrapperShouldCastMonoToMono() { diff --git a/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java b/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java index 449a1fe395..9ec9471ebc 100644 --- a/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java @@ -55,6 +55,8 @@ void isSingleLikeShouldReportCorrectNoTypes() { assertThat(ReactiveWrappers.isNoValueType(io.reactivex.rxjava3.core.Maybe.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(io.reactivex.rxjava3.core.Flowable.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(io.reactivex.rxjava3.core.Observable.class)).isFalse(); + assertThat(ReactiveWrappers.isNoValueType(io.smallrye.mutiny.Uni.class)).isFalse(); + assertThat(ReactiveWrappers.isNoValueType(io.smallrye.mutiny.Multi.class)).isFalse(); } @Test // DATACMNS-836, DATACMNS-1653, DATACMNS-1753 @@ -77,6 +79,8 @@ void isSingleLikeShouldReportCorrectSingleTypes() { assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.rxjava3.core.Maybe.class)).isTrue(); assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.rxjava3.core.Flowable.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.rxjava3.core.Observable.class)).isFalse(); + assertThat(ReactiveWrappers.isSingleValueType(io.smallrye.mutiny.Uni.class)).isTrue(); + assertThat(ReactiveWrappers.isSingleValueType(io.smallrye.mutiny.Multi.class)).isFalse(); } @Test // DATACMNS-836, DATACMNS-1653, DATACMNS-1753 @@ -97,5 +101,7 @@ void isCollectionLikeShouldReportCorrectCollectionTypes() { assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.rxjava3.core.Completable.class)).isFalse(); assertThat(ReactiveWrappers.isMultiValueType(io.reactivex.rxjava3.core.Flowable.class)).isTrue(); assertThat(ReactiveWrappers.isMultiValueType(io.reactivex.rxjava3.core.Observable.class)).isTrue(); + assertThat(ReactiveWrappers.isMultiValueType(io.smallrye.mutiny.Uni.class)).isFalse(); + assertThat(ReactiveWrappers.isMultiValueType(io.smallrye.mutiny.Multi.class)).isTrue(); } }