diff --git a/src/main/java/org/cryptomator/common/mount/ExistingHideawayException.java b/src/main/java/org/cryptomator/common/mount/ExistingHideawayException.java
new file mode 100644
index 000000000..aa720d42c
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/mount/ExistingHideawayException.java
@@ -0,0 +1,17 @@
+package org.cryptomator.common.mount;
+
+import java.nio.file.Path;
+
+public class ExistingHideawayException extends IllegalMountPointException {
+
+ private final Path hideaway;
+
+ public ExistingHideawayException(Path path, Path hideaway, String msg) {
+ super(path, msg);
+ this.hideaway = hideaway;
+ }
+
+ public Path getHideaway() {
+ return hideaway;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/common/mount/IllegalMountPointException.java b/src/main/java/org/cryptomator/common/mount/IllegalMountPointException.java
index 5fdb1d91c..30419d85c 100644
--- a/src/main/java/org/cryptomator/common/mount/IllegalMountPointException.java
+++ b/src/main/java/org/cryptomator/common/mount/IllegalMountPointException.java
@@ -1,9 +1,25 @@
package org.cryptomator.common.mount;
+import java.nio.file.Path;
+
+/**
+ * Indicates that validation or preparation of a mountpoint failed due to a configuration error or an invalid system state.
+ * Instances of this exception are usually caught and displayed to the user in an appropriate fashion, e.g. by {@link org.cryptomator.ui.unlock.UnlockInvalidMountPointController UnlockInvalidMountPointController.}
+ */
public class IllegalMountPointException extends IllegalArgumentException {
- public IllegalMountPointException(String msg) {
- super(msg);
+ private final Path mountpoint;
+
+ public IllegalMountPointException(Path mountpoint) {
+ this(mountpoint, "The provided mountpoint has a problem: " + mountpoint.toString());
}
-}
+ public IllegalMountPointException(Path mountpoint, String msg) {
+ super(msg);
+ this.mountpoint = mountpoint;
+ }
+
+ public Path getMountpoint() {
+ return mountpoint;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointCleanupFailedException.java b/src/main/java/org/cryptomator/common/mount/MountPointCleanupFailedException.java
new file mode 100644
index 000000000..6246e124c
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/mount/MountPointCleanupFailedException.java
@@ -0,0 +1,10 @@
+package org.cryptomator.common.mount;
+
+import java.nio.file.Path;
+
+public class MountPointCleanupFailedException extends IllegalMountPointException {
+
+ public MountPointCleanupFailedException(Path path) {
+ super(path, "Mountpoint could not be cleared: " + path.toString());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointInUseException.java b/src/main/java/org/cryptomator/common/mount/MountPointInUseException.java
index 9f7f11174..d104cff4d 100644
--- a/src/main/java/org/cryptomator/common/mount/MountPointInUseException.java
+++ b/src/main/java/org/cryptomator/common/mount/MountPointInUseException.java
@@ -1,8 +1,10 @@
package org.cryptomator.common.mount;
+import java.nio.file.Path;
+
public class MountPointInUseException extends IllegalMountPointException {
- public MountPointInUseException(String msg) {
- super(msg);
+ public MountPointInUseException(Path path) {
+ super(path);
}
}
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointNotEmptyDirectoryException.java b/src/main/java/org/cryptomator/common/mount/MountPointNotEmptyDirectoryException.java
new file mode 100644
index 000000000..79801613f
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/mount/MountPointNotEmptyDirectoryException.java
@@ -0,0 +1,10 @@
+package org.cryptomator.common.mount;
+
+import java.nio.file.Path;
+
+public class MountPointNotEmptyDirectoryException extends IllegalMountPointException {
+
+ public MountPointNotEmptyDirectoryException(Path path, String msg) {
+ super(path, msg);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointNotExistingException.java b/src/main/java/org/cryptomator/common/mount/MountPointNotExistingException.java
new file mode 100644
index 000000000..bebf63ee3
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/mount/MountPointNotExistingException.java
@@ -0,0 +1,14 @@
+package org.cryptomator.common.mount;
+
+import java.nio.file.Path;
+
+public class MountPointNotExistingException extends IllegalMountPointException {
+
+ public MountPointNotExistingException(Path path, String msg) {
+ super(path, msg);
+ }
+
+ public MountPointNotExistingException(Path path) {
+ super(path, "Mountpoint does not exist: " + path);
+ }
+}
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointNotExistsException.java b/src/main/java/org/cryptomator/common/mount/MountPointNotExistsException.java
deleted file mode 100644
index e90523bc2..000000000
--- a/src/main/java/org/cryptomator/common/mount/MountPointNotExistsException.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.cryptomator.common.mount;
-
-public class MountPointNotExistsException extends IllegalMountPointException {
-
- public MountPointNotExistsException(String msg) {
- super(msg);
- }
-}
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointNotSupportedException.java b/src/main/java/org/cryptomator/common/mount/MountPointNotSupportedException.java
index e321f23b1..94e59121c 100644
--- a/src/main/java/org/cryptomator/common/mount/MountPointNotSupportedException.java
+++ b/src/main/java/org/cryptomator/common/mount/MountPointNotSupportedException.java
@@ -1,8 +1,10 @@
package org.cryptomator.common.mount;
+import java.nio.file.Path;
+
public class MountPointNotSupportedException extends IllegalMountPointException {
- public MountPointNotSupportedException(String msg) {
- super(msg);
+ public MountPointNotSupportedException(Path path, String msg) {
+ super(path, msg);
}
}
diff --git a/src/main/java/org/cryptomator/common/mount/MountPointPreparationException.java b/src/main/java/org/cryptomator/common/mount/MountPointPreparationException.java
deleted file mode 100644
index e4734e011..000000000
--- a/src/main/java/org/cryptomator/common/mount/MountPointPreparationException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.cryptomator.common.mount;
-
-public class MountPointPreparationException extends RuntimeException {
-
- public MountPointPreparationException(String msg) {
- super(msg);
- }
-
- public MountPointPreparationException(Throwable cause) {
- super(cause);
- }
-}
diff --git a/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java b/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java
index 6a7d96d5c..cabaf6775 100644
--- a/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java
+++ b/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java
@@ -5,7 +5,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
-import java.nio.file.DirectoryNotEmptyException;
+import java.io.UncheckedIOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
@@ -23,14 +23,15 @@ public final class MountWithinParentUtil {
private MountWithinParentUtil() {}
- static void prepareParentNoMountPoint(Path mountPoint) throws MountPointPreparationException {
+ static void prepareParentNoMountPoint(Path mountPoint) throws IllegalMountPointException {
Path hideaway = getHideaway(mountPoint);
var mpExists = removeResidualJunction(mountPoint); //Handle junction as not existing
var hideExists = Files.exists(hideaway, LinkOption.NOFOLLOW_LINKS);
//TODO: possible improvement by just deleting an _empty_ hideaway
+ //TODO: Remove "ExistingHideawayException"
if (!mpExists && !hideExists) { //neither mountpoint nor hideaway exist
- throw new MountPointPreparationException(new NoSuchFileException(mountPoint.toString()));
+ throw new MountPointNotExistingException(mountPoint);
} else if (!mpExists) { //only hideaway exists
checkIsDirectory(hideaway);
LOG.info("Mountpoint {} seems to be not properly cleaned up. Will be fixed on unmount.", mountPoint);
@@ -39,7 +40,7 @@ public final class MountWithinParentUtil {
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
}
} catch (IOException e) {
- throw new MountPointPreparationException(e);
+ throw new UncheckedIOException(e);
}
} else { //mountpoint exists...
try {
@@ -58,20 +59,21 @@ public final class MountWithinParentUtil {
int attempts = 0;
while (!Files.notExists(mountPoint)) {
if (attempts >= 10) {
- throw new MountPointPreparationException("Path " + mountPoint + " could not be cleared");
+ throw new MountPointCleanupFailedException(mountPoint);
}
Thread.sleep(1000);
attempts++;
}
} catch (IOException e) {
- throw new MountPointPreparationException(e);
+ throw new UncheckedIOException(e);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
- throw new MountPointPreparationException(e);
+ throw new RuntimeException(e);
}
}
}
+ //TODO Remove MountPointPreparationException
private static boolean removeResidualJunction(Path path) throws MountPointPreparationException {
try {
if (Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS).isOther()) {
@@ -87,6 +89,7 @@ public final class MountWithinParentUtil {
}
}
+ //TODO Remove MountPointPreparationException
private static void removeResidualHideaway(Path hideaway) throws IOException {
if (!Files.isDirectory(hideaway, LinkOption.NOFOLLOW_LINKS)) {
throw new MountPointPreparationException(new NotDirectoryException(hideaway.toString()));
@@ -130,16 +133,16 @@ public final class MountWithinParentUtil {
}
}
- private static void checkIsDirectory(Path toCheck) throws MountPointPreparationException {
+ private static void checkIsDirectory(Path toCheck) throws IllegalMountPointException {
if (!Files.isDirectory(toCheck, LinkOption.NOFOLLOW_LINKS)) {
- throw new MountPointPreparationException(new NotDirectoryException(toCheck.toString()));
+ throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint is not a directory: " + toCheck);
}
}
- private static void checkIsEmpty(Path toCheck) throws MountPointPreparationException, IOException {
+ private static void checkIsEmpty(Path toCheck) throws IllegalMountPointException, IOException {
try (var dirStream = Files.list(toCheck)) {
if (dirStream.findFirst().isPresent()) {
- throw new MountPointPreparationException(new DirectoryNotEmptyException(toCheck.toString()));
+ throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint directory is not empty: " + toCheck);
}
}
}
diff --git a/src/main/java/org/cryptomator/common/mount/Mounter.java b/src/main/java/org/cryptomator/common/mount/Mounter.java
index 593cb6666..101524ea3 100644
--- a/src/main/java/org/cryptomator/common/mount/Mounter.java
+++ b/src/main/java/org/cryptomator/common/mount/Mounter.java
@@ -99,7 +99,7 @@ public class Mounter {
var mpIsDriveLetter = userChosenMountPoint.toString().matches("[A-Z]:\\\\");
if (mpIsDriveLetter) {
if (driveLetters.getOccupied().contains(userChosenMountPoint)) {
- throw new MountPointInUseException(userChosenMountPoint.toString());
+ throw new MountPointInUseException(userChosenMountPoint);
}
} else if (canMountToParent && !canMountToDir) {
MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint);
@@ -115,13 +115,13 @@ public class Mounter {
|| (!canMountToParent && !mpIsDriveLetter) //
|| (!canMountToDir && !canMountToParent && !canMountToSystem && !canMountToDriveLetter);
if (configNotSupported) {
- throw new MountPointNotSupportedException(e.getMessage());
+ throw new MountPointNotSupportedException(userChosenMountPoint, e.getMessage());
} else if (canMountToDir && !canMountToParent && !Files.exists(userChosenMountPoint)) {
//mountpoint must exist
- throw new MountPointNotExistsException(e.getMessage());
+ throw new MountPointNotExistingException(userChosenMountPoint, e.getMessage());
} else {
//TODO: add specific exception for !canMountToDir && canMountToParent && !Files.notExists(userChosenMountPoint)
- throw new IllegalMountPointException(e.getMessage());
+ throw new IllegalMountPointException(userChosenMountPoint, e.getMessage());
}
}
}
diff --git a/src/main/java/org/cryptomator/ui/controls/FormattedLabel.java b/src/main/java/org/cryptomator/ui/controls/FormattedLabel.java
index 04ed7e477..4c0883cba 100644
--- a/src/main/java/org/cryptomator/ui/controls/FormattedLabel.java
+++ b/src/main/java/org/cryptomator/ui/controls/FormattedLabel.java
@@ -13,18 +13,19 @@ public class FormattedLabel extends Label {
private final StringProperty format = new SimpleStringProperty("");
private final ObjectProperty