From d073bdfad99240133e472272a59edfd4633b8d3b Mon Sep 17 00:00:00 2001 From: Markus Kreusch Date: Mon, 28 Dec 2015 21:29:34 +0100 Subject: [PATCH] Removed FolderCreateMode from filesystem api * Folder#create now always creates the parents --- .../org/cryptomator/filesystem/Copier.java | 2 +- .../org/cryptomator/filesystem/Folder.java | 16 +++----- .../filesystem/FolderCreateMode.java | 12 ------ .../crypto/fs/CryptoFileSystem.java | 7 ++-- .../cryptomator/crypto/fs/CryptoFolder.java | 17 ++------ .../crypto/fs/CryptoFileSystemTest.java | 34 ++++++++------- .../fs/EncryptAndShortenIntegrationTest.java | 26 +++++++----- .../filesystem/inmem/InMemoryFolder.java | 22 ++++------ .../inmem/InMemoryFileSystemTest.java | 7 ++-- .../shortening/FilenameShortener.java | 3 +- .../shortening/ShorteningFolder.java | 18 +++----- .../shortening/ShorteningFileSystemTest.java | 17 ++++---- .../filesystem/nio/NioFileSystem.java | 4 +- .../cryptomator/filesystem/nio/NioFolder.java | 12 +++--- .../filesystem/nio/NioFolderCreateMode.java | 41 ------------------- .../filesystem/nio/NioFolderTest.java | 28 +------------ .../webdav/jackrabbit/DavFolder.java | 6 +-- .../jackrabbit/InMemoryWebDavServer.java | 7 ++-- 18 files changed, 91 insertions(+), 188 deletions(-) delete mode 100644 main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java delete mode 100644 main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Copier.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Copier.java index 001ec0cf6..676e9ec92 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Copier.java +++ b/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()); diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Folder.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Folder.java index f07cd4c5c..662fc6873 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/Folder.java +++ b/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 diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java deleted file mode 100644 index 1084a389b..000000000 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/FolderCreateMode.java +++ /dev/null @@ -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 - -} diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFileSystem.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFileSystem.java index 4f56a5548..a9f771954 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFileSystem.java +++ b/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 diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFolder.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFolder.java index d002c0498..f8f39124a 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/fs/CryptoFolder.java +++ b/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 diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/CryptoFileSystemTest.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/CryptoFileSystemTest.java index 4606213e6..2538c8140 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/CryptoFileSystemTest.java +++ b/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(); diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/EncryptAndShortenIntegrationTest.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/EncryptAndShortenIntegrationTest.java index 21bbaa9c4..84a1b44fb 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/fs/EncryptAndShortenIntegrationTest.java +++ b/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()) { diff --git a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java index b63fa8665..9a2225699 100644 --- a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java +++ b/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 diff --git a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java b/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java index 11b614b86..0225601fc 100644 --- a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java +++ b/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(); // diff --git a/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/FilenameShortener.java b/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/FilenameShortener.java index 8edead604..382cc5238 100644 --- a/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/FilenameShortener.java +++ b/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))); } diff --git a/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/ShorteningFolder.java b/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/ShorteningFolder.java index 9261fb278..f3bb5ec56 100644 --- a/main/filesystem-nameshortening/src/main/java/org/cryptomator/shortening/ShorteningFolder.java +++ b/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 implements Folder { @@ -71,17 +69,15 @@ class ShorteningFolder extends ShorteningNode 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 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); } diff --git a/main/filesystem-nameshortening/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java b/main/filesystem-nameshortening/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java index 81aea2056..82e82bf29 100644 --- a/main/filesystem-nameshortening/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java +++ b/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: diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFileSystem.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFileSystem.java index 3ddd4476d..97f045ed4 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFileSystem.java +++ b/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(); } } diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolder.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolder.java index d4d3b22b9..bf87d7319 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolder.java +++ b/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); diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java deleted file mode 100644 index 23b1c88fc..000000000 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFolderCreateMode.java +++ /dev/null @@ -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); - -} diff --git a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFolderTest.java b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFolderTest.java index 8c16236d9..efd96969f 100644 --- a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFolderTest.java +++ b/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()); diff --git a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbit/DavFolder.java b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbit/DavFolder.java index cc6af380e..0d686a003 100644 --- a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbit/DavFolder.java +++ b/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 { } 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 { } /** - * @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(() -> { diff --git a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbit/InMemoryWebDavServer.java b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbit/InMemoryWebDavServer.java index 2e5397540..ca92d2124 100644 --- a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbit/InMemoryWebDavServer.java +++ b/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())); }