3535 * Servlet 3.1 and Undertow support.
3636 *
3737 * @author Arjen Poutsma
38+ * @author Violeta Georgieva
3839 * @since 5.0
3940 * @see ServletServerHttpRequest
4041 * @see UndertowHttpHandlerAdapter
4142 * @see ServerHttpResponse#writeAndFlushWith(Publisher)
4243 */
43- abstract class AbstractResponseBodyFlushProcessor
44- implements Processor <Publisher <DataBuffer >, Void > {
44+ abstract class AbstractResponseBodyFlushProcessor implements Processor <Publisher <DataBuffer >, Void > {
4545
4646 protected final Log logger = LogFactory .getLog (getClass ());
4747
48- private final ResponseBodyWriteResultPublisher publisherDelegate =
49- new ResponseBodyWriteResultPublisher ();
48+ private final ResponseBodyWriteResultPublisher resultPublisher = new ResponseBodyWriteResultPublisher ();
5049
51- private final AtomicReference <State > state =
52- new AtomicReference <>(State .UNSUBSCRIBED );
50+ private final AtomicReference <State > state = new AtomicReference <>(State .UNSUBSCRIBED );
5351
5452 private volatile boolean subscriberCompleted ;
5553
5654 private Subscription subscription ;
5755
56+
5857 // Subscriber
5958
6059 @ Override
@@ -89,13 +88,15 @@ public final void onComplete() {
8988 this .state .get ().onComplete (this );
9089 }
9190
91+
9292 // Publisher
9393
9494 @ Override
9595 public final void subscribe (Subscriber <? super Void > subscriber ) {
96- this .publisherDelegate .subscribe (subscriber );
96+ this .resultPublisher .subscribe (subscriber );
9797 }
9898
99+
99100 /**
100101 * Creates a new processor for subscribing to a body chunk.
101102 */
@@ -106,8 +107,9 @@ public final void subscribe(Subscriber<? super Void> subscriber) {
106107 */
107108 protected abstract void flush () throws IOException ;
108109
109- private void cancel () {
110- this .subscription .cancel ();
110+
111+ private boolean changeState (State oldState , State newState ) {
112+ return this .state .compareAndSet (oldState , newState );
111113 }
112114
113115 private void writeComplete () {
@@ -118,15 +120,17 @@ private void writeComplete() {
118120
119121 }
120122
121- private boolean changeState ( State oldState , State newState ) {
122- return this .state . compareAndSet ( oldState , newState );
123+ private void cancel ( ) {
124+ this .subscription . cancel ( );
123125 }
124126
127+
125128 private enum State {
129+
126130 UNSUBSCRIBED {
131+
127132 @ Override
128- public void onSubscribe (AbstractResponseBodyFlushProcessor processor ,
129- Subscription subscription ) {
133+ public void onSubscribe (AbstractResponseBodyFlushProcessor processor , Subscription subscription ) {
130134 Objects .requireNonNull (subscription , "Subscription cannot be null" );
131135 if (processor .changeState (this , REQUESTED )) {
132136 processor .subscription = subscription ;
@@ -138,25 +142,25 @@ public void onSubscribe(AbstractResponseBodyFlushProcessor processor,
138142 }
139143 },
140144 REQUESTED {
145+
141146 @ Override
142- public void onNext (AbstractResponseBodyFlushProcessor processor ,
143- Publisher <DataBuffer > chunk ) {
147+ public void onNext (AbstractResponseBodyFlushProcessor processor , Publisher <DataBuffer > chunk ) {
144148 if (processor .changeState (this , RECEIVED )) {
145- Processor <DataBuffer , Void > chunkProcessor =
146- processor .createBodyProcessor ();
149+ Processor <DataBuffer , Void > chunkProcessor = processor .createBodyProcessor ();
147150 chunk .subscribe (chunkProcessor );
148151 chunkProcessor .subscribe (new WriteSubscriber (processor ));
149152 }
150153 }
151154
152155 @ Override
153- void onComplete (AbstractResponseBodyFlushProcessor processor ) {
156+ public void onComplete (AbstractResponseBodyFlushProcessor processor ) {
154157 if (processor .changeState (this , COMPLETED )) {
155- processor .publisherDelegate .publishComplete ();
158+ processor .resultPublisher .publishComplete ();
156159 }
157160 }
158161 },
159162 RECEIVED {
163+
160164 @ Override
161165 public void writeComplete (AbstractResponseBodyFlushProcessor processor ) {
162166 try {
@@ -169,7 +173,7 @@ public void writeComplete(AbstractResponseBodyFlushProcessor processor) {
169173
170174 if (processor .subscriberCompleted ) {
171175 if (processor .changeState (this , COMPLETED )) {
172- processor .publisherDelegate .publishComplete ();
176+ processor .resultPublisher .publishComplete ();
173177 }
174178 }
175179 else {
@@ -180,11 +184,12 @@ public void writeComplete(AbstractResponseBodyFlushProcessor processor) {
180184 }
181185
182186 @ Override
183- void onComplete (AbstractResponseBodyFlushProcessor processor ) {
187+ public void onComplete (AbstractResponseBodyFlushProcessor processor ) {
184188 processor .subscriberCompleted = true ;
185189 }
186190 },
187191 COMPLETED {
192+
188193 @ Override
189194 public void onNext (AbstractResponseBodyFlushProcessor processor ,
190195 Publisher <DataBuffer > publisher ) {
@@ -193,40 +198,39 @@ public void onNext(AbstractResponseBodyFlushProcessor processor,
193198 }
194199
195200 @ Override
196- void onError (AbstractResponseBodyFlushProcessor processor , Throwable t ) {
201+ public void onError (AbstractResponseBodyFlushProcessor processor , Throwable t ) {
197202 // ignore
198203 }
199204
200205 @ Override
201- void onComplete (AbstractResponseBodyFlushProcessor processor ) {
206+ public void onComplete (AbstractResponseBodyFlushProcessor processor ) {
202207 // ignore
203208 }
204209 };
205210
206- public void onSubscribe (AbstractResponseBodyFlushProcessor processor ,
207- Subscription subscription ) {
211+ public void onSubscribe (AbstractResponseBodyFlushProcessor processor , Subscription subscription ) {
208212 subscription .cancel ();
209213 }
210214
211- public void onNext (AbstractResponseBodyFlushProcessor processor ,
212- Publisher <DataBuffer > publisher ) {
215+ public void onNext (AbstractResponseBodyFlushProcessor processor , Publisher <DataBuffer > publisher ) {
213216 throw new IllegalStateException (toString ());
214217 }
215218
216- void onError (AbstractResponseBodyFlushProcessor processor , Throwable t ) {
219+ public void onError (AbstractResponseBodyFlushProcessor processor , Throwable ex ) {
217220 if (processor .changeState (this , COMPLETED )) {
218- processor .publisherDelegate .publishError (t );
221+ processor .resultPublisher .publishError (ex );
219222 }
220223 }
221224
222- void onComplete (AbstractResponseBodyFlushProcessor processor ) {
225+ public void onComplete (AbstractResponseBodyFlushProcessor processor ) {
223226 throw new IllegalStateException (toString ());
224227 }
225228
226229 public void writeComplete (AbstractResponseBodyFlushProcessor processor ) {
227230 // ignore
228231 }
229232
233+
230234 private static class WriteSubscriber implements Subscriber <Void > {
231235
232236 private final AbstractResponseBodyFlushProcessor processor ;
@@ -236,23 +240,23 @@ public WriteSubscriber(AbstractResponseBodyFlushProcessor processor) {
236240 }
237241
238242 @ Override
239- public void onSubscribe (Subscription s ) {
240- s .request (Long .MAX_VALUE );
243+ public void onSubscribe (Subscription subscription ) {
244+ subscription .request (Long .MAX_VALUE );
241245 }
242246
243247 @ Override
244248 public void onNext (Void aVoid ) {
245249 }
246250
247251 @ Override
248- public void onError (Throwable t ) {
249- processor .cancel ();
250- processor .onError (t );
252+ public void onError (Throwable ex ) {
253+ this . processor .cancel ();
254+ this . processor .onError (ex );
251255 }
252256
253257 @ Override
254258 public void onComplete () {
255- processor .writeComplete ();
259+ this . processor .writeComplete ();
256260 }
257261 }
258262 }
0 commit comments