Skip to content

Commit d71f22b

Browse files
vaadin-botcaalador
andauthored
fix: get ui from context if not given (#22833) (#22835)
fix issue where extensions are not setting the UI to the progress handler. Co-authored-by: caalador <mikael.grankvist@vaadin.com>
1 parent 40d5004 commit d71f22b

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

flow-server/src/main/java/com/vaadin/flow/server/streams/TransferProgressAwareHandler.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ public abstract class TransferProgressAwareHandler<T, R extends TransferProgress
5757
protected abstract TransferContext getTransferContext(T transferEvent);
5858

5959
/**
60-
* UI that the transfer was started with. Set from onStart(context).
61-
* <p>
62-
* protected for tests to set the ui.
60+
* UI that the transfer was started with. Set from context if not given.
6361
*/
6462
private UI ui;
6563

@@ -113,6 +111,9 @@ public R whenStart(SerializableRunnable startHandler) {
113111
addTransferProgressListenerInternal(new TransferProgressListener() {
114112
@Override
115113
public void onStart(TransferContext context) {
114+
if (ui == null) {
115+
setTransferUI(context.getUI());
116+
}
116117
ui.access(startHandler::run);
117118
}
118119
});
@@ -138,7 +139,7 @@ public R whenStart(SerializableConsumer<TransferContext> startHandler) {
138139
addTransferProgressListenerInternal(new TransferProgressListener() {
139140
@Override
140141
public void onStart(TransferContext context) {
141-
ui.access(() -> startHandler.accept(context));
142+
uiAccess(context, () -> startHandler.accept(context));
142143
}
143144
});
144145
return (R) this;
@@ -170,7 +171,7 @@ public R onProgress(
170171
@Override
171172
public void onProgress(TransferContext context,
172173
long transferredBytes, long totalBytes) {
173-
ui.access(() -> progressHandler.accept(context,
174+
uiAccess(context, () -> progressHandler.accept(context,
174175
transferredBytes, totalBytes));
175176
}
176177

@@ -227,7 +228,7 @@ public R onProgress(SerializableBiConsumer<Long, Long> progressHandler,
227228
@Override
228229
public void onProgress(TransferContext context,
229230
long transferredBytes, long totalBytes) {
230-
ui.access(() -> progressHandler.accept(transferredBytes,
231+
uiAccess(context, () -> progressHandler.accept(transferredBytes,
231232
totalBytes));
232233
}
233234

@@ -288,13 +289,15 @@ public R whenComplete(
288289
addTransferProgressListenerInternal(new TransferProgressListener() {
289290
@Override
290291
public void onError(TransferContext context, IOException reason) {
291-
ui.access(() -> completeOrTerminateHandler.accept(false));
292+
uiAccess(context,
293+
() -> completeOrTerminateHandler.accept(false));
292294
}
293295

294296
@Override
295297
public void onComplete(TransferContext context,
296298
long transferredBytes) {
297-
ui.access(() -> completeOrTerminateHandler.accept(true));
299+
uiAccess(context,
300+
() -> completeOrTerminateHandler.accept(true));
298301
}
299302
});
300303
return (R) this;
@@ -326,14 +329,14 @@ public R whenComplete(
326329
addTransferProgressListenerInternal(new TransferProgressListener() {
327330
@Override
328331
public void onError(TransferContext context, IOException reason) {
329-
ui.access(() -> completeOrTerminateHandler.accept(context,
330-
false));
332+
uiAccess(context, () -> completeOrTerminateHandler
333+
.accept(context, false));
331334
}
332335

333336
@Override
334337
public void onComplete(TransferContext context,
335338
long transferredBytes) {
336-
ui.access(
339+
uiAccess(context,
337340
() -> completeOrTerminateHandler.accept(context, true));
338341
}
339342
});
@@ -405,6 +408,13 @@ protected void setTransferUI(UI ui) {
405408
}
406409
}
407410

411+
protected void uiAccess(TransferContext context, final Command command) {
412+
if (ui == null) {
413+
setTransferUI(context.getUI());
414+
}
415+
ui.access(command);
416+
}
417+
408418
/**
409419
* A wrapper for {@link TransferProgressListener} that ensures that UI
410420
* updates in transfer progress listeners are pushed to client
@@ -422,24 +432,25 @@ public TransferProgressListenerWrapper(
422432

423433
@Override
424434
public void onStart(TransferContext context) {
425-
ui.access(() -> delegate.onStart(context));
435+
uiAccess(context, () -> delegate.onStart(context));
426436
}
427437

428438
@Override
429439
public void onProgress(TransferContext context, long transferredBytes,
430440
long totalBytes) {
431-
ui.access(() -> delegate.onProgress(context, transferredBytes,
432-
totalBytes));
441+
uiAccess(context, () -> delegate.onProgress(context,
442+
transferredBytes, totalBytes));
433443
}
434444

435445
@Override
436446
public void onError(TransferContext context, IOException reason) {
437-
ui.access(() -> delegate.onError(context, reason));
447+
uiAccess(context, () -> delegate.onError(context, reason));
438448
}
439449

440450
@Override
441451
public void onComplete(TransferContext context, long transferredBytes) {
442-
ui.access(() -> delegate.onComplete(context, transferredBytes));
452+
uiAccess(context,
453+
() -> delegate.onComplete(context, transferredBytes));
443454
}
444455

445456
@Override
@@ -450,5 +461,13 @@ public long progressReportInterval() {
450461
protected void setTransferUI(UI ui) {
451462
this.ui = ui;
452463
}
464+
465+
protected void uiAccess(TransferContext context,
466+
final Command command) {
467+
if (ui == null) {
468+
setTransferUI(context.getUI());
469+
}
470+
ui.access(command);
471+
}
453472
}
454473
}

flow-server/src/test/java/com/vaadin/flow/server/streams/AbstractDownloadHandlerTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void setUp() throws IOException {
9191
public void handleDownloadRequest(DownloadEvent event) {
9292
}
9393
};
94-
handler.setTransferUI(ui);
94+
9595
mockContext = Mockito.mock(TransferContext.class);
9696
Mockito.when(mockContext.contentLength()).thenReturn(TOTAL_BYTES);
9797
listener = Mockito.mock(TransferProgressListener.class);
@@ -197,7 +197,6 @@ public void handleDownloadRequest(DownloadEvent event) {
197197
successAtomic.set(success);
198198
});
199199

200-
customHandler.setTransferUI(ui);
201200
customHandler.handleDownloadRequest(downloadEvent);
202201

203202
Assert.assertTrue(successAtomic.get());

0 commit comments

Comments
 (0)