Added/Refactored exceptions to account for more cases

This commit is contained in:
JaniruTEC
2023-07-11 20:48:46 +02:00
parent 12f5f41968
commit 08a1e1ec7d
5 changed files with 40 additions and 6 deletions

View File

@@ -0,0 +1,10 @@
package org.cryptomator.common.mount;
import java.nio.file.Path;
public class HideawayAlreadyExistsException extends IllegalMountPointException {
public HideawayAlreadyExistsException(Path path, String msg) {
super(path, msg);
}
}

View File

@@ -0,0 +1,10 @@
package org.cryptomator.common.mount;
import java.nio.file.Path;
public class MountPointCouldNotBeClearedException extends IllegalMountPointException {
public MountPointCouldNotBeClearedException(Path path) {
super(path, "Mountpoint could not be cleared: " + path.toString());
}
}

View File

@@ -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);
}
}

View File

@@ -7,4 +7,8 @@ public class MountPointNotExistsException extends IllegalMountPointException {
public MountPointNotExistsException(Path path, String msg) {
super(path, msg);
}
public MountPointNotExistsException(Path path) {
super(path, "Mountpoint does not exist: " + path);
}
}

View File

@@ -19,16 +19,16 @@ public final class MountWithinParentUtil {
private MountWithinParentUtil() {}
static void prepareParentNoMountPoint(Path mountPoint) throws IllegalMountPointException {
static void prepareParentNoMountPoint(Path mountPoint) throws IllegalMountPointException, MountPointPreparationException {
Path hideaway = getHideaway(mountPoint);
var mpExists = Files.exists(mountPoint, LinkOption.NOFOLLOW_LINKS);
var hideExists = Files.exists(hideaway, LinkOption.NOFOLLOW_LINKS);
//TODO: possible improvement by just deleting an _empty_ hideaway
if (mpExists && hideExists) { //both resources exist (whatever type)
throw new IllegalMountPointException(mountPoint);
throw new HideawayAlreadyExistsException(mountPoint, "Hideaway (" + hideaway + ") already exists for mountpoint: " + mountPoint);
} else if (!mpExists && !hideExists) { //neither mountpoint nor hideaway exist
throw new IllegalMountPointException(mountPoint);
throw new MountPointNotExistsException(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);
@@ -51,7 +51,7 @@ public final class MountWithinParentUtil {
int attempts = 0;
while (!Files.notExists(mountPoint)) {
if (attempts >= 10) {
throw new IllegalMountPointException(mountPoint, "Path could not be cleared: " + mountPoint);
throw new MountPointCouldNotBeClearedException(mountPoint);
}
Thread.sleep(1000);
attempts++;
@@ -98,14 +98,14 @@ public final class MountWithinParentUtil {
private static void checkIsDirectory(Path toCheck) throws IllegalMountPointException {
if (!Files.isDirectory(toCheck, LinkOption.NOFOLLOW_LINKS)) {
throw new IllegalMountPointException(toCheck);
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint is not a directory: " + toCheck);
}
}
private static void checkIsEmpty(Path toCheck) throws IllegalMountPointException, IOException {
try (var dirStream = Files.list(toCheck)) {
if (dirStream.findFirst().isPresent()) {
throw new IllegalMountPointException(toCheck);
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint directory is not empty: " + toCheck);
}
}
}