Avoid use of Objects.requireNonNull plus related polishing
This commit is contained in:
parent
0be610b0ee
commit
8a57997d21
|
@ -24,7 +24,6 @@ import java.time.ZonedDateTime;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.CompletionStage;
|
import java.util.concurrent.CompletionStage;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
@ -67,7 +66,9 @@ import org.springframework.web.servlet.ModelAndView;
|
||||||
*/
|
*/
|
||||||
final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> {
|
final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> {
|
||||||
|
|
||||||
private static final boolean reactiveStreamsPresent;
|
private static final boolean reactiveStreamsPresent = ClassUtils.isPresent(
|
||||||
|
"org.reactivestreams.Publisher", DefaultEntityResponseBuilder.class.getClassLoader());
|
||||||
|
|
||||||
|
|
||||||
private final T entity;
|
private final T entity;
|
||||||
|
|
||||||
|
@ -79,11 +80,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
|
|
||||||
private final MultiValueMap<String, Cookie> cookies = new LinkedMultiValueMap<>();
|
private final MultiValueMap<String, Cookie> cookies = new LinkedMultiValueMap<>();
|
||||||
|
|
||||||
static {
|
|
||||||
ClassLoader classLoader = DefaultEntityResponseBuilder.class.getClassLoader();
|
|
||||||
reactiveStreamsPresent = ClassUtils.isPresent("org.reactivestreams.Publisher", classLoader);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private DefaultEntityResponseBuilder(T entity, @Nullable Type entityType) {
|
private DefaultEntityResponseBuilder(T entity, @Nullable Type entityType) {
|
||||||
this.entity = entity;
|
this.entity = entity;
|
||||||
|
@ -205,15 +201,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
return new CompletionStageEntityResponse(this.status, this.headers, this.cookies,
|
return new CompletionStageEntityResponse(this.status, this.headers, this.cookies,
|
||||||
completionStage, this.entityType);
|
completionStage, this.entityType);
|
||||||
}
|
}
|
||||||
else if (reactiveStreamsPresent &&
|
else if (reactiveStreamsPresent && PublisherEntityResponse.isPublisher(this.entity)) {
|
||||||
PublisherEntityResponse.isPublisher(this.entity)) {
|
|
||||||
Publisher publisher = (Publisher) this.entity;
|
Publisher publisher = (Publisher) this.entity;
|
||||||
return new PublisherEntityResponse(this.status, this.headers, this.cookies, publisher,
|
return new PublisherEntityResponse(this.status, this.headers, this.cookies, publisher, this.entityType);
|
||||||
this.entityType);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return new DefaultEntityResponse<>(this.status, this.headers, this.cookies, this.entity,
|
return new DefaultEntityResponse<>(this.status, this.headers, this.cookies, this.entity, this.entityType);
|
||||||
this.entityType);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,18 +225,17 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
return new DefaultEntityResponseBuilder<>(t, bodyType.getType());
|
return new DefaultEntityResponseBuilder<>(t, bodyType.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default {@link EntityResponse} implementation for synchronous bodies.
|
* Default {@link EntityResponse} implementation for synchronous bodies.
|
||||||
*/
|
*/
|
||||||
private static class DefaultEntityResponse<T>
|
private static class DefaultEntityResponse<T> extends DefaultServerResponseBuilder.AbstractServerResponse
|
||||||
extends DefaultServerResponseBuilder.AbstractServerResponse
|
|
||||||
implements EntityResponse<T> {
|
implements EntityResponse<T> {
|
||||||
|
|
||||||
private final T entity;
|
private final T entity;
|
||||||
|
|
||||||
private final Type entityType;
|
private final Type entityType;
|
||||||
|
|
||||||
|
|
||||||
public DefaultEntityResponse(int statusCode, HttpHeaders headers,
|
public DefaultEntityResponse(int statusCode, HttpHeaders headers,
|
||||||
MultiValueMap<String, Cookie> cookies, T entity, Type entityType) {
|
MultiValueMap<String, Cookie> cookies, T entity, Type entityType) {
|
||||||
|
|
||||||
|
@ -263,18 +255,15 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
|
|
||||||
writeEntityWithMessageConverters(this.entity, servletRequest,servletResponse, context);
|
writeEntityWithMessageConverters(this.entity, servletRequest,servletResponse, context);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected void writeEntityWithMessageConverters(Object entity,
|
protected void writeEntityWithMessageConverters(Object entity, HttpServletRequest request,
|
||||||
HttpServletRequest request, HttpServletResponse response,
|
HttpServletResponse response, ServerResponse.Context context)
|
||||||
ServerResponse.Context context)
|
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
|
|
||||||
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response);
|
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response);
|
||||||
|
|
||||||
MediaType contentType = getContentType(response);
|
MediaType contentType = getContentType(response);
|
||||||
Class<?> entityClass = entity.getClass();
|
Class<?> entityClass = entity.getClass();
|
||||||
|
|
||||||
|
@ -307,9 +296,8 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void tryWriteEntityWithMessageConverters(Object entity,
|
protected void tryWriteEntityWithMessageConverters(Object entity, HttpServletRequest request,
|
||||||
HttpServletRequest request, HttpServletResponse response,
|
HttpServletResponse response, ServerResponse.Context context) {
|
||||||
ServerResponse.Context context) {
|
|
||||||
try {
|
try {
|
||||||
writeEntityWithMessageConverters(entity, request, response, context);
|
writeEntityWithMessageConverters(entity, request, response, context);
|
||||||
}
|
}
|
||||||
|
@ -334,12 +322,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
/**
|
/**
|
||||||
* {@link EntityResponse} implementation for asynchronous {@link CompletionStage} bodies.
|
* {@link EntityResponse} implementation for asynchronous {@link CompletionStage} bodies.
|
||||||
*/
|
*/
|
||||||
private static class CompletionStageEntityResponse<T>
|
private static class CompletionStageEntityResponse<T> extends DefaultEntityResponse<CompletionStage<T>> {
|
||||||
extends DefaultEntityResponse<CompletionStage<T>> {
|
|
||||||
|
|
||||||
public CompletionStageEntityResponse(int statusCode, HttpHeaders headers,
|
public CompletionStageEntityResponse(int statusCode, HttpHeaders headers,
|
||||||
MultiValueMap<String, Cookie> cookies, CompletionStage<T> entity,
|
MultiValueMap<String, Cookie> cookies, CompletionStage<T> entity, Type entityType) {
|
||||||
Type entityType) {
|
|
||||||
super(statusCode, headers, cookies, entity, entityType);
|
super(statusCode, headers, cookies, entity, entityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,7 +335,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
HttpServletResponse servletResponse, Context context) {
|
HttpServletResponse servletResponse, Context context) {
|
||||||
|
|
||||||
AsyncContext asyncContext = servletRequest.startAsync(servletRequest, servletResponse);
|
AsyncContext asyncContext = servletRequest.startAsync(servletRequest, servletResponse);
|
||||||
|
|
||||||
entity().whenComplete((entity, throwable) -> {
|
entity().whenComplete((entity, throwable) -> {
|
||||||
try {
|
try {
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
|
@ -370,11 +356,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class PublisherEntityResponse<T> extends DefaultEntityResponse<Publisher<T>> {
|
private static class PublisherEntityResponse<T> extends DefaultEntityResponse<Publisher<T>> {
|
||||||
|
|
||||||
public PublisherEntityResponse(int statusCode, HttpHeaders headers,
|
public PublisherEntityResponse(int statusCode, HttpHeaders headers,
|
||||||
MultiValueMap<String, Cookie> cookies, Publisher<T> entity,
|
MultiValueMap<String, Cookie> cookies, Publisher<T> entity, Type entityType) {
|
||||||
Type entityType) {
|
|
||||||
super(statusCode, headers, cookies, entity, entityType);
|
super(statusCode, headers, cookies, entity, entityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,14 +371,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
|
|
||||||
AsyncContext asyncContext = servletRequest.startAsync(servletRequest,
|
AsyncContext asyncContext = servletRequest.startAsync(servletRequest,
|
||||||
new NoContentLengthResponseWrapper(servletResponse));
|
new NoContentLengthResponseWrapper(servletResponse));
|
||||||
|
|
||||||
entity().subscribe(new ProducingSubscriber(asyncContext, context));
|
entity().subscribe(new ProducingSubscriber(asyncContext, context));
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isPublisher(Object o) {
|
public static boolean isPublisher(Object entity) {
|
||||||
return (o instanceof Publisher);
|
return (entity instanceof Publisher);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -405,16 +390,13 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
@Nullable
|
@Nullable
|
||||||
private Subscription subscription;
|
private Subscription subscription;
|
||||||
|
|
||||||
public ProducingSubscriber(AsyncContext asyncContext,
|
public ProducingSubscriber(AsyncContext asyncContext, Context context) {
|
||||||
Context context) {
|
|
||||||
this.asyncContext = asyncContext;
|
this.asyncContext = asyncContext;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(Subscription s) {
|
public void onSubscribe(Subscription s) {
|
||||||
Objects.requireNonNull(s);
|
|
||||||
|
|
||||||
if (this.subscription == null) {
|
if (this.subscription == null) {
|
||||||
this.subscription = s;
|
this.subscription = s;
|
||||||
this.subscription.request(Long.MAX_VALUE);
|
this.subscription.request(Long.MAX_VALUE);
|
||||||
|
@ -426,27 +408,15 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(T element) {
|
public void onNext(T element) {
|
||||||
Objects.requireNonNull(element);
|
HttpServletRequest servletRequest = (HttpServletRequest) this.asyncContext.getRequest();
|
||||||
HttpServletRequest servletRequest =
|
HttpServletResponse servletResponse = (HttpServletResponse) this.asyncContext.getResponse();
|
||||||
(HttpServletRequest) this.asyncContext.getRequest();
|
tryWriteEntityWithMessageConverters(element, servletRequest, servletResponse, this.context);
|
||||||
HttpServletResponse servletResponse =
|
|
||||||
(HttpServletResponse) this.asyncContext.getResponse();
|
|
||||||
|
|
||||||
tryWriteEntityWithMessageConverters(element,
|
|
||||||
servletRequest,
|
|
||||||
servletResponse,
|
|
||||||
this.context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(Throwable t) {
|
public void onError(Throwable t) {
|
||||||
Objects.requireNonNull(t);
|
handleError(t, (HttpServletRequest) this.asyncContext.getRequest(),
|
||||||
|
(HttpServletResponse) this.asyncContext.getResponse(), this.context);
|
||||||
handleError(t,
|
|
||||||
(HttpServletRequest) this.asyncContext.getRequest(),
|
|
||||||
(HttpServletResponse) this.asyncContext.getResponse(),
|
|
||||||
this.context);
|
|
||||||
|
|
||||||
this.asyncContext.complete();
|
this.asyncContext.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,9 +424,9 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
public void onComplete() {
|
public void onComplete() {
|
||||||
this.asyncContext.complete();
|
this.asyncContext.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class NoContentLengthResponseWrapper extends HttpServletResponseWrapper {
|
private static class NoContentLengthResponseWrapper extends HttpServletResponseWrapper {
|
||||||
|
|
||||||
public NoContentLengthResponseWrapper(HttpServletResponse response) {
|
public NoContentLengthResponseWrapper(HttpServletResponse response) {
|
||||||
|
@ -485,8 +455,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
|
||||||
public void setContentLengthLong(long len) {
|
public void setContentLengthLong(long len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue