Skip to content

Commit ab825cd

Browse files
Marc-SpectorSheikah45
authored andcommitted
give the task service an ability to execute completable futures
1 parent e212fed commit ab825cd

File tree

6 files changed

+52
-39
lines changed

6 files changed

+52
-39
lines changed

src/main/java/com/faforever/client/game/GameRunner.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@
3838
import com.faforever.client.preferences.PreferencesService;
3939
import com.faforever.client.remote.FafServerAccessor;
4040
import com.faforever.client.replay.ReplayServer;
41-
import com.faforever.client.task.BackgroundTask;
42-
import com.faforever.client.task.CompletableTask.Priority;
4341
import com.faforever.client.task.TaskService;
4442
import com.faforever.client.theme.UiService;
4543
import com.faforever.client.ui.StageHolder;
@@ -188,9 +186,9 @@ CompletableFuture<Void> startOnlineGame(GameLaunchResponse gameLaunchResponse) {
188186
CompletableFuture<Void> downloadMapFuture = mapFolderName == null ? completedFuture(
189187
null) : mapService.downloadIfNecessary(mapFolderName).toFuture();
190188

191-
CompletableFuture<League> loadLeagueInfoFuture = hasLeague ? completedFuture(null) : runInBackground("league.loadInfo", getDivisionInfo(leaderboard).toFuture());
192-
CompletableFuture<Integer> runReplayServerFuture = runInBackground("replayServer.connecting", replayServer.start(uid));
193-
CompletableFuture<Integer> runIceAdapterFuture = runInBackground("iceAdapter.connecting", startIceAdapter(uid));
189+
CompletableFuture<League> loadLeagueInfoFuture = hasLeague ? completedFuture(null) : taskService.submitFutureTask("league.loadInfo", () -> getDivisionInfo(leaderboard).toFuture());
190+
CompletableFuture<Integer> runReplayServerFuture = taskService.submitFutureTask("replayServer.connecting", () -> replayServer.start(uid));
191+
CompletableFuture<Integer> runIceAdapterFuture = taskService.submitFutureTask("iceAdapter.connecting", () -> startIceAdapter(uid));
194192

195193
return CompletableFuture.allOf(downloadMapFuture, loadLeagueInfoFuture, runReplayServerFuture, runIceAdapterFuture)
196194
.thenApply(_ -> gameMapper.map(gameLaunchResponse, loadLeagueInfoFuture.join()))
@@ -215,10 +213,6 @@ CompletableFuture<Void> startOnlineGame(GameLaunchResponse gameLaunchResponse) {
215213
}, fxApplicationThreadExecutor);
216214
}
217215

218-
private <T> CompletableFuture<T> runInBackground(String taskTitleI18nKey, CompletableFuture<T> task) {
219-
return taskService.submitTask(new BackgroundTask<>(i18n.get(taskTitleI18nKey), task, Priority.MEDIUM)).getFuture();
220-
}
221-
222216
@VisibleForTesting
223217
CompletableFuture<Void> prepareAndLaunchGameWhenReady(String featuredModName, Set<String> simModUids,
224218
@Nullable String mapFolderName,

src/main/java/com/faforever/client/task/BackgroundTask.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/main/java/com/faforever/client/task/CompletableTask.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ public abstract class CompletableTask<V> extends Task<V> implements PrioritizedC
1212
private final CompletableFuture<V> future;
1313
private Priority priority;
1414

15-
public CompletableTask(Priority priority) {
16-
this(priority, new CompletableFuture<>());
15+
public CompletableTask() {
16+
this(Priority.MEDIUM);
1717
}
1818

19-
protected CompletableTask(Priority priority, CompletableFuture<V> future) {
19+
public CompletableTask(Priority priority) {
2020
this.priority = priority;
21-
this.future = future;
21+
this.future = new CompletableFuture<>();
2222
setOnCancelled(_ -> future.cancel(true));
2323
setOnFailed(_ -> future.completeExceptionally(getException()));
2424
setOnSucceeded(_ -> future.complete(getValue()));
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.faforever.client.task;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
5+
import java.util.concurrent.CompletableFuture;
6+
import java.util.concurrent.Future;
7+
import java.util.function.Supplier;
8+
9+
public class SimpleTask<V> extends CompletableTask<V> {
10+
11+
private final Supplier<? extends CompletableFuture<V>> futureSupplier;
12+
13+
public SimpleTask(Supplier<? extends CompletableFuture<V>> futureSupplier) {
14+
this(null, futureSupplier);
15+
}
16+
17+
public SimpleTask(String title, Supplier<? extends CompletableFuture<V>> futureSupplier) {
18+
this.futureSupplier = futureSupplier;
19+
updateTitle(StringUtils.defaultIfBlank(title, StringUtils.EMPTY));
20+
}
21+
22+
@Override
23+
protected V call() throws Exception {
24+
Future<V> task = futureSupplier.get();
25+
return task.get();
26+
}
27+
}

src/main/java/com/faforever/client/task/TaskService.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.faforever.client.task;
22

33
import com.faforever.client.fx.FxApplicationThreadExecutor;
4+
import com.faforever.client.i18n.I18n;
45
import javafx.collections.FXCollections;
56
import javafx.collections.ObservableList;
67
import javafx.concurrent.Worker;
@@ -9,7 +10,9 @@
910
import org.springframework.context.annotation.Lazy;
1011
import org.springframework.stereotype.Service;
1112

13+
import java.util.concurrent.CompletableFuture;
1214
import java.util.concurrent.ExecutorService;
15+
import java.util.function.Supplier;
1316

1417
/**
1518
* Enqueues and runs tasks in background. Services that need to run a task (tasks that finish, not long-running
@@ -25,6 +28,7 @@ public class TaskService {
2528

2629
private final ExecutorService taskExecutor;
2730
private final FxApplicationThreadExecutor fxApplicationThreadExecutor;
31+
private final I18n i18n;
2832

2933
private final ObservableList<Worker<?>> activeTasks = FXCollections.synchronizedObservableList(FXCollections.observableArrayList());
3034
private final ObservableList<Worker<?>> unmodifiableObservableList = FXCollections.unmodifiableObservableList(activeTasks);
@@ -36,7 +40,7 @@ public class TaskService {
3640
* @param task the task to execute
3741
*/
3842
public <T extends PrioritizedCompletableTask<?>> T submitTask(T task) {
39-
task.getFuture().whenComplete((o, throwable) -> {
43+
task.getFuture().whenComplete((_, throwable) -> {
4044
fxApplicationThreadExecutor.execute(() -> activeTasks.remove(task));
4145
if (throwable != null) {
4246
log.error("Task failed", throwable);
@@ -50,6 +54,15 @@ public <T extends PrioritizedCompletableTask<?>> T submitTask(T task) {
5054
return task;
5155
}
5256

57+
public <V> CompletableFuture<V> submitFutureTask(Supplier<CompletableFuture<V>> task) {
58+
return submitFutureTask(null, task);
59+
}
60+
61+
public <V> CompletableFuture<V> submitFutureTask(String titleI18nKey, Supplier<CompletableFuture<V>> task) {
62+
String title = titleI18nKey != null ? i18n.get(titleI18nKey) : null;
63+
return submitTask(new SimpleTask<>(title, task)).getFuture();
64+
}
65+
5366
public ObservableList<Worker<?>> getActiveWorkers() {
5467
return unmodifiableObservableList;
5568
}

src/test/java/com/faforever/client/game/GameRunnerTest.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.faforever.client.domain.server.PlayerInfo;
1414
import com.faforever.client.fa.ForgedAllianceLaunchService;
1515
import com.faforever.client.fa.GameParameters;
16-
import com.faforever.client.fa.GameParameters.League;
1716
import com.faforever.client.fa.relay.ice.CoturnService;
1817
import com.faforever.client.fa.relay.ice.IceAdapter;
1918
import com.faforever.client.featuredmod.FeaturedModService;
@@ -38,8 +37,7 @@
3837
import com.faforever.client.preferences.PreferencesService;
3938
import com.faforever.client.remote.FafServerAccessor;
4039
import com.faforever.client.replay.ReplayServer;
41-
import com.faforever.client.task.BackgroundTask;
42-
import com.faforever.client.task.CompletableTask;
40+
import com.faforever.client.task.SimpleTask;
4341
import com.faforever.client.task.TaskService;
4442
import com.faforever.client.test.ServiceTest;
4543
import com.faforever.client.theme.UiService;
@@ -152,7 +150,7 @@ public class GameRunnerTest extends ServiceTest {
152150
@Spy
153151
private NotificationPrefs notificationPrefs;
154152
@Captor
155-
private ArgumentCaptor<BackgroundTask<?>> backgroundTaskCaptor;
153+
private ArgumentCaptor<SimpleTask<?>> simpleTaskCaptor;
156154

157155
@Mock
158156
private EnterPasswordController enterPasswordController;
@@ -203,8 +201,8 @@ private void mockStartGameProcess(GameLaunchResponse gameLaunchResponse) throws
203201
lenient().when(iceAdapter.start(anyInt(), anyBoolean())).thenReturn(completedFuture(GPG_PORT));
204202
lenient().when(coturnService.getIceSession(anyInt()))
205203
.thenReturn(Mono.just(new IceSession("someSessionId", false, List.of())));
206-
lenient().when(taskService.submitTask(backgroundTaskCaptor.capture())).thenAnswer(_ -> {
207-
BackgroundTask<?> task = backgroundTaskCaptor.getValue();
204+
lenient().when(taskService.submitTask(simpleTaskCaptor.capture())).thenAnswer(_ -> {
205+
SimpleTask<?> task = simpleTaskCaptor.getValue();
208206
task.getFuture().join();
209207
return task;
210208
});

0 commit comments

Comments
 (0)