瀏覽代碼

Removed FolderCreateMode from filesystem api

* Folder#create now always creates the parents
Markus Kreusch 9 年之前
父節點
當前提交
d073bdfad9
共有 18 個文件被更改,包括 91 次插入188 次删除
  1. 1 1
      main/filesystem-api/src/main/java/org/cryptomator/filesystem/Copier.java
  2. 5 11
      main/filesystem-api/src/main/java/org/cryptomator/filesystem/Folder.java
  3. 0 12
      main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java
  4. 3 4
      main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFileSystem.java
  5. 4 13
      main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFolder.java
  6. 20 14
      main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/CryptoFileSystemTest.java
  7. 15 11
      main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/EncryptAndShortenIntegrationTest.java
  8. 8 14
      main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java
  9. 3 4
      main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java
  10. 1 2
      main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/FilenameShortener.java
  11. 6 12
      main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/ShorteningFolder.java
  12. 9 8
      main/filesystem-nameshortening/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java
  13. 1 3
      main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFileSystem.java
  14. 7 5
      main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolder.java
  15. 0 41
      main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java
  16. 2 26
      main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFolderTest.java
  17. 3 3
      main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbit/DavFolder.java
  18. 3 4
      main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbit/InMemoryWebDavServer.java

+ 1 - 1
main/filesystem-api/src/main/java/org/cryptomator/filesystem/Copier.java

@@ -6,7 +6,7 @@ class Copier {
 		assertFoldersAreNotNested(source, destination);
 
 		destination.delete();
-		destination.create(FolderCreateMode.INCLUDING_PARENTS);
+		destination.create();
 
 		source.files().forEach(sourceFile -> {
 			File destinationFile = destination.file(sourceFile.name());

+ 5 - 11
main/filesystem-api/src/main/java/org/cryptomator/filesystem/Folder.java

@@ -5,7 +5,6 @@
  ******************************************************************************/
 package org.cryptomator.filesystem;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.stream.Stream;
@@ -56,19 +55,14 @@ public interface Folder extends Node {
 	Folder folder(String name) throws UncheckedIOException;
 
 	/**
-	 * Creates the directory, if it doesn't exist yet. No effect, if folder
-	 * already exists.
+	 * Creates the directory including all parent directories, if it doesn't
+	 * exist yet. No effect, if folder already exists.
 	 * 
-	 * @param mode
-	 *            Depending on this option either the attempt is made to
-	 *            recursively create all parent directories or an exception is
-	 *            thrown if the parent doesn't exist yet.
 	 * @throws UncheckedIOException
-	 *             wrapping an {@link FileNotFoundException}, if mode is
-	 *             {@link FolderCreateMode#FAIL_IF_PARENT_IS_MISSING
-	 *             FAIL_IF_PARENT_IS_MISSING} and parent doesn't exist.
+	 *             if an {@link IOException} occurs while creating the folder or
+	 *             one of its parents
 	 */
-	void create(FolderCreateMode mode) throws UncheckedIOException;
+	void create() throws UncheckedIOException;
 
 	/**
 	 * Recusively copies this directory and all its contents to (not into) the

+ 0 - 12
main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java

@@ -1,12 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 Markus Kreusch
- * This file is licensed under the terms of the MIT license.
- * See the LICENSE.txt file for more info.
- ******************************************************************************/
-package org.cryptomator.filesystem;
-
-public enum FolderCreateMode {
-
-	FAIL_IF_PARENT_IS_MISSING, INCLUDING_PARENTS
-
-}

+ 3 - 4
main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFileSystem.java

@@ -15,7 +15,6 @@ import org.cryptomator.crypto.engine.Cryptor;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.FileSystem;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
 
@@ -93,15 +92,15 @@ public class CryptoFileSystem extends CryptoFolder implements FileSystem {
 	}
 
 	@Override
-	public void create(FolderCreateMode mode) {
-		physicalDataRoot().create(mode);
+	public void create() {
+		physicalDataRoot().create();
 		final File dirFile = physicalFile();
 		final String directoryId = getDirectoryId();
 		try (WritableFile writable = dirFile.openWritable()) {
 			final ByteBuffer buf = ByteBuffer.wrap(directoryId.getBytes());
 			writable.write(buf);
 		}
-		physicalFolder().create(FolderCreateMode.INCLUDING_PARENTS);
+		physicalFolder().create();
 	}
 
 	@Override

+ 4 - 13
main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFolder.java

@@ -8,8 +8,6 @@
  *******************************************************************************/
 package org.cryptomator.crypto.fs;
 
-import java.io.FileNotFoundException;
-import java.io.UncheckedIOException;
 import java.nio.ByteBuffer;
 import java.time.Instant;
 import java.util.UUID;
@@ -20,7 +18,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.cryptomator.crypto.engine.Cryptor;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.Node;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
@@ -105,23 +102,18 @@ class CryptoFolder extends CryptoNode implements Folder {
 	}
 
 	@Override
-	public void create(FolderCreateMode mode) {
+	public void create() {
 		final File dirFile = physicalFile();
 		if (dirFile.exists()) {
 			return;
 		}
-		if (!parent.exists() && FolderCreateMode.FAIL_IF_PARENT_IS_MISSING.equals(mode)) {
-			throw new UncheckedIOException(new FileNotFoundException(parent.name));
-		} else if (!parent.exists() && FolderCreateMode.INCLUDING_PARENTS.equals(mode)) {
-			parent.create(mode);
-		}
-		assert parent.exists();
+		parent.create();
 		final String directoryId = getDirectoryId();
 		try (WritableFile writable = dirFile.openWritable()) {
 			final ByteBuffer buf = ByteBuffer.wrap(directoryId.getBytes());
 			writable.write(buf);
 		}
-		physicalFolder().create(FolderCreateMode.INCLUDING_PARENTS);
+		physicalFolder().create();
 	}
 
 	@Override
@@ -138,8 +130,7 @@ class CryptoFolder extends CryptoNode implements Folder {
 			throw new IllegalArgumentException("Can not move directories containing one another (src: " + this + ", dst: " + target + ")");
 		}
 
-		target.physicalFile().parent().get().create(FolderCreateMode.INCLUDING_PARENTS);
-		assert target.physicalFile().parent().get().exists();
+		target.physicalFile().parent().get().create();
 		this.physicalFile().moveTo(target.physicalFile());
 
 		// directoryId is now used by target, we must no longer use the same id

+ 20 - 14
main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/CryptoFileSystemTest.java

@@ -20,7 +20,6 @@ import org.cryptomator.crypto.engine.NoCryptor;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.FileSystem;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
 import org.cryptomator.filesystem.inmem.InMemoryFileSystem;
@@ -47,11 +46,15 @@ public class CryptoFileSystemTest {
 		final FileSystem fs = new CryptoFileSystem(physicalFs, cryptor, "foo");
 		Assert.assertTrue(masterkeyFile.exists());
 		Assert.assertTrue(masterkeyBkupFile.exists());
-		fs.create(FolderCreateMode.INCLUDING_PARENTS);
+		fs.create();
 		Assert.assertTrue(physicalDataRoot.exists());
-		Assert.assertEquals(3, physicalFs.children().count()); // d + masterkey.cryptomator + masterkey.cryptomator.bkup
+		Assert.assertEquals(3, physicalFs.children().count()); // d +
+																// masterkey.cryptomator
+																// +
+																// masterkey.cryptomator.bkup
 		Assert.assertEquals(1, physicalDataRoot.files().count()); // ROOT file
-		Assert.assertEquals(1, physicalDataRoot.folders().count()); // ROOT directory
+		Assert.assertEquals(1, physicalDataRoot.folders().count()); // ROOT
+																	// directory
 	}
 
 	@Test(timeout = 1000)
@@ -69,7 +72,8 @@ public class CryptoFileSystemTest {
 		Assert.assertTrue(masterkeyBkupFile.exists());
 		final Instant bkupDateT0 = masterkeyBkupFile.lastModified();
 
-		// make sure some time passes, as the resolution of last modified date is not in nanos:
+		// make sure some time passes, as the resolution of last modified date
+		// is not in nanos:
 		Thread.sleep(1);
 
 		// second initialization:
@@ -87,17 +91,18 @@ public class CryptoFileSystemTest {
 		final FileSystem physicalFs = new InMemoryFileSystem();
 		final Folder physicalDataRoot = physicalFs.folder("d");
 		final FileSystem fs = new CryptoFileSystem(physicalFs, cryptor, "foo");
-		fs.create(FolderCreateMode.INCLUDING_PARENTS);
+		fs.create();
 
 		// add another encrypted folder:
 		final Folder fooFolder = fs.folder("foo");
 		final Folder fooBarFolder = fooFolder.folder("bar");
 		Assert.assertFalse(fooFolder.exists());
 		Assert.assertFalse(fooBarFolder.exists());
-		fooBarFolder.create(FolderCreateMode.INCLUDING_PARENTS);
+		fooBarFolder.create();
 		Assert.assertTrue(fooFolder.exists());
 		Assert.assertTrue(fooBarFolder.exists());
-		Assert.assertEquals(3, countDataFolders(physicalDataRoot)); // parent + foo + bar
+		Assert.assertEquals(3, countDataFolders(physicalDataRoot)); // parent +
+																	// foo + bar
 	}
 
 	@Test(timeout = 1000)
@@ -106,14 +111,14 @@ public class CryptoFileSystemTest {
 		final Cryptor cryptor = new NoCryptor();
 		final FileSystem physicalFs = new InMemoryFileSystem();
 		final FileSystem fs = new CryptoFileSystem(physicalFs, cryptor, "foo");
-		fs.create(FolderCreateMode.INCLUDING_PARENTS);
+		fs.create();
 
 		// create foo/bar/ and then move foo/ to baz/:
 		final Folder fooFolder = fs.folder("foo");
 		final Folder fooBarFolder = fooFolder.folder("bar");
 		final Folder bazFolder = fs.folder("baz");
 		final Folder bazBarFolder = bazFolder.folder("bar");
-		fooBarFolder.create(FolderCreateMode.INCLUDING_PARENTS);
+		fooBarFolder.create();
 		Assert.assertTrue(fooBarFolder.exists());
 		Assert.assertFalse(bazFolder.exists());
 		fooFolder.moveTo(bazFolder);
@@ -129,12 +134,12 @@ public class CryptoFileSystemTest {
 		final Cryptor cryptor = new NoCryptor();
 		final FileSystem physicalFs = new InMemoryFileSystem();
 		final FileSystem fs = new CryptoFileSystem(physicalFs, cryptor, "foo");
-		fs.create(FolderCreateMode.INCLUDING_PARENTS);
+		fs.create();
 
 		// create foo/bar/ and then try to move foo/bar/ to foo/
 		final Folder fooFolder = fs.folder("foo");
 		final Folder fooBarFolder = fooFolder.folder("bar");
-		fooBarFolder.create(FolderCreateMode.INCLUDING_PARENTS);
+		fooBarFolder.create();
 		fooBarFolder.moveTo(fooFolder);
 	}
 
@@ -144,7 +149,7 @@ public class CryptoFileSystemTest {
 		final Cryptor cryptor = new NoCryptor();
 		final FileSystem physicalFs = new InMemoryFileSystem();
 		final FileSystem fs = new CryptoFileSystem(physicalFs, cryptor, "foo");
-		fs.create(FolderCreateMode.INCLUDING_PARENTS);
+		fs.create();
 
 		// write test content to file
 		try (WritableFile writable = fs.file("test1.txt").openWritable()) {
@@ -165,7 +170,8 @@ public class CryptoFileSystemTest {
 	}
 
 	/**
-	 * @return number of folders on second level inside the given dataRoot folder.
+	 * @return number of folders on second level inside the given dataRoot
+	 *         folder.
 	 */
 	private static int countDataFolders(Folder dataRoot) {
 		final AtomicInteger num = new AtomicInteger();

+ 15 - 11
main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/EncryptAndShortenIntegrationTest.java

@@ -8,7 +8,6 @@ import org.cryptomator.crypto.engine.impl.TestCryptorImplFactory;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.FileSystem;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.Node;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
@@ -19,7 +18,8 @@ import org.junit.Test;
 
 public class EncryptAndShortenIntegrationTest {
 
-	// private static final Logger LOG = LoggerFactory.getLogger(EncryptAndShortenIntegrationTest.class);
+	// private static final Logger LOG =
+	// LoggerFactory.getLogger(EncryptAndShortenIntegrationTest.class);
 
 	@Test
 	public void testEncryptionOfLongFolderNames() {
@@ -28,25 +28,29 @@ public class EncryptAndShortenIntegrationTest {
 		final Cryptor cryptor = TestCryptorImplFactory.insecureCryptorImpl();
 		cryptor.randomizeMasterkey();
 		final FileSystem fs = new CryptoFileSystem(shorteningFs, cryptor, "foo");
-		fs.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		fs.create();
 		final Folder shortFolder = fs.folder("normal folder name");
-		shortFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		shortFolder.create();
 		final Folder longFolder = fs.folder("this will be a long filename after encryption");
-		longFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		longFolder.create();
 
 		// the long name will produce a metadata file on the physical layer:
-		// LOG.debug("Physical file system:\n" + DirectoryPrinter.print(physicalFs));
+		// LOG.debug("Physical file system:\n" +
+		// DirectoryPrinter.print(physicalFs));
 		Assert.assertEquals(1, physicalFs.folder("m").folders().count());
 
-		// on the second layer all .lng files are resolved to their actual names:
-		// LOG.debug("Unlimited filename length:\n" + DirectoryPrinter.print(shorteningFs));
+		// on the second layer all .lng files are resolved to their actual
+		// names:
+		// LOG.debug("Unlimited filename length:\n" +
+		// DirectoryPrinter.print(shorteningFs));
 		DirectoryWalker.walk(shorteningFs, node -> {
 			Assert.assertFalse(node.name().endsWith(".lng"));
 		});
 
-		// on the third (cleartext layer) we have cleartext names on the root level:
+		// on the third (cleartext layer) we have cleartext names on the root
+		// level:
 		// LOG.debug("Cleartext files:\n" + DirectoryPrinter.print(fs));
-		Assert.assertArrayEquals(new String[] {"normal folder name", "this will be a long filename after encryption"}, fs.folders().map(Node::name).sorted().toArray());
+		Assert.assertArrayEquals(new String[] { "normal folder name", "this will be a long filename after encryption" }, fs.folders().map(Node::name).sorted().toArray());
 	}
 
 	@Test
@@ -56,7 +60,7 @@ public class EncryptAndShortenIntegrationTest {
 		final Cryptor cryptor = TestCryptorImplFactory.insecureCryptorImpl();
 		cryptor.randomizeMasterkey();
 		final FileSystem fs = new CryptoFileSystem(shorteningFs, cryptor, "foo");
-		fs.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		fs.create();
 
 		// write test content to encrypted file
 		try (WritableFile writable = fs.file("test1.txt").openWritable()) {

+ 8 - 14
main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java

@@ -8,7 +8,6 @@
  *******************************************************************************/
 package org.cryptomator.filesystem.inmem;
 
-import java.io.FileNotFoundException;
 import java.io.UncheckedIOException;
 import java.nio.file.FileAlreadyExistsException;
 import java.time.Instant;
@@ -20,7 +19,6 @@ import java.util.stream.Stream;
 
 import org.apache.commons.io.FileExistsException;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 
 class InMemoryFolder extends InMemoryNode implements Folder {
 
@@ -67,16 +65,11 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 	}
 
 	@Override
-	public void create(FolderCreateMode mode) {
+	public void create() {
 		if (exists()) {
 			return;
 		}
-		if (!parent.exists() && FolderCreateMode.FAIL_IF_PARENT_IS_MISSING.equals(mode)) {
-			throw new UncheckedIOException(new FileNotFoundException(parent.name));
-		} else if (!parent.exists() && FolderCreateMode.INCLUDING_PARENTS.equals(mode)) {
-			parent.create(mode);
-		}
-		assert parent.exists();
+		parent.create();
 		parent.children.compute(this.name(), (k, v) -> {
 			if (v == null) {
 				this.lastModified = Instant.now();
@@ -93,11 +86,11 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 		if (target.exists()) {
 			target.delete();
 		}
-		assert!target.exists();
-		target.create(FolderCreateMode.INCLUDING_PARENTS);
+		assert !target.exists();
+		target.create();
 		this.copyTo(target);
 		this.delete();
-		assert!this.exists();
+		assert !this.exists();
 	}
 
 	@Override
@@ -114,11 +107,12 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 			// recursively on folders:
 			if (entry.getValue() instanceof InMemoryFolder) {
 				InMemoryFolder subFolder = (InMemoryFolder) entry.getValue();
-				// this will try to itself from our children, which is ok as we're using an iterator here.
+				// this will try to itself from our children, which is ok as
+				// we're using an iterator here.
 				subFolder.delete();
 			}
 		}
-		assert!this.exists();
+		assert !this.exists();
 	}
 
 	@Override

+ 3 - 4
main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java

@@ -16,7 +16,6 @@ import java.util.concurrent.TimeoutException;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.FileSystem;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
 import org.junit.Assert;
@@ -34,7 +33,7 @@ public class InMemoryFileSystemTest {
 		Assert.assertEquals(0, fs.folders().count());
 
 		// create /foo
-		fooFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		fooFolder.create();
 		Assert.assertTrue(fooFolder.exists());
 		Assert.assertEquals(1, fs.folders().count());
 
@@ -46,7 +45,7 @@ public class InMemoryFileSystemTest {
 		// create /foo/bar
 		Folder fooBarFolder = fooFolder.folder("bar");
 		Assert.assertFalse(fooBarFolder.exists());
-		fooBarFolder.create(FolderCreateMode.INCLUDING_PARENTS);
+		fooBarFolder.create();
 		Assert.assertTrue(fooFolder.exists());
 		Assert.assertTrue(fooBarFolder.exists());
 		Assert.assertEquals(1, fs.folders().count());
@@ -149,7 +148,7 @@ public class InMemoryFileSystemTest {
 		final Folder qweAsdFolder = fs.folder("qwe").folder("asd");
 		final File test1File = fooBarFolder.file("test1.txt");
 		final File test2File = fooBarFolder.file("test2.txt");
-		fooBarFolder.create(FolderCreateMode.INCLUDING_PARENTS);
+		fooBarFolder.create();
 
 		// create some files inside foo/bar/
 		try (WritableFile writable1 = test1File.openWritable(); //

+ 1 - 2
main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/FilenameShortener.java

@@ -11,7 +11,6 @@ import org.apache.commons.codec.binary.Base32;
 import org.apache.commons.codec.binary.BaseNCodec;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
 
@@ -53,7 +52,7 @@ class FilenameShortener {
 	public void saveMapping(String longName, String shortName) {
 		final File mappingFile = mappingFile(shortName);
 		if (!mappingFile.exists()) {
-			mappingFile.parent().get().create(FolderCreateMode.INCLUDING_PARENTS);
+			mappingFile.parent().get().create();
 			try (WritableFile writable = mappingFile.openWritable()) {
 				writable.write(ByteBuffer.wrap(longName.getBytes(StandardCharsets.UTF_8)));
 			}

+ 6 - 12
main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/ShorteningFolder.java

@@ -1,6 +1,5 @@
 package org.cryptomator.shortening;
 
-import java.io.FileNotFoundException;
 import java.io.UncheckedIOException;
 import java.nio.file.FileAlreadyExistsException;
 import java.util.function.Predicate;
@@ -8,7 +7,6 @@ import java.util.stream.Stream;
 
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.Node;
 
 class ShorteningFolder extends ShorteningNode<Folder> implements Folder {
@@ -71,17 +69,15 @@ class ShorteningFolder extends ShorteningNode<Folder> implements Folder {
 	}
 
 	@Override
-	public void create(FolderCreateMode mode) {
-		if (!parent().get().exists() && FolderCreateMode.FAIL_IF_PARENT_IS_MISSING.equals(mode)) {
-			throw new UncheckedIOException(new FileNotFoundException(parent().get().name()));
-		} else if (!parent().get().exists() && FolderCreateMode.INCLUDING_PARENTS.equals(mode)) {
-			parent().get().create(mode);
+	public void create() {
+		if (exists()) {
+			return;
 		}
-		assert parent().get().exists();
+		parent().get().create();
 		if (shortener.isShortened(shortName())) {
 			shortener.saveMapping(name(), shortName());
 		}
-		delegate.create(mode);
+		delegate.create();
 	}
 
 	@Override
@@ -103,9 +99,7 @@ class ShorteningFolder extends ShorteningNode<Folder> implements Folder {
 			throw new IllegalArgumentException("Can not move directories containing one another (src: " + this + ", dst: " + target + ")");
 		}
 
-		if (!target.exists()) {
-			target.create(FolderCreateMode.INCLUDING_PARENTS);
-		}
+		target.create();
 
 		delegate.moveTo(target.delegate);
 	}

+ 9 - 8
main/filesystem-nameshortening/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java

@@ -8,7 +8,6 @@ import java.util.concurrent.TimeoutException;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.FileSystem;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
 import org.cryptomator.filesystem.inmem.InMemoryFileSystem;
@@ -22,7 +21,7 @@ public class ShorteningFileSystemTest {
 		final FileSystem underlyingFs = new InMemoryFileSystem();
 		final Folder metadataRoot = underlyingFs.folder("m");
 		final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
-		fs.folder("morethantenchars").create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		fs.folder("morethantenchars").create();
 		Assert.assertTrue(metadataRoot.exists());
 		Assert.assertEquals(1, fs.folders().count());
 	}
@@ -40,9 +39,11 @@ public class ShorteningFileSystemTest {
 		final FileSystem underlyingFs = new InMemoryFileSystem();
 		final Folder metadataRoot = underlyingFs.folder("m");
 		final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
-		final Folder longNamedFolder = fs.folder("morethantenchars"); // base32(sha1(morethantenchars)) = QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP
+		final Folder longNamedFolder = fs.folder("morethantenchars"); // base32(sha1(morethantenchars))
+																		// =
+																		// QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP
 		final File correspondingMetadataFile = metadataRoot.folder("QM").folder("JL").file("QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP.lng");
-		longNamedFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		longNamedFolder.create();
 		Assert.assertTrue(longNamedFolder.exists());
 		Assert.assertTrue(correspondingMetadataFile.exists());
 	}
@@ -54,7 +55,7 @@ public class ShorteningFileSystemTest {
 		final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
 
 		final Folder shortNamedFolder = fs.folder("test");
-		shortNamedFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		shortNamedFolder.create();
 		Assert.assertFalse(metadataRoot.children().findAny().isPresent());
 
 		final Folder longNamedFolder = fs.folder("morethantenchars");
@@ -88,7 +89,7 @@ public class ShorteningFileSystemTest {
 		final Folder metadataRoot = underlyingFs.folder("m");
 		final FileSystem fs1 = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
 		final Folder longNamedFolder1 = fs1.folder("morethantenchars");
-		longNamedFolder1.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		longNamedFolder1.create();
 
 		final FileSystem fs2 = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
 		final Folder longNamedFolder2 = fs2.folder("morethantenchars");
@@ -102,7 +103,7 @@ public class ShorteningFileSystemTest {
 
 		// write:
 		final FileSystem fs1 = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
-		fs1.folder("morethantenchars").create(FolderCreateMode.INCLUDING_PARENTS);
+		fs1.folder("morethantenchars").create();
 		try (WritableFile file = fs1.folder("morethantenchars").file("morethanelevenchars.txt").openWritable()) {
 			file.write(ByteBuffer.wrap("hello world".getBytes()));
 		}
@@ -127,7 +128,7 @@ public class ShorteningFileSystemTest {
 		Thread.sleep(1);
 
 		// of folders:
-		underlyingFs.folder("foo").folder("bar").create(FolderCreateMode.INCLUDING_PARENTS);
+		underlyingFs.folder("foo").folder("bar").create();
 		Assert.assertTrue(fs.folder("foo").folder("bar").exists());
 
 		// from underlying:

+ 1 - 3
main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFileSystem.java

@@ -1,7 +1,5 @@
 package org.cryptomator.filesystem.nio;
 
-import static org.cryptomator.filesystem.FolderCreateMode.INCLUDING_PARENTS;
-
 import java.nio.file.Path;
 import java.util.Optional;
 
@@ -15,7 +13,7 @@ public class NioFileSystem extends NioFolder implements FileSystem {
 
 	private NioFileSystem(Path root) {
 		super(Optional.empty(), root);
-		create(INCLUDING_PARENTS);
+		create();
 	}
 
 }

+ 7 - 5
main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolder.java

@@ -2,7 +2,6 @@ package org.cryptomator.filesystem.nio;
 
 import static java.lang.String.format;
 import static org.cryptomator.filesystem.FileSystemVisitor.fileSystemVisitor;
-import static org.cryptomator.filesystem.FolderCreateMode.INCLUDING_PARENTS;
 
 import java.io.IOException;
 import java.io.UncheckedIOException;
@@ -13,7 +12,6 @@ import java.util.stream.Stream;
 
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.Node;
 import org.cryptomator.filesystem.WritableFile;
 
@@ -62,8 +60,12 @@ class NioFolder extends NioNode implements Folder {
 	}
 
 	@Override
-	public void create(FolderCreateMode mode) throws UncheckedIOException {
-		NioFolderCreateMode.valueOf(mode).create(path);
+	public void create() throws UncheckedIOException {
+		try {
+			Files.createDirectories(path);
+		} catch (IOException e) {
+			throw new UncheckedIOException(e);
+		}
 	}
 
 	@Override
@@ -78,7 +80,7 @@ class NioFolder extends NioNode implements Folder {
 	private void internalMoveTo(NioFolder target) {
 		try {
 			target.delete();
-			target.parent().ifPresent(folder -> folder.create(INCLUDING_PARENTS));
+			target.parent().ifPresent(folder -> folder.create());
 			Files.move(path, target.path);
 		} catch (IOException e) {
 			throw new UncheckedIOException(e);

+ 0 - 41
main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java

@@ -1,41 +0,0 @@
-package org.cryptomator.filesystem.nio;
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import org.cryptomator.filesystem.FolderCreateMode;
-
-enum NioFolderCreateMode {
-
-	FAIL_IF_PARENT_IS_MISSING {
-		@Override
-		void create(Path folderPath) {
-			try {
-				Files.createDirectory(folderPath);
-			} catch (IOException e) {
-				throw new UncheckedIOException(e);
-			}
-		}
-	},
-	INCLUDING_PARENTS {
-		@Override
-		void create(Path folderPath) {
-			try {
-				Files.createDirectories(folderPath);
-			} catch (IOException e) {
-				throw new UncheckedIOException(e);
-			}
-		}
-	}
-
-	;
-
-	public static NioFolderCreateMode valueOf(FolderCreateMode mode) {
-		return valueOf(mode.name());
-	}
-
-	abstract void create(Path folderPath);
-
-}

+ 2 - 26
main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFolderTest.java

@@ -2,8 +2,6 @@ package org.cryptomator.filesystem.nio;
 
 import static java.util.stream.Collectors.toList;
 import static org.cryptomator.common.test.matcher.ContainsMatcher.containsInAnyOrder;
-import static org.cryptomator.filesystem.FolderCreateMode.FAIL_IF_PARENT_IS_MISSING;
-import static org.cryptomator.filesystem.FolderCreateMode.INCLUDING_PARENTS;
 import static org.cryptomator.filesystem.nio.FilesystemSetupUtils.emptyFilesystem;
 import static org.cryptomator.filesystem.nio.FilesystemSetupUtils.file;
 import static org.cryptomator.filesystem.nio.FilesystemSetupUtils.folder;
@@ -38,38 +36,16 @@ public class NioFolderTest {
 	}
 
 	@Test
-	public void testCreateWithOptionFailIfParentIsMissingFailsIfParentIsMissing() throws IOException {
-		NioFileSystem fileSystem = NioFileSystem.rootedAt(emptyFilesystem());
-		Folder folderWithNonExistingParent = fileSystem.folder("a").folder("b");
-
-		thrown.expect(UncheckedIOException.class);
-		thrown.expectMessage(fileSystem.path.resolve("a/b").toString());
-
-		folderWithNonExistingParent.create(FAIL_IF_PARENT_IS_MISSING);
-	}
-
-	@Test
-	public void testCreateWithOptionIncludingParentsSucceedsIfParentIsMissing() throws IOException {
+	public void testCreateSucceedsIfParentIsMissing() throws IOException {
 		Path emptyFilesystemPath = emptyFilesystem();
 		NioFileSystem fileSystem = NioFileSystem.rootedAt(emptyFilesystemPath);
 		Folder folderWithNonExistingParent = fileSystem.folder("a").folder("b");
 
-		folderWithNonExistingParent.create(INCLUDING_PARENTS);
+		folderWithNonExistingParent.create();
 
 		assertThat(Files.isDirectory(emptyFilesystemPath.resolve("a/b")), is(true));
 	}
 
-	@Test
-	public void testCreateWithOptionFailIfParentIsMissingSucceedsIfParentIsPresent() throws IOException {
-		Path emptyFilesystemPath = emptyFilesystem();
-		NioFileSystem fileSystem = NioFileSystem.rootedAt(emptyFilesystemPath);
-		Folder nonExistingFolder = fileSystem.folder("a");
-
-		nonExistingFolder.create(FAIL_IF_PARENT_IS_MISSING);
-
-		assertThat(Files.isDirectory(emptyFilesystemPath.resolve("a")), is(true));
-	}
-
 	@Test
 	public void testChildrenOfEmptyNioFolderAreEmpty() throws IOException {
 		NioFolder folder = NioFileSystem.rootedAt(emptyFilesystem());

+ 3 - 3
main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbit/DavFolder.java

@@ -32,7 +32,6 @@ import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
 import org.apache.jackrabbit.webdav.property.ResourceType;
 import org.cryptomator.filesystem.File;
 import org.cryptomator.filesystem.Folder;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.Node;
 import org.cryptomator.filesystem.WritableFile;
 import org.cryptomator.webdav.jackrabbit.DavPathFactory.DavPath;
@@ -67,7 +66,7 @@ class DavFolder extends DavNode<Folder> {
 	}
 
 	private void addMemberFolder(DavFolder memberFolder) {
-		node.folder(memberFolder.getDisplayName()).create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING);
+		node.folder(memberFolder.getDisplayName()).create();
 	}
 
 	private void addMemberFile(DavFile memberFile, InputStream inputStream) {
@@ -117,7 +116,8 @@ class DavFolder extends DavNode<Folder> {
 	}
 
 	/**
-	 * @throws DavException Error 404 if no child with the given name exists
+	 * @throws DavException
+	 *             Error 404 if no child with the given name exists
 	 */
 	private Node getMemberNode(String name) throws DavException {
 		return node.children().filter(c -> c.name().equals(name)).findAny().orElseThrow(() -> {

+ 3 - 4
main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbit/InMemoryWebDavServer.java

@@ -18,7 +18,6 @@ import java.util.concurrent.LinkedBlockingQueue;
 import javax.servlet.DispatcherType;
 
 import org.cryptomator.filesystem.FileSystem;
-import org.cryptomator.filesystem.FolderCreateMode;
 import org.cryptomator.filesystem.WritableFile;
 import org.cryptomator.filesystem.inmem.InMemoryFileSystem;
 import org.cryptomator.webdav.filters.AcceptRangeFilter;
@@ -61,7 +60,7 @@ public class InMemoryWebDavServer {
 		servletContext.addFilter(UriNormalizationFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
 		servletCollection.mapContexts();
 
-		server.setConnectors(new Connector[] {localConnector});
+		server.setConnectors(new Connector[] { localConnector });
 		server.setHandler(servletCollection);
 	}
 
@@ -76,8 +75,8 @@ public class InMemoryWebDavServer {
 	public static void main(String[] args) throws Exception {
 		final InMemoryWebDavServer server = new InMemoryWebDavServer();
 
-		server.inMemoryFileSystem.folder("mamals").folder("cats").create(FolderCreateMode.INCLUDING_PARENTS);
-		server.inMemoryFileSystem.folder("mamals").folder("dogs").create(FolderCreateMode.INCLUDING_PARENTS);
+		server.inMemoryFileSystem.folder("mamals").folder("cats").create();
+		server.inMemoryFileSystem.folder("mamals").folder("dogs").create();
 		try (WritableFile writable = server.inMemoryFileSystem.folder("mamals").folder("cats").file("Garfield.txt").openWritable()) {
 			writable.write(ByteBuffer.wrap("meow".getBytes()));
 		}