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

View File

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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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()) {

View File

@@ -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

View File

@@ -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(); //

View File

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

View File

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

View File

@@ -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:

View File

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

View File

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

View File

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

View File

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

View File

@@ -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(() -> {

View File

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