Polishing
This commit polishes previous one by also accepting generic types explicitly declared with a class that extends DataBuffer allowing to write Flux<DefaultDataBuffer> for example. Issue: SPR-14952
This commit is contained in:
@@ -55,7 +55,7 @@ public interface ReactiveHttpOutputMessage extends HttpMessage {
|
||||
* @param body the body content publisher
|
||||
* @return a {@link Mono} that indicates completion or error
|
||||
*/
|
||||
Mono<Void> writeWith(Publisher<DataBuffer> body);
|
||||
Mono<Void> writeWith(Publisher<? extends DataBuffer> body);
|
||||
|
||||
/**
|
||||
* Use the given {@link Publisher} of {@code Publishers} to write the body of the
|
||||
@@ -64,7 +64,7 @@ public interface ReactiveHttpOutputMessage extends HttpMessage {
|
||||
* @param body the body content publisher
|
||||
* @return a {@link Mono} that indicates completion or error
|
||||
*/
|
||||
Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<DataBuffer>> body);
|
||||
Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body);
|
||||
|
||||
/**
|
||||
* Indicate that message handling is complete, allowing for any cleanup or
|
||||
|
||||
@@ -74,20 +74,20 @@ public class ReactorClientHttpRequest extends AbstractClientHttpRequest {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeWith(Publisher<DataBuffer> body) {
|
||||
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
||||
return applyBeforeCommit().then(this.httpRequest
|
||||
.send(Flux.from(body).map(NettyDataBufferFactory::toByteBuf)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
Publisher<Publisher<ByteBuf>> byteBufs = Flux.from(body).
|
||||
map(ReactorClientHttpRequest::toByteBufs);
|
||||
return applyBeforeCommit().then(this.httpRequest
|
||||
.sendGroups(byteBufs));
|
||||
}
|
||||
|
||||
private static Publisher<ByteBuf> toByteBufs(Publisher<DataBuffer> dataBuffers) {
|
||||
private static Publisher<ByteBuf> toByteBufs(Publisher<? extends DataBuffer> dataBuffers) {
|
||||
return Flux.from(dataBuffers).
|
||||
map(NettyDataBufferFactory::toByteBuf);
|
||||
}
|
||||
|
||||
@@ -43,14 +43,14 @@ public abstract class AbstractListenerServerHttpResponse extends AbstractServerH
|
||||
|
||||
|
||||
@Override
|
||||
protected final Mono<Void> writeWithInternal(Publisher<DataBuffer> body) {
|
||||
protected final Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> body) {
|
||||
return writeAndFlushWithInternal(Mono.just(body));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
protected final Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
if (this.writeCalled.compareAndSet(false, true)) {
|
||||
Processor<Publisher<DataBuffer>, Void> bodyProcessor = createBodyFlushProcessor();
|
||||
Processor<? super Publisher<? extends DataBuffer>, Void> bodyProcessor = createBodyFlushProcessor();
|
||||
return Mono.from(subscriber -> {
|
||||
body.subscribe(bodyProcessor);
|
||||
bodyProcessor.subscribe(subscriber);
|
||||
@@ -67,6 +67,6 @@ public abstract class AbstractListenerServerHttpResponse extends AbstractServerH
|
||||
* that will write the response body with flushes to the underlying output. Called from
|
||||
* {@link #writeAndFlushWithInternal(Publisher)}.
|
||||
*/
|
||||
protected abstract Processor<Publisher<DataBuffer>, Void> createBodyFlushProcessor();
|
||||
protected abstract Processor<? super Publisher<? extends DataBuffer>, Void> createBodyFlushProcessor();
|
||||
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ import org.springframework.core.io.buffer.DataBuffer;
|
||||
* @see UndertowHttpHandlerAdapter
|
||||
* @see ServerHttpResponse#writeAndFlushWith(Publisher)
|
||||
*/
|
||||
abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher<DataBuffer>, Void> {
|
||||
abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher<? extends DataBuffer>, Void> {
|
||||
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
@@ -65,7 +65,7 @@ abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void onNext(Publisher<DataBuffer> publisher) {
|
||||
public final void onNext(Publisher<? extends DataBuffer> publisher) {
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace(this.state + " onNext: " + publisher);
|
||||
}
|
||||
@@ -100,7 +100,7 @@ abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher
|
||||
/**
|
||||
* Creates a new processor for subscribing to a body chunk.
|
||||
*/
|
||||
protected abstract Processor<DataBuffer, Void> createBodyProcessor();
|
||||
protected abstract Processor<? super DataBuffer, Void> createBodyProcessor();
|
||||
|
||||
/**
|
||||
* Flushes the output.
|
||||
@@ -144,9 +144,9 @@ abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher
|
||||
REQUESTED {
|
||||
|
||||
@Override
|
||||
public void onNext(AbstractResponseBodyFlushProcessor processor, Publisher<DataBuffer> chunk) {
|
||||
public void onNext(AbstractResponseBodyFlushProcessor processor, Publisher<? extends DataBuffer> chunk) {
|
||||
if (processor.changeState(this, RECEIVED)) {
|
||||
Processor<DataBuffer, Void> chunkProcessor = processor.createBodyProcessor();
|
||||
Processor<? super DataBuffer, Void> chunkProcessor = processor.createBodyProcessor();
|
||||
chunk.subscribe(chunkProcessor);
|
||||
chunkProcessor.subscribe(new WriteSubscriber(processor));
|
||||
}
|
||||
@@ -192,7 +192,7 @@ abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher
|
||||
|
||||
@Override
|
||||
public void onNext(AbstractResponseBodyFlushProcessor processor,
|
||||
Publisher<DataBuffer> publisher) {
|
||||
Publisher<? extends DataBuffer> publisher) {
|
||||
// ignore
|
||||
|
||||
}
|
||||
@@ -212,7 +212,7 @@ abstract class AbstractResponseBodyFlushProcessor implements Processor<Publisher
|
||||
subscription.cancel();
|
||||
}
|
||||
|
||||
public void onNext(AbstractResponseBodyFlushProcessor processor, Publisher<DataBuffer> publisher) {
|
||||
public void onNext(AbstractResponseBodyFlushProcessor processor, Publisher<? extends DataBuffer> publisher) {
|
||||
throw new IllegalStateException(toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -125,13 +125,13 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Mono<Void> writeWith(Publisher<DataBuffer> body) {
|
||||
public final Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
||||
return new ChannelSendOperator<>(body,
|
||||
writePublisher -> doCommit(() -> writeWithInternal(writePublisher)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
public final Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
return new ChannelSendOperator<>(body,
|
||||
writePublisher -> doCommit(() -> writeAndFlushWithInternal(writePublisher)));
|
||||
}
|
||||
@@ -186,14 +186,14 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
|
||||
* 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);
|
||||
protected abstract Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> body);
|
||||
|
||||
/**
|
||||
* Implement this method to write to the underlying the response, and flush after
|
||||
* each {@code Publisher<DataBuffer>}.
|
||||
* @param body the publisher to write and flush with
|
||||
*/
|
||||
protected abstract Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<DataBuffer>> body);
|
||||
protected abstract Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<? extends DataBuffer>> body);
|
||||
|
||||
/**
|
||||
* Implement this method to write the status code to the underlying response.
|
||||
|
||||
@@ -70,13 +70,13 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
|
||||
protected Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> publisher) {
|
||||
Publisher<ByteBuf> body = toByteBufs(publisher);
|
||||
return this.response.send(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<DataBuffer>> publisher) {
|
||||
protected Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<? extends DataBuffer>> publisher) {
|
||||
Publisher<Publisher<ByteBuf>> body = Flux.from(publisher)
|
||||
.map(ReactorServerHttpResponse::toByteBufs);
|
||||
return this.response.sendGroups(body);
|
||||
@@ -117,7 +117,7 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse
|
||||
return doCommit(() -> this.response.sendFile(file, position, count));
|
||||
}
|
||||
|
||||
private static Publisher<ByteBuf> toByteBufs(Publisher<DataBuffer> dataBuffers) {
|
||||
private static Publisher<ByteBuf> toByteBufs(Publisher<? extends DataBuffer> dataBuffers) {
|
||||
return Flux.from(dataBuffers).map(NettyDataBufferFactory::toByteBuf);
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> body) {
|
||||
protected Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> body) {
|
||||
Observable<ByteBuf> content = RxReactiveStreams.toObservable(body)
|
||||
.map(NettyDataBufferFactory::toByteBuf);
|
||||
return Flux.from(RxReactiveStreams.toPublisher(this.response.write(content)))
|
||||
@@ -80,7 +80,7 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeAndFlushWithInternal(
|
||||
Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
Flux<ByteBuf> bodyWithFlushSignals = Flux.from(body).
|
||||
flatMap(publisher -> Flux.from(publisher).
|
||||
map(NettyDataBufferFactory::toByteBuf).
|
||||
|
||||
@@ -122,7 +122,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Processor<Publisher<DataBuffer>, Void> createBodyFlushProcessor() {
|
||||
protected Processor<? super Publisher<? extends DataBuffer>, Void> createBodyFlushProcessor() {
|
||||
ResponseBodyFlushProcessor processor = new ResponseBodyFlushProcessor();
|
||||
this.bodyFlushProcessor = processor;
|
||||
return processor;
|
||||
@@ -261,7 +261,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
|
||||
private class ResponseBodyFlushProcessor extends AbstractResponseBodyFlushProcessor {
|
||||
|
||||
@Override
|
||||
protected Processor<DataBuffer, Void> createBodyProcessor() {
|
||||
protected Processor<? super DataBuffer, Void> createBodyProcessor() {
|
||||
try {
|
||||
bodyProcessor = new ResponseBodyProcessor(outputStream(), bufferSize);
|
||||
return bodyProcessor;
|
||||
|
||||
@@ -29,6 +29,7 @@ import io.undertow.server.handlers.Cookie;
|
||||
import io.undertow.server.handlers.CookieImpl;
|
||||
import io.undertow.util.HttpString;
|
||||
import org.reactivestreams.Processor;
|
||||
import org.reactivestreams.Publisher;
|
||||
import org.xnio.ChannelListener;
|
||||
import org.xnio.channels.StreamSinkChannel;
|
||||
import reactor.core.publisher.Mono;
|
||||
@@ -123,7 +124,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractResponseBodyFlushProcessor createBodyFlushProcessor() {
|
||||
protected Processor<? super Publisher<? extends DataBuffer>, Void> createBodyFlushProcessor() {
|
||||
return new ResponseBodyFlushProcessor();
|
||||
}
|
||||
|
||||
@@ -209,7 +210,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
|
||||
private class ResponseBodyFlushProcessor extends AbstractResponseBodyFlushProcessor {
|
||||
|
||||
@Override
|
||||
protected Processor<DataBuffer, Void> createBodyProcessor() {
|
||||
protected Processor<? super DataBuffer, Void> createBodyProcessor() {
|
||||
return UndertowServerHttpResponse.this.createBodyProcessor();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user