Bläddra i källkod

Refactored CustomMountPointChooser

See: https://github.com/cryptomator/cryptomator/pull/1307#discussion_r472832435
JaniruTEC 4 år sedan
förälder
incheckning
8483f71f57

+ 38 - 34
main/commons/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java

@@ -1,6 +1,5 @@
 package org.cryptomator.common.mountpoint;
 
-import org.cryptomator.common.vaults.MountPointRequirement;
 import org.cryptomator.common.vaults.Vault;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,46 +40,51 @@ public class CustomMountPointChooser implements MountPointChooser {
 
 	@Override
 	public boolean prepare(Path mountPoint) throws InvalidMountPointException {
-		MountPointRequirement requirement = this.vault.getMountPointRequirement();
-		//Requirement "NONE" doesn't make any sense here.
-		//No need to prepare/verify a Mountpoint without requiring one...
-		assert requirement != MountPointRequirement.NONE;
-
-		//Not implemented anywhere (yet)
-		assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT;
-
-		if(requirement == MountPointRequirement.PARENT_NO_MOUNT_POINT) {
-			//This the case on Windows when using FUSE
-			//See https://github.com/billziss-gh/winfsp/issues/320
-
-			Path parent = mountPoint.getParent();
-			if (!Files.isDirectory(parent)) {
-				throw new InvalidMountPointException(new NotDirectoryException(parent.toString()));
-			}
-			//We must use #notExists() here because notExists =/= !exists (see docs)
-			if (!Files.notExists(mountPoint, LinkOption.NOFOLLOW_LINKS)) {
-				//File exists OR can't be determined
-				throw new InvalidMountPointException(new FileAlreadyExistsException(mountPoint.toString()));
+		switch (this.vault.getMountPointRequirement()) {
+			case PARENT_NO_MOUNT_POINT -> prepareParentNoMountPoint(mountPoint);
+			case EMPTY_MOUNT_POINT -> prepareEmptyMountPoint(mountPoint);
+			case NONE -> {
+				//Requirement "NONE" doesn't make any sense here.
+				//No need to prepare/verify a Mountpoint without requiring one...
+				assert false : "Illegal MountPointRequirement";
 			}
-		} else if(requirement == MountPointRequirement.EMPTY_MOUNT_POINT) {
-			//This is the case for Windows when using Dokany
-			//and for Linux and Mac
-
-			if (!Files.isDirectory(mountPoint)) {
-				throw new InvalidMountPointException(new NotDirectoryException(mountPoint.toString()));
-			}
-			try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
-				if (ds.iterator().hasNext()) {
-					throw new InvalidMountPointException(new DirectoryNotEmptyException(mountPoint.toString()));
-				}
-			} catch (IOException exception) {
-				throw new InvalidMountPointException("IOException while checking folder content", exception);
+			default -> {
+				//Currently the case for "PARENT_OPT_MOUNT_POINT"
+				assert false : "Not implemented";
 			}
 		}
 		LOG.debug("Successfully checked custom mount point: {}", mountPoint);
 		return false;
 	}
 
+	private void prepareParentNoMountPoint(Path mountPoint) throws InvalidMountPointException {
+		//This the case on Windows when using FUSE
+		//See https://github.com/billziss-gh/winfsp/issues/320
+		Path parent = mountPoint.getParent();
+		if (!Files.isDirectory(parent)) {
+			throw new InvalidMountPointException(new NotDirectoryException(parent.toString()));
+		}
+		//We must use #notExists() here because notExists =/= !exists (see docs)
+		if (!Files.notExists(mountPoint, LinkOption.NOFOLLOW_LINKS)) {
+			//File exists OR can't be determined
+			throw new InvalidMountPointException(new FileAlreadyExistsException(mountPoint.toString()));
+		}
+	}
+
+	private void prepareEmptyMountPoint(Path mountPoint) throws InvalidMountPointException {
+		//This is the case for Windows when using Dokany and for Linux and Mac
+		if (!Files.isDirectory(mountPoint)) {
+			throw new InvalidMountPointException(new NotDirectoryException(mountPoint.toString()));
+		}
+		try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
+			if (ds.iterator().hasNext()) {
+				throw new InvalidMountPointException(new DirectoryNotEmptyException(mountPoint.toString()));
+			}
+		} catch (IOException exception) {
+			throw new InvalidMountPointException("IOException while checking folder content", exception);
+		}
+	}
+
 	@Override
 	public int getPosition() {
 		return POSITION;