Removed FolderCreateMode from filesystem api

* Folder#create now always creates the parents
This commit is contained in:
Markus Kreusch
2015-12-28 21:29:34 +01:00
parent 62d8cdfe4f
commit d073bdfad9
18 changed files with 91 additions and 188 deletions
@@ -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
@@ -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,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();
@@ -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()) {