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