From a2aaa05592fb29d0fa61a69bc61ef35c235423f0 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 26 Jan 2017 07:25:22 -0500 Subject: [PATCH] Polish --- build.gradle | 2 +- .../reactive/JettyHttpHandlerAdapter.java | 23 +++++----- .../reactive/ServletHttpHandlerAdapter.java | 23 +++++----- .../reactive/ServletServerHttpRequest.java | 9 ++-- .../reactive/ServletServerHttpResponse.java | 6 +-- .../reactive/TomcatHttpHandlerAdapter.java | 44 +++++++++---------- 6 files changed, 51 insertions(+), 56 deletions(-) diff --git a/build.gradle b/build.gradle index 38834bdd0a3..e8c8d7791cf 100644 --- a/build.gradle +++ b/build.gradle @@ -748,6 +748,7 @@ project("spring-web") { optional("io.reactivex:rxjava:${rxjavaVersion}") optional "io.reactivex.rxjava2:rxjava:${rxjava2Version}" optional("io.reactivex:rxjava-reactive-streams:${rxjavaAdapterVersion}") + optional("org.apache.tomcat:tomcat-catalina:${tomcatVersion}") optional("io.undertow:undertow-core:${undertowVersion}") optional("org.jboss.xnio:xnio-api:${xnioVersion}") optional("io.netty:netty-buffer:${nettyVersion}") // temporarily for JsonObjectDecoder @@ -779,7 +780,6 @@ project("spring-web") { optional("javax.xml.ws:jaxws-api:${jaxwsVersion}") optional("javax.mail:javax.mail-api:${javamailVersion}") optional("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") - optional("org.apache.tomcat:tomcat-catalina:${tomcatVersion}") testCompile(project(":spring-context-support")) // for JafMediaTypeFactory testCompile("io.projectreactor.addons:reactor-test") testCompile("org.apache.taglibs:taglibs-standard-jstlel:1.2.1") { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java index cafdb26f803..6ae1c0a5b67 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java @@ -31,9 +31,8 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; /** - * Adapt {@link HttpHandler} to an {@link HttpServlet} using Servlet Async - * support and Servlet 3.1 non-blocking I/O. Use Jetty API for writing with - * ByteBuffer. + * {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for writing + * to the response with {@link ByteBuffer}. * * @author Violeta Georgieva * @since 5.0 @@ -41,6 +40,7 @@ import org.springframework.core.io.buffer.DataBufferFactory; @WebServlet(asyncSupported = true) public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { + public JettyHttpHandlerAdapter(HttpHandler httpHandler) { super(httpHandler); } @@ -51,22 +51,23 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { @Override - protected ServerHttpResponse createServletServerHttpResponse( - HttpServletResponse response, AsyncContext asyncContext) throws IOException { - return new JettyServerHttpResponse( - response, asyncContext, getDataBufferFactory(), getBufferSize()); + protected ServerHttpResponse createResponse(HttpServletResponse response, + AsyncContext context) throws IOException { + + return new JettyServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize()); } private static final class JettyServerHttpResponse extends ServletServerHttpResponse { - public JettyServerHttpResponse(HttpServletResponse response, AsyncContext asyncContext, - DataBufferFactory bufferFactory, int bufferSize) throws IOException { - super(response, asyncContext, bufferFactory, bufferSize); + public JettyServerHttpResponse(HttpServletResponse response, AsyncContext context, + DataBufferFactory factory, int bufferSize) throws IOException { + + super(response, context, factory, bufferSize); } @Override - protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException { + protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { ServletOutputStream outputStream = getServletResponse().getOutputStream(); ByteBuffer input = dataBuffer.asByteBuffer(); int len = input.remaining(); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java index cb049774a36..d46918aa726 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java @@ -98,26 +98,23 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme // Start async before Read/WriteListener registration AsyncContext asyncContext = request.startAsync(); - ServerHttpRequest httpRequest = createServletServerHttpRequest( - ((HttpServletRequest) request), asyncContext); - - ServerHttpResponse httpResponse = createServletServerHttpResponse( - ((HttpServletResponse) response), asyncContext); + ServerHttpRequest httpRequest = createRequest(((HttpServletRequest) request), asyncContext); + ServerHttpResponse httpResponse = createResponse(((HttpServletResponse) response), asyncContext); HandlerResultSubscriber subscriber = new HandlerResultSubscriber(asyncContext); getHttpHandler().handle(httpRequest, httpResponse).subscribe(subscriber); } - protected ServerHttpRequest createServletServerHttpRequest(HttpServletRequest request, - AsyncContext asyncContext) throws IOException { - return new ServletServerHttpRequest( - request, asyncContext, getDataBufferFactory(), getBufferSize()); + protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context) + throws IOException { + + return new ServletServerHttpRequest(request, context, getDataBufferFactory(), getBufferSize()); } - protected ServerHttpResponse createServletServerHttpResponse(HttpServletResponse response, - AsyncContext asyncContext) throws IOException { - return new ServletServerHttpResponse( - response, asyncContext, getDataBufferFactory(), getBufferSize()); + protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext context) + throws IOException { + + return new ServletServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize()); } // Other Servlet methods... diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 0a4a72d41c2..24b4e35b95a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -54,6 +54,9 @@ import org.springframework.util.StringUtils; */ public class ServletServerHttpRequest extends AbstractServerHttpRequest { + protected final Log logger = LogFactory.getLog(getClass()); + + private final HttpServletRequest request; private final RequestBodyPublisher bodyPublisher; @@ -64,8 +67,6 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { private final byte[] buffer; - protected final Log logger = LogFactory.getLog(getClass()); - public ServletServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext, DataBufferFactory bufferFactory, int bufferSize) throws IOException { @@ -179,7 +180,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { return Flux.from(this.bodyPublisher); } - protected DataBuffer readDataBuffer() throws IOException { + protected DataBuffer readFromInputStream() throws IOException { int read = this.request.getInputStream().read(this.buffer); if (logger.isTraceEnabled()) { logger.trace("read:" + read); @@ -242,7 +243,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { @Override protected DataBuffer read() throws IOException { if (this.inputStream.isReady()) { - return readDataBuffer(); + return readFromInputStream(); } return null; } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java index fc3fa1e01f1..77838314933 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java @@ -132,12 +132,12 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons return processor; } - protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException { + protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { ServletOutputStream outputStream = response.getOutputStream(); InputStream input = dataBuffer.asInputStream(); int bytesWritten = 0; byte[] buffer = new byte[this.bufferSize]; - int bytesRead = -1; + int bytesRead; while (outputStream.isReady() && (bytesRead = input.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); bytesWritten += bytesRead; @@ -287,7 +287,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons } if (ready) { int total = dataBuffer.readableByteCount(); - int written = writeDataBuffer(dataBuffer); + int written = writeToOutputStream(dataBuffer); if (this.logger.isTraceEnabled()) { this.logger.trace("written: " + written + " total: " + total); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java index e493c62b3ca..e3b3a32180b 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java @@ -19,30 +19,29 @@ package org.springframework.http.server.reactive; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Map; - import javax.servlet.AsyncContext; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.connector.CoyoteInputStream; import org.apache.catalina.connector.CoyoteOutputStream; + import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; /** - * Adapt {@link HttpHandler} to an {@link HttpServlet} using Servlet Async - * support and Servlet 3.1 non-blocking I/O. Use Tomcat API for - * reading/writing with ByteBuffer. - * + * {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for reading + * from the request and writing to the response with {@link ByteBuffer}. + * * @author Violeta Georgieva * @since 5.0 */ @WebServlet(asyncSupported = true) public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { + public TomcatHttpHandlerAdapter(HttpHandler httpHandler) { super(httpHandler); } @@ -53,35 +52,31 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { @Override - protected ServerHttpRequest createServletServerHttpRequest( - HttpServletRequest request, AsyncContext asyncContext) throws IOException { - return new TomcatServerHttpRequest( - request, asyncContext, getDataBufferFactory(), getBufferSize()); + protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext cxt) throws IOException { + return new TomcatServerHttpRequest(request, cxt, getDataBufferFactory(), getBufferSize()); } @Override - protected ServerHttpResponse createServletServerHttpResponse( - HttpServletResponse response, AsyncContext asyncContext) throws IOException { - return new TomcatServerHttpResponse( - response, asyncContext, getDataBufferFactory(), getBufferSize()); + protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext cxt) throws IOException { + return new TomcatServerHttpResponse(response, cxt, getDataBufferFactory(), getBufferSize()); } private final class TomcatServerHttpRequest extends ServletServerHttpRequest { - public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext, - DataBufferFactory bufferFactory, int bufferSize) throws IOException { - super(request, asyncContext, bufferFactory, bufferSize); + public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext context, + DataBufferFactory factory, int bufferSize) throws IOException { + + super(request, context, factory, bufferSize); } @Override - protected DataBuffer readDataBuffer() throws IOException { + protected DataBuffer readFromInputStream() throws IOException { DataBuffer buffer = getDataBufferFactory().allocateBuffer(getBufferSize()); ByteBuffer byteBuffer = buffer.asByteBuffer(); byteBuffer.limit(byteBuffer.capacity()); - int read = ((CoyoteInputStream) getServletRequest().getInputStream()).read( - byteBuffer); + int read = ((CoyoteInputStream) getServletRequest().getInputStream()).read(byteBuffer); if (logger.isTraceEnabled()) { logger.trace("read:" + read); } @@ -97,13 +92,14 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { private static final class TomcatServerHttpResponse extends ServletServerHttpResponse { - public TomcatServerHttpResponse(HttpServletResponse response, AsyncContext asyncContext, - DataBufferFactory bufferFactory, int bufferSize) throws IOException { - super(response, asyncContext, bufferFactory, bufferSize); + public TomcatServerHttpResponse(HttpServletResponse response, AsyncContext context, + DataBufferFactory factory, int bufferSize) throws IOException { + + super(response, context, factory, bufferSize); } @Override - protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException { + protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { ServletOutputStream outputStream = getServletResponse().getOutputStream(); ByteBuffer input = dataBuffer.asByteBuffer(); int len = input.remaining();