Avoid use of Objects.requireNonNull plus related polishing

This commit is contained in:
Juergen Hoeller 2019-05-02 16:32:47 +02:00
parent 0be610b0ee
commit 8a57997d21
1 changed files with 27 additions and 59 deletions

View File

@ -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) {
} }
} }
} }
} }