Skip to content

Commit f5ed1b8

Browse files
committed
Refactoring in ViewResolutionResultHandler
See gh-33194
1 parent 3863b77 commit f5ed1b8

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java

+20-19
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
100100

101101
private final List<View> defaultViews = new ArrayList<>(4);
102102

103-
private final List<FragmentFormatter> fragmentFormatters = List.of(new SseFragmentFormatter());
103+
private final List<StreamHandler> streamHandlers = List.of(new SseStreamHandler());
104104

105105

106106
/**
@@ -273,10 +273,12 @@ else if (FragmentsRendering.class.isAssignableFrom(clazz)) {
273273
exchange.getResponse().setStatusCode(status);
274274
}
275275
exchange.getResponse().getHeaders().putAll(render.headers());
276-
277276
bindingContext.updateModel(exchange);
278-
Flux<Flux<DataBuffer>> renderFlux = render.fragments()
279-
.concatMap(fragment -> renderFragment(fragment, locale, bindingContext, exchange));
277+
278+
StreamHandler streamHandler = getStreamHandler(exchange);
279+
280+
Flux<Flux<DataBuffer>> renderFlux = render.fragments().concatMap(fragment ->
281+
renderFragment(fragment, streamHandler, locale, bindingContext, exchange));
280282

281283
return exchange.getResponse().writeAndFlushWith(renderFlux);
282284
}
@@ -331,7 +333,8 @@ private Mono<List<View>> resolveViews(String viewName, Locale locale) {
331333
}
332334

333335
private Mono<Flux<DataBuffer>> renderFragment(
334-
Fragment fragment, Locale locale, BindingContext bindingContext, ServerWebExchange exchange) {
336+
Fragment fragment, @Nullable StreamHandler streamHandler, Locale locale,
337+
BindingContext bindingContext, ServerWebExchange exchange) {
335338

336339
// Merge attributes from top-level model
337340
fragment.mergeAttributes(bindingContext.getModel());
@@ -343,19 +346,17 @@ private Mono<Flux<DataBuffer>> renderFragment(
343346
Mono.just(List.of(fragment.view())) :
344347
resolveViews(fragment.viewName() != null ? fragment.viewName() : getDefaultViewName(exchange), locale));
345348

346-
FragmentFormatter fragmentFormatter = getFragmentFormatter(exchange);
347-
348349
return selectedViews.flatMap(views -> render(views, fragment.model(), bindingContext, mutatedExchange))
349-
.then(Mono.fromSupplier(() -> (fragmentFormatter != null ?
350-
fragmentFormatter.format(response.getBodyFlux(), fragment, exchange) :
350+
.then(Mono.fromSupplier(() -> (streamHandler != null ?
351+
streamHandler.format(response.getBodyFlux(), fragment, exchange) :
351352
response.getBodyFlux())));
352353
}
353354

354355
@Nullable
355-
private FragmentFormatter getFragmentFormatter(ServerWebExchange exchange) {
356-
for (FragmentFormatter formatter : this.fragmentFormatters) {
357-
if (formatter.supports(exchange.getRequest())) {
358-
return formatter;
356+
private StreamHandler getStreamHandler(ServerWebExchange exchange) {
357+
for (StreamHandler handler : this.streamHandlers) {
358+
if (handler.supports(exchange.getRequest())) {
359+
return handler;
359360
}
360361
}
361362
return null;
@@ -460,7 +461,7 @@ public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends Data
460461
/**
461462
* Strategy to render fragment with stream formatting.
462463
*/
463-
private interface FragmentFormatter {
464+
private interface StreamHandler {
464465

465466
/**
466467
* Whether the formatter supports the given request.
@@ -469,20 +470,20 @@ private interface FragmentFormatter {
469470

470471
/**
471472
* Format the given fragment.
472-
* @param fragmentBuffers the fragment serialized to data buffers
473+
* @param fragmentContent the fragment serialized to data buffers
473474
* @param fragment the fragment being rendered
474475
* @param exchange the current exchange
475476
* @return the formatted fragment
476477
*/
477-
Flux<DataBuffer> format(Flux<DataBuffer> fragmentBuffers, Fragment fragment, ServerWebExchange exchange);
478+
Flux<DataBuffer> format(Flux<DataBuffer> fragmentContent, Fragment fragment, ServerWebExchange exchange);
478479

479480
}
480481

481482

482483
/**
483484
* Formatter for Server-Sent Events formatting.
484485
*/
485-
private static class SseFragmentFormatter implements FragmentFormatter {
486+
private static class SseStreamHandler implements StreamHandler {
486487

487488
@Override
488489
public boolean supports(ServerHttpRequest request) {
@@ -492,7 +493,7 @@ public boolean supports(ServerHttpRequest request) {
492493

493494
@Override
494495
public Flux<DataBuffer> format(
495-
Flux<DataBuffer> fragmentBuffers, Fragment fragment, ServerWebExchange exchange) {
496+
Flux<DataBuffer> fragmentContent, Fragment fragment, ServerWebExchange exchange) {
496497

497498
Charset charset = getCharset(exchange.getRequest());
498499
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
@@ -501,7 +502,7 @@ public Flux<DataBuffer> format(
501502

502503
return Flux.concat(
503504
Flux.just(encodeText(eventLine + "data:", charset, bufferFactory)),
504-
fragmentBuffers,
505+
fragmentContent,
505506
Flux.just(encodeText("\n\n", charset, bufferFactory)));
506507
}
507508

0 commit comments

Comments
 (0)