Polish AbstractServerHttpResponse

This commit is contained in:
Rossen Stoyanchev
2016-07-05 11:06:02 -04:00
parent 8690464a9b
commit 7401d10f91
5 changed files with 75 additions and 62 deletions

View File

@@ -45,7 +45,7 @@ import org.springframework.util.MultiValueMap;
*/
public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
private static Log logger = LogFactory.getLog(AbstractServerHttpResponse.class);
private Log logger = LogFactory.getLog(getClass());
private static final int STATE_NEW = 1;
@@ -53,17 +53,20 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
private static final int STATE_COMMITTED = 3;
private final DataBufferFactory dataBufferFactory;
private HttpStatus statusCode;
private final HttpHeaders headers;
private final MultiValueMap<String, ResponseCookie> cookies;
private final AtomicInteger state = new AtomicInteger(STATE_NEW);
private final List<Supplier<? extends Mono<Void>>> beforeCommitActions = new ArrayList<>(4);
private final DataBufferFactory dataBufferFactory;
private final AtomicInteger state = new AtomicInteger(STATE_NEW);
public AbstractServerHttpResponse(DataBufferFactory dataBufferFactory) {
Assert.notNull(dataBufferFactory, "'dataBufferFactory' must not be null");
@@ -73,13 +76,29 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
this.cookies = new LinkedMultiValueMap<String, ResponseCookie>();
}
@Override
public final DataBufferFactory bufferFactory() {
return this.dataBufferFactory;
}
@Override
public boolean setStatusCode(HttpStatus statusCode) {
Assert.notNull(statusCode);
if (STATE_NEW == this.state.get()) {
this.statusCode = statusCode;
return true;
}
else if (logger.isDebugEnabled()) {
logger.debug("Can't set the status " + statusCode.toString() +
" because the HTTP response has already been committed");
}
return false;
}
protected HttpStatus getStatusCode() {
return statusCode;
return this.statusCode;
}
@Override
@@ -100,6 +119,12 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
return this.cookies;
}
@Override
public void beforeCommit(Supplier<? extends Mono<Void>> action) {
Assert.notNull(action);
this.beforeCommitActions.add(action);
}
@Override
public Mono<Void> writeWith(Publisher<DataBuffer> publisher) {
return new ChannelSendOperator<>(publisher, writePublisher ->
@@ -127,6 +152,12 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
return mono;
}
/**
* Implement this method to write to the underlying the response.
* @param body the publisher to write with
*/
protected abstract Mono<Void> writeWithInternal(Publisher<DataBuffer> body);
/**
* Implement this method to write the status code to the underlying response.
* This method is called once only.
@@ -145,35 +176,10 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
*/
protected abstract void writeCookies();
/**
* Implement this method to write to the underlying the response.
* @param body the publisher to write with
*/
protected abstract Mono<Void> writeWithInternal(Publisher<DataBuffer> body);
@Override
public void beforeCommit(Supplier<? extends Mono<Void>> action) {
Assert.notNull(action);
this.beforeCommitActions.add(action);
}
@Override
public Mono<Void> setComplete() {
return applyBeforeCommit();
}
@Override
public boolean setStatusCode(HttpStatus statusCode) {
Assert.notNull(statusCode);
if (STATE_NEW == this.state.get()) {
this.statusCode = statusCode;
return true;
}
else if (logger.isDebugEnabled()) {
logger.debug("Can't set the status " + statusCode.toString() +
" because the HTTP response has already been committed");
}
return false;
}
}

View File

@@ -48,6 +48,7 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
private final HttpChannel channel;
public ReactorServerHttpResponse(HttpChannel response,
DataBufferFactory dataBufferFactory) {
super(dataBufferFactory);
@@ -60,6 +61,15 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
return this.channel;
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
getReactorChannel().status(HttpResponseStatus.valueOf(statusCode.value()));
}
}
@Override
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
return Flux.from(publisher)
@@ -70,14 +80,6 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
.then();
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
getReactorChannel().status(HttpResponseStatus.valueOf(statusCode.value()));
}
}
@Override
protected void writeHeaders() {
for (String name : getHeaders().keySet()) {
@@ -119,4 +121,5 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
return this.channel.sendFile(file, position, count);
});
}
}

View File

@@ -46,6 +46,7 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
private final HttpServerResponse<ByteBuf> response;
public RxNettyServerHttpResponse(HttpServerResponse<ByteBuf> response,
NettyDataBufferFactory dataBufferFactory) {
super(dataBufferFactory);
@@ -59,6 +60,15 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
return this.response;
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
this.response.setStatus(HttpResponseStatus.valueOf(statusCode.value()));
}
}
@Override
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> body) {
Observable<ByteBuf> content = RxJava1ObservableConverter.from(body).map(this::toByteBuf);
@@ -70,14 +80,6 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
return (buffer instanceof FlushingDataBuffer ? new FlushingByteBuf(byteBuf) : byteBuf);
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
this.response.setStatus(HttpResponseStatus.valueOf(statusCode.value()));
}
}
@Override
protected void writeHeaders() {
for (String name : getHeaders().keySet()) {

View File

@@ -23,8 +23,6 @@ import java.util.function.Function;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
@@ -42,12 +40,11 @@ import org.springframework.util.Assert;
*/
public class ServletServerHttpResponse extends AbstractServerHttpResponse {
private static final Log logger = LogFactory.getLog(ServletServerHttpResponse.class);
private final HttpServletResponse response;
private final Function<Publisher<DataBuffer>, Mono<Void>> responseBodyWriter;
public ServletServerHttpResponse(HttpServletResponse response,
DataBufferFactory dataBufferFactory,
Function<Publisher<DataBuffer>, Mono<Void>> responseBodyWriter) {
@@ -58,14 +55,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse {
this.responseBodyWriter = responseBodyWriter;
}
public HttpServletResponse getServletResponse() {
return this.response;
}
@Override
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
return this.responseBodyWriter.apply(publisher);
}
@Override
protected void writeStatusCode() {
@@ -75,6 +69,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse {
}
}
@Override
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
return this.responseBodyWriter.apply(publisher);
}
@Override
protected void writeHeaders() {
for (Map.Entry<String, List<String>> entry : getHeaders().entrySet()) {

View File

@@ -54,6 +54,7 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse
private final HttpServerExchange exchange;
public UndertowServerHttpResponse(HttpServerExchange exchange,
DataBufferFactory dataBufferFactory) {
super(dataBufferFactory);
@@ -66,6 +67,16 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse
return this.exchange;
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
getUndertowExchange().setStatusCode(statusCode.value());
}
}
@Override
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
return Mono.from(s -> {
@@ -101,14 +112,6 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse
}
}
@Override
protected void writeStatusCode() {
HttpStatus statusCode = this.getStatusCode();
if (statusCode != null) {
getUndertowExchange().setStatusCode(statusCode.value());
}
}
@Override
protected void writeHeaders() {
for (Map.Entry<String, List<String>> entry : getHeaders().entrySet()) {