24
24
import java .util .Arrays ;
25
25
import java .util .LinkedHashSet ;
26
26
import java .util .List ;
27
- import java .util .Objects ;
28
27
import java .util .Set ;
29
28
import java .util .concurrent .CompletionStage ;
30
29
import java .util .function .Consumer ;
67
66
*/
68
67
final class DefaultEntityResponseBuilder <T > implements EntityResponse .Builder <T > {
69
68
70
- private static final boolean reactiveStreamsPresent ;
69
+ private static final boolean reactiveStreamsPresent = ClassUtils .isPresent (
70
+ "org.reactivestreams.Publisher" , DefaultEntityResponseBuilder .class .getClassLoader ());
71
+
71
72
72
73
private final T entity ;
73
74
@@ -79,11 +80,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
79
80
80
81
private final MultiValueMap <String , Cookie > cookies = new LinkedMultiValueMap <>();
81
82
82
- static {
83
- ClassLoader classLoader = DefaultEntityResponseBuilder .class .getClassLoader ();
84
- reactiveStreamsPresent = ClassUtils .isPresent ("org.reactivestreams.Publisher" , classLoader );
85
- }
86
-
87
83
88
84
private DefaultEntityResponseBuilder (T entity , @ Nullable Type entityType ) {
89
85
this .entity = entity ;
@@ -205,15 +201,12 @@ public EntityResponse<T> build() {
205
201
return new CompletionStageEntityResponse (this .status , this .headers , this .cookies ,
206
202
completionStage , this .entityType );
207
203
}
208
- else if (reactiveStreamsPresent &&
209
- PublisherEntityResponse .isPublisher (this .entity )) {
204
+ else if (reactiveStreamsPresent && PublisherEntityResponse .isPublisher (this .entity )) {
210
205
Publisher publisher = (Publisher ) this .entity ;
211
- return new PublisherEntityResponse (this .status , this .headers , this .cookies , publisher ,
212
- this .entityType );
206
+ return new PublisherEntityResponse (this .status , this .headers , this .cookies , publisher , this .entityType );
213
207
}
214
208
else {
215
- return new DefaultEntityResponse <>(this .status , this .headers , this .cookies , this .entity ,
216
- this .entityType );
209
+ return new DefaultEntityResponse <>(this .status , this .headers , this .cookies , this .entity , this .entityType );
217
210
}
218
211
}
219
212
@@ -232,18 +225,17 @@ public static <T> EntityResponse.Builder<T> fromObject(T t, ParameterizedTypeRef
232
225
return new DefaultEntityResponseBuilder <>(t , bodyType .getType ());
233
226
}
234
227
228
+
235
229
/**
236
230
* Default {@link EntityResponse} implementation for synchronous bodies.
237
231
*/
238
- private static class DefaultEntityResponse <T >
239
- extends DefaultServerResponseBuilder .AbstractServerResponse
232
+ private static class DefaultEntityResponse <T > extends DefaultServerResponseBuilder .AbstractServerResponse
240
233
implements EntityResponse <T > {
241
234
242
235
private final T entity ;
243
236
244
237
private final Type entityType ;
245
238
246
-
247
239
public DefaultEntityResponse (int statusCode , HttpHeaders headers ,
248
240
MultiValueMap <String , Cookie > cookies , T entity , Type entityType ) {
249
241
@@ -263,18 +255,15 @@ protected ModelAndView writeToInternal(HttpServletRequest servletRequest,
263
255
throws ServletException , IOException {
264
256
265
257
writeEntityWithMessageConverters (this .entity , servletRequest ,servletResponse , context );
266
-
267
258
return null ;
268
259
}
269
260
270
261
@ SuppressWarnings ("unchecked" )
271
- protected void writeEntityWithMessageConverters (Object entity ,
272
- HttpServletRequest request , HttpServletResponse response ,
273
- ServerResponse .Context context )
262
+ protected void writeEntityWithMessageConverters (Object entity , HttpServletRequest request ,
263
+ HttpServletResponse response , ServerResponse .Context context )
274
264
throws ServletException , IOException {
275
265
276
266
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse (response );
277
-
278
267
MediaType contentType = getContentType (response );
279
268
Class <?> entityClass = entity .getClass ();
280
269
@@ -307,9 +296,8 @@ private static MediaType getContentType(HttpServletResponse response) {
307
296
}
308
297
}
309
298
310
- protected void tryWriteEntityWithMessageConverters (Object entity ,
311
- HttpServletRequest request , HttpServletResponse response ,
312
- ServerResponse .Context context ) {
299
+ protected void tryWriteEntityWithMessageConverters (Object entity , HttpServletRequest request ,
300
+ HttpServletResponse response , ServerResponse .Context context ) {
313
301
try {
314
302
writeEntityWithMessageConverters (entity , request , response , context );
315
303
}
@@ -334,12 +322,11 @@ private static List<MediaType> producibleMediaTypes(
334
322
/**
335
323
* {@link EntityResponse} implementation for asynchronous {@link CompletionStage} bodies.
336
324
*/
337
- private static class CompletionStageEntityResponse <T >
338
- extends DefaultEntityResponse <CompletionStage <T >> {
325
+ private static class CompletionStageEntityResponse <T > extends DefaultEntityResponse <CompletionStage <T >> {
339
326
340
327
public CompletionStageEntityResponse (int statusCode , HttpHeaders headers ,
341
- MultiValueMap <String , Cookie > cookies , CompletionStage <T > entity ,
342
- Type entityType ) {
328
+ MultiValueMap <String , Cookie > cookies , CompletionStage <T > entity , Type entityType ) {
329
+
343
330
super (statusCode , headers , cookies , entity , entityType );
344
331
}
345
332
@@ -348,7 +335,6 @@ protected ModelAndView writeToInternal(HttpServletRequest servletRequest,
348
335
HttpServletResponse servletResponse , Context context ) {
349
336
350
337
AsyncContext asyncContext = servletRequest .startAsync (servletRequest , servletResponse );
351
-
352
338
entity ().whenComplete ((entity , throwable ) -> {
353
339
try {
354
340
if (entity != null ) {
@@ -370,11 +356,12 @@ else if (throwable != null) {
370
356
}
371
357
}
372
358
359
+
373
360
private static class PublisherEntityResponse <T > extends DefaultEntityResponse <Publisher <T >> {
374
361
375
362
public PublisherEntityResponse (int statusCode , HttpHeaders headers ,
376
- MultiValueMap <String , Cookie > cookies , Publisher <T > entity ,
377
- Type entityType ) {
363
+ MultiValueMap <String , Cookie > cookies , Publisher <T > entity , Type entityType ) {
364
+
378
365
super (statusCode , headers , cookies , entity , entityType );
379
366
}
380
367
@@ -384,14 +371,12 @@ protected ModelAndView writeToInternal(HttpServletRequest servletRequest,
384
371
385
372
AsyncContext asyncContext = servletRequest .startAsync (servletRequest ,
386
373
new NoContentLengthResponseWrapper (servletResponse ));
387
-
388
374
entity ().subscribe (new ProducingSubscriber (asyncContext , context ));
389
-
390
375
return null ;
391
376
}
392
377
393
- public static boolean isPublisher (Object o ) {
394
- return (o instanceof Publisher );
378
+ public static boolean isPublisher (Object entity ) {
379
+ return (entity instanceof Publisher );
395
380
}
396
381
397
382
@@ -405,16 +390,13 @@ private class ProducingSubscriber implements Subscriber<T> {
405
390
@ Nullable
406
391
private Subscription subscription ;
407
392
408
- public ProducingSubscriber (AsyncContext asyncContext ,
409
- Context context ) {
393
+ public ProducingSubscriber (AsyncContext asyncContext , Context context ) {
410
394
this .asyncContext = asyncContext ;
411
395
this .context = context ;
412
396
}
413
397
414
398
@ Override
415
399
public void onSubscribe (Subscription s ) {
416
- Objects .requireNonNull (s );
417
-
418
400
if (this .subscription == null ) {
419
401
this .subscription = s ;
420
402
this .subscription .request (Long .MAX_VALUE );
@@ -426,37 +408,25 @@ public void onSubscribe(Subscription s) {
426
408
427
409
@ Override
428
410
public void onNext (T element ) {
429
- Objects .requireNonNull (element );
430
- HttpServletRequest servletRequest =
431
- (HttpServletRequest ) this .asyncContext .getRequest ();
432
- HttpServletResponse servletResponse =
433
- (HttpServletResponse ) this .asyncContext .getResponse ();
434
-
435
- tryWriteEntityWithMessageConverters (element ,
436
- servletRequest ,
437
- servletResponse ,
438
- this .context );
411
+ HttpServletRequest servletRequest = (HttpServletRequest ) this .asyncContext .getRequest ();
412
+ HttpServletResponse servletResponse = (HttpServletResponse ) this .asyncContext .getResponse ();
413
+ tryWriteEntityWithMessageConverters (element , servletRequest , servletResponse , this .context );
439
414
}
440
415
441
416
@ Override
442
417
public void onError (Throwable t ) {
443
- Objects .requireNonNull (t );
444
-
445
- handleError (t ,
446
- (HttpServletRequest ) this .asyncContext .getRequest (),
447
- (HttpServletResponse ) this .asyncContext .getResponse (),
448
- this .context );
449
-
418
+ handleError (t , (HttpServletRequest ) this .asyncContext .getRequest (),
419
+ (HttpServletResponse ) this .asyncContext .getResponse (), this .context );
450
420
this .asyncContext .complete ();
451
421
}
452
422
453
423
@ Override
454
424
public void onComplete () {
455
425
this .asyncContext .complete ();
456
426
}
457
-
458
427
}
459
428
429
+
460
430
private static class NoContentLengthResponseWrapper extends HttpServletResponseWrapper {
461
431
462
432
public NoContentLengthResponseWrapper (HttpServletResponse response ) {
@@ -485,8 +455,6 @@ public void setContentLength(int len) {
485
455
public void setContentLengthLong (long len ) {
486
456
}
487
457
}
488
-
489
458
}
490
459
491
-
492
460
}
0 commit comments