improved AutoUnlocker readability

This commit is contained in:
Sebastian Stenzel
2023-05-23 09:48:27 +02:00
parent 49bda58993
commit f338d2447b
2 changed files with 18 additions and 10 deletions

View File

@@ -13,6 +13,7 @@ import java.util.concurrent.CompletionStage;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Stream;
@FxApplicationScoped
@@ -35,8 +36,19 @@ public class AutoUnlocker {
public void tryUnlockForTimespan(int timespan, TimeUnit timeUnit) {
// Unlock all available auto unlock vaults
unlock(vaults.stream().filter(v -> v.getVaultSettings().unlockAfterStartup().get()));
Predicate<Vault> shouldAutoUnlock = v -> v.getVaultSettings().unlockAfterStartup().get();
unlockSequentially(vaults.stream().filter(shouldAutoUnlock)).thenRun(() -> startUnlockMissing(timespan, timeUnit));
}
private CompletionStage<Void> unlockSequentially(Stream<Vault> vaultStream) {
// this is an attempt to run all the unlock workflows sequentially, i.e. start the next workflow only after completing/failing the previous workflow.
return vaultStream.filter(Vault::isLocked).reduce(CompletableFuture.completedFuture(null),
(prevUnlock, nextVault) -> prevUnlock.thenCompose(unused -> appWindows.startUnlockWorkflow(nextVault, null)),
(prevUnlock, nextUnlock) -> nextUnlock.exceptionally(e -> null) // we don't care here about the exception, logged elsewhere
);
}
private void startUnlockMissing(int timespan, TimeUnit timeUnit) {
// Start a temporary service if there are missing auto unlock vaults
if (getMissingAutoUnlockVaults().findAny().isPresent()) {
LOG.info("Found MISSING vaults, starting periodic check");
@@ -45,18 +57,13 @@ public class AutoUnlocker {
}
}
private void unlock(Stream<Vault> vaultStream) {
vaultStream.filter(Vault::isLocked)
.<CompletionStage<Void>>reduce(CompletableFuture.completedFuture(null),
(unlockFlow, v) -> unlockFlow.handle((voit, ex) -> appWindows.startUnlockWorkflow(v, null)).thenCompose(stage -> stage), // we don't care here about the exception, logged elsewhere
(unlockChain1, unlockChain2) -> unlockChain1.handle((voit, ex) -> unlockChain2).thenCompose(stage -> stage));
}
private void unlockMissing() {
List<Vault> missingAutoUnlockVaults = getMissingAutoUnlockVaults().toList();
missingAutoUnlockVaults.forEach(VaultListManager::redetermineVaultState);
unlock(missingAutoUnlockVaults.stream());
unlockSequentially(missingAutoUnlockVaults.stream()).thenRun(this::stopUnlockMissing);
}
private void stopUnlockMissing() {
// Stop checking if there are no more missing vaults
if (getMissingAutoUnlockVaults().findAny().isEmpty()) {
LOG.info("No more MISSING vaults, stopping periodic check");

View File

@@ -12,6 +12,7 @@ import org.cryptomator.ui.preferences.PreferencesComponent;
import org.cryptomator.ui.preferences.SelectedPreferencesTab;
import org.cryptomator.ui.quit.QuitComponent;
import org.cryptomator.ui.unlock.UnlockComponent;
import org.cryptomator.ui.unlock.UnlockWorkflow;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -114,7 +115,7 @@ public class FxApplicationWindows {
LOG.debug("Start unlock workflow for {}", vault.getDisplayName());
return unlockWorkflowFactory.create(vault, owner).unlockWorkflow();
}, Platform::runLater) //
.thenCompose(unlockWorkflow -> CompletableFuture.runAsync(unlockWorkflow, executor)) //
.thenAcceptAsync(UnlockWorkflow::run, executor)
.exceptionally(e -> {
showErrorWindow(e, owner == null ? primaryStage : owner, null);
return null;