mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-18 18:51:26 +00:00
Removed FolderCreateMode from filesystem api
* Folder#create now always creates the parents
This commit is contained in:
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(); //
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,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());
|
||||
|
||||
@@ -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(() -> {
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user