From 422ce4a3873c8b7acb35d5832ec796e1e9bdd3b8 Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Wed, 18 Nov 2020 16:27:43 +0100 Subject: [PATCH] Moved actual choosing of MPCs to MountPointHelper --- .../mountpoint/MacVolumeMountChooser.java | 34 +++---------------- .../common/mountpoint/MountPointHelper.java | 28 ++++++++++++++- .../TemporaryMountPointChooser.java | 28 +-------------- 3 files changed, 32 insertions(+), 58 deletions(-) diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/MacVolumeMountChooser.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/MacVolumeMountChooser.java index 3a017273f..64c0ed979 100644 --- a/main/commons/src/main/java/org/cryptomator/common/mountpoint/MacVolumeMountChooser.java +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/MacVolumeMountChooser.java @@ -3,25 +3,22 @@ package org.cryptomator.common.mountpoint; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.vaults.Volume; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; -import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; class MacVolumeMountChooser implements MountPointChooser { - private static final Logger LOG = LoggerFactory.getLogger(MacVolumeMountChooser.class); - private static final int MAX_MOUNTPOINT_CREATION_RETRIES = 10; private static final Path VOLUME_PATH = Path.of("/Volumes"); private final VaultSettings vaultSettings; + private final MountPointHelper helper; @Inject - public MacVolumeMountChooser(VaultSettings vaultSettings) { + public MacVolumeMountChooser(VaultSettings vaultSettings, MountPointHelper helper) { this.vaultSettings = vaultSettings; + this.helper = helper; } @Override @@ -31,30 +28,7 @@ class MacVolumeMountChooser implements MountPointChooser { @Override public Optional chooseMountPoint(Volume caller) { - return Optional.of(VOLUME_PATH).map(this::choose); - } - - private Path choose(Path parent) { - String basename = this.vaultSettings.mountName().get(); - //regular - Path mountPoint = parent.resolve(basename); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - //with id - mountPoint = parent.resolve(basename + " (" + vaultSettings.getId() + ")"); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - //with id and count - for (int i = 1; i < MAX_MOUNTPOINT_CREATION_RETRIES; i++) { - mountPoint = parent.resolve(basename + "_(" + vaultSettings.getId() + ")_" + i); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - } - LOG.error("Failed to find feasible mountpoint at /Volumes/{}_x. Giving up after {} attempts.", basename, MAX_MOUNTPOINT_CREATION_RETRIES); - return null; + return Optional.of(VOLUME_PATH).map(dir -> this.helper.chooseTemporaryMountPoint(this.vaultSettings, dir)); } @Override diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java index 8bfef7f32..c72aeb44c 100644 --- a/main/commons/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java @@ -1,11 +1,13 @@ package org.cryptomator.common.mountpoint; import org.cryptomator.common.Environment; +import org.cryptomator.common.settings.VaultSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Singleton; +import java.io.File; import java.io.IOException; import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; @@ -19,6 +21,8 @@ class MountPointHelper { public static Logger LOG = LoggerFactory.getLogger(MountPointHelper.class); + private static final int MAX_TMPMOUNTPOINT_CREATION_RETRIES = 10; + private final Optional tmpMountPointDir; private volatile boolean alreadyChecked = false; @@ -27,6 +31,28 @@ class MountPointHelper { this.tmpMountPointDir = env.getMountPointsDir(); } + public Path chooseTemporaryMountPoint(VaultSettings vaultSettings, Path parentDir) { + String basename = vaultSettings.mountName().get(); + //regular + Path mountPoint = parentDir.resolve(basename); + if (Files.notExists(mountPoint)) { + return mountPoint; + } + //with id + mountPoint = parentDir.resolve(basename + " (" + vaultSettings.getId() + ")"); + if (Files.notExists(mountPoint)) { + return mountPoint; + } + //with id and count + for (int i = 1; i < MAX_TMPMOUNTPOINT_CREATION_RETRIES; i++) { + mountPoint = parentDir.resolve(basename + "_(" + vaultSettings.getId() + ")_" + i); + if (Files.notExists(mountPoint)) { + return mountPoint; + } + } + LOG.error("Failed to find feasible mountpoint at {}{}{}_x. Giving up after {} attempts.", parentDir, File.separator, basename, MAX_TMPMOUNTPOINT_CREATION_RETRIES); + return null; + } public synchronized void clearIrregularUnmountDebrisIfNeeded() { if (alreadyChecked || tmpMountPointDir.isEmpty()) { @@ -88,7 +114,7 @@ class MountPointHelper { } private void ensureIsEmpty(Path dir) throws IOException { - if(Files.newDirectoryStream(dir).iterator().hasNext()) { + if (Files.newDirectoryStream(dir).iterator().hasNext()) { throw new DirectoryNotEmptyException(dir.toString()); } } diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java index 43ce79134..eb1d8d0b1 100644 --- a/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java @@ -7,7 +7,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -16,7 +15,6 @@ import java.util.Optional; class TemporaryMountPointChooser implements MountPointChooser { private static final Logger LOG = LoggerFactory.getLogger(TemporaryMountPointChooser.class); - private static final int MAX_TMPMOUNTPOINT_CREATION_RETRIES = 10; private final VaultSettings vaultSettings; private final Environment environment; @@ -44,31 +42,7 @@ class TemporaryMountPointChooser implements MountPointChooser { //clean leftovers of not-regularly unmounted vaults //see https://github.com/cryptomator/cryptomator/issues/1013 and https://github.com/cryptomator/cryptomator/issues/1061 helper.clearIrregularUnmountDebrisIfNeeded(); - return this.environment.getMountPointsDir().map(this::choose); - } - - - private Path choose(Path parent) { - String basename = this.vaultSettings.mountName().get(); - //regular - Path mountPoint = parent.resolve(basename); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - //with id - mountPoint = parent.resolve(basename + " (" + vaultSettings.getId() + ")"); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - //with id and count - for (int i = 1; i < MAX_TMPMOUNTPOINT_CREATION_RETRIES; i++) { - mountPoint = parent.resolve(basename + "_(" + vaultSettings.getId() + ")_" + i); - if (Files.notExists(mountPoint)) { - return mountPoint; - } - } - LOG.error("Failed to find feasible mountpoint at {}{}{}_x. Giving up after {} attempts.", parent, File.separator, basename, MAX_TMPMOUNTPOINT_CREATION_RETRIES); - return null; + return this.environment.getMountPointsDir().map(dir -> this.helper.chooseTemporaryMountPoint(this.vaultSettings, dir)); } @Override