29
29
import org .springframework .util .Assert ;
30
30
import org .springframework .util .ClassUtils ;
31
31
32
+ import io .reactivex .Flowable ;
32
33
import reactor .core .publisher .Flux ;
33
34
import reactor .core .publisher .Mono ;
34
35
import rx .Observable ;
@@ -76,7 +77,7 @@ private ReactiveWrapperConverters() {
76
77
* Returns whether the given type is a supported wrapper type.
77
78
*
78
79
* @param type must not be {@literal null}.
79
- * @return
80
+ * @return {@literal true} if the {@code type} is a supported reactive wrapper type.
80
81
*/
81
82
public static boolean supports (Class <?> type ) {
82
83
return assignableStream (type ).isPresent ();
@@ -86,25 +87,28 @@ public static boolean supports(Class<?> type) {
86
87
* Returns whether the type is a single-like wrapper.
87
88
*
88
89
* @param type must not be {@literal null}.
89
- * @return
90
- * @see Single
90
+ * @return {@literal true} if the {@code type} is a single-like reactive wrapper type.
91
+ * @see rx.Single
92
+ * @see io.reactivex.Single
91
93
* @see Mono
92
94
*/
93
95
public static boolean isSingleLike (Class <?> type ) {
94
- return assignableStream ( type ). map ( wrapper -> wrapper . getMultiplicity () == Multiplicity . ONE ). orElse ( false );
96
+ return ReactiveWrappers . isSingleType ( type );
95
97
}
96
98
97
99
/**
98
100
* Returns whether the type is a collection/multi-element-like wrapper.
99
101
*
100
102
* @param type must not be {@literal null}.
101
- * @return
102
- * @see Observable
103
+ * @return {@literal true} if the {@code type} is a collection/multi-element-like reactive wrapper type.
104
+ * @see rx.Observable
105
+ * @see io.reactivex.Observable
106
+ * @see io.reactivex.Flowable
103
107
* @see Flux
104
108
* @see Publisher
105
109
*/
106
110
public static boolean isCollectionLike (Class <?> type ) {
107
- return assignableStream ( type ). map ( wrapper -> wrapper . getMultiplicity () == Multiplicity . MANY ). orElse ( false );
111
+ return ReactiveWrappers . isMultiType ( type );
108
112
}
109
113
110
114
/**
@@ -114,6 +118,7 @@ public static boolean isCollectionLike(Class<?> type) {
114
118
* @param expectedWrapperType must not be {@literal null}.
115
119
* @return
116
120
*/
121
+ @ SuppressWarnings ("unchecked" )
117
122
public static <T > T toWrapper (Object stream , Class <? extends T > expectedWrapperType ) {
118
123
119
124
Assert .notNull (stream , "Stream must not be null!" );
@@ -162,59 +167,49 @@ private static Optional<AbstractReactiveWrapper<?>> findWrapper(
162
167
return REACTIVE_WRAPPERS .stream ().filter (predicate ).findFirst ();
163
168
}
164
169
165
- private abstract static class AbstractReactiveWrapper <T > {
166
-
167
- private final Class <? super T > wrapperClass ;
168
- private final Multiplicity multiplicity ;
170
+ private interface AbstractReactiveWrapper <T > {
169
171
170
- public AbstractReactiveWrapper (Class <? super T > wrapperClass , Multiplicity multiplicity ) {
171
- this .wrapperClass = wrapperClass ;
172
- this .multiplicity = multiplicity ;
173
- }
172
+ Class <? super T > getWrapperClass ();
174
173
175
- public Class <? super T > getWrapperClass () {
176
- return wrapperClass ;
177
- }
178
-
179
- public Multiplicity getMultiplicity () {
180
- return multiplicity ;
181
- }
182
-
183
- public abstract Object map (Object wrapper , Converter <Object , Object > converter );
174
+ Object map (Object wrapper , Converter <Object , Object > converter );
184
175
}
185
176
186
- private static class MonoWrapper extends AbstractReactiveWrapper <Mono <?>> {
177
+ private enum MonoWrapper implements AbstractReactiveWrapper <Mono <?>> {
187
178
188
- static final MonoWrapper INSTANCE = new MonoWrapper () ;
179
+ INSTANCE ;
189
180
190
- private MonoWrapper () {
191
- super (Mono .class , Multiplicity .ONE );
181
+ @ Override
182
+ public Class <? super Mono <?>> getWrapperClass () {
183
+ return Mono .class ;
192
184
}
193
185
186
+ @ Override
194
187
public Mono <?> map (Object wrapper , Converter <Object , Object > converter ) {
195
188
return ((Mono <?>) wrapper ).map (converter ::convert );
196
189
}
197
190
}
198
191
199
- private static class FluxWrapper extends AbstractReactiveWrapper <Flux <?>> {
192
+ private enum FluxWrapper implements AbstractReactiveWrapper <Flux <?>> {
200
193
201
- static final FluxWrapper INSTANCE = new FluxWrapper () ;
194
+ INSTANCE ;
202
195
203
- private FluxWrapper () {
204
- super (Flux .class , Multiplicity .MANY );
196
+ @ Override
197
+ public Class <? super Flux <?>> getWrapperClass () {
198
+ return Flux .class ;
205
199
}
206
200
207
201
public Flux <?> map (Object wrapper , Converter <Object , Object > converter ) {
208
202
return ((Flux <?>) wrapper ).map (converter ::convert );
209
203
}
210
204
}
211
205
212
- private static class PublisherWrapper extends AbstractReactiveWrapper <Publisher <?>> {
206
+ private enum PublisherWrapper implements AbstractReactiveWrapper <Publisher <?>> {
213
207
214
- static final PublisherWrapper INSTANCE = new PublisherWrapper () ;
208
+ INSTANCE ;
215
209
216
- public PublisherWrapper () {
217
- super (Publisher .class , Multiplicity .MANY );
210
+ @ Override
211
+ public Class <? super Publisher <?>> getWrapperClass () {
212
+ return Publisher .class ;
218
213
}
219
214
220
215
@ Override
@@ -232,12 +227,13 @@ public Publisher<?> map(Object wrapper, Converter<Object, Object> converter) {
232
227
}
233
228
}
234
229
235
- private static class RxJava1SingleWrapper extends AbstractReactiveWrapper <Single <?>> {
230
+ private enum RxJava1SingleWrapper implements AbstractReactiveWrapper <Single <?>> {
236
231
237
- static final RxJava1SingleWrapper INSTANCE = new RxJava1SingleWrapper () ;
232
+ INSTANCE ;
238
233
239
- private RxJava1SingleWrapper () {
240
- super (Single .class , Multiplicity .ONE );
234
+ @ Override
235
+ public Class <? super Single <?>> getWrapperClass () {
236
+ return Single .class ;
241
237
}
242
238
243
239
@ Override
@@ -246,12 +242,13 @@ public Single<?> map(Object wrapper, Converter<Object, Object> converter) {
246
242
}
247
243
}
248
244
249
- private static class RxJava1ObservableWrapper extends AbstractReactiveWrapper <Observable <?>> {
245
+ private enum RxJava1ObservableWrapper implements AbstractReactiveWrapper <Observable <?>> {
250
246
251
- static final RxJava1ObservableWrapper INSTANCE = new RxJava1ObservableWrapper () ;
247
+ INSTANCE ;
252
248
253
- private RxJava1ObservableWrapper () {
254
- super (Observable .class , Multiplicity .MANY );
249
+ @ Override
250
+ public Class <? super Observable <?>> getWrapperClass () {
251
+ return Observable .class ;
255
252
}
256
253
257
254
@ Override
@@ -260,12 +257,13 @@ public Observable<?> map(Object wrapper, Converter<Object, Object> converter) {
260
257
}
261
258
}
262
259
263
- private static class RxJava2SingleWrapper extends AbstractReactiveWrapper <io .reactivex .Single <?>> {
260
+ private enum RxJava2SingleWrapper implements AbstractReactiveWrapper <io .reactivex .Single <?>> {
264
261
265
- static final RxJava2SingleWrapper INSTANCE = new RxJava2SingleWrapper () ;
262
+ INSTANCE ;
266
263
267
- private RxJava2SingleWrapper () {
268
- super (io .reactivex .Single .class , Multiplicity .ONE );
264
+ @ Override
265
+ public Class <? super io .reactivex .Single <?>> getWrapperClass () {
266
+ return io .reactivex .Single .class ;
269
267
}
270
268
271
269
@ Override
@@ -274,12 +272,13 @@ public io.reactivex.Single<?> map(Object wrapper, Converter<Object, Object> conv
274
272
}
275
273
}
276
274
277
- private static class RxJava2MaybeWrapper extends AbstractReactiveWrapper <io .reactivex .Maybe <?>> {
275
+ private enum RxJava2MaybeWrapper implements AbstractReactiveWrapper <io .reactivex .Maybe <?>> {
278
276
279
- static final RxJava2MaybeWrapper INSTANCE = new RxJava2MaybeWrapper () ;
277
+ INSTANCE ;
280
278
281
- private RxJava2MaybeWrapper () {
282
- super (io .reactivex .Maybe .class , Multiplicity .MANY );
279
+ @ Override
280
+ public Class <? super io .reactivex .Maybe <?>> getWrapperClass () {
281
+ return io .reactivex .Maybe .class ;
283
282
}
284
283
285
284
@ Override
@@ -288,12 +287,13 @@ public io.reactivex.Maybe<?> map(Object wrapper, Converter<Object, Object> conve
288
287
}
289
288
}
290
289
291
- private static class RxJava2ObservableWrapper extends AbstractReactiveWrapper <io .reactivex .Observable <?>> {
290
+ private enum RxJava2ObservableWrapper implements AbstractReactiveWrapper <io .reactivex .Observable <?>> {
292
291
293
- static final RxJava2ObservableWrapper INSTANCE = new RxJava2ObservableWrapper () ;
292
+ INSTANCE ;
294
293
295
- private RxJava2ObservableWrapper () {
296
- super (io .reactivex .Observable .class , Multiplicity .MANY );
294
+ @ Override
295
+ public Class <? super io .reactivex .Observable <?>> getWrapperClass () {
296
+ return io .reactivex .Observable .class ;
297
297
}
298
298
299
299
@ Override
@@ -302,12 +302,13 @@ public io.reactivex.Observable<?> map(Object wrapper, Converter<Object, Object>
302
302
}
303
303
}
304
304
305
- private static class RxJava2FlowableWrapper extends AbstractReactiveWrapper <io .reactivex .Flowable <?>> {
305
+ private enum RxJava2FlowableWrapper implements AbstractReactiveWrapper <io .reactivex .Flowable <?>> {
306
306
307
- static final RxJava2FlowableWrapper INSTANCE = new RxJava2FlowableWrapper () ;
307
+ INSTANCE ;
308
308
309
- private RxJava2FlowableWrapper () {
310
- super (io .reactivex .Flowable .class , Multiplicity .MANY );
309
+ @ Override
310
+ public Class <? super Flowable <?>> getWrapperClass () {
311
+ return io .reactivex .Flowable .class ;
311
312
}
312
313
313
314
@ Override
@@ -316,8 +317,4 @@ public io.reactivex.Flowable<?> map(Object wrapper, Converter<Object, Object> co
316
317
}
317
318
}
318
319
319
- private enum Multiplicity {
320
- ONE , MANY ,
321
- }
322
-
323
320
}
0 commit comments