From e9f5593e33459bb3813872c9be6827745d59a556 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 1 Jan 2016 23:09:48 +0100 Subject: [PATCH] fixed InMemoryFileSystem: Only one volatile file/folder for a given name at a time. --- .../cryptomator/filesystem/inmem/InMemoryFile.java | 1 + .../filesystem/inmem/InMemoryFolder.java | 14 ++++++++++---- .../shortening/ShorteningFileSystemTest.java | 4 +--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java index 26ec3d2e0..b3ce61b1f 100644 --- a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java +++ b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java @@ -53,6 +53,7 @@ class InMemoryFile extends InMemoryNode implements File { throw new UncheckedIOException(new FileExistsException(k)); } }); + parent.volatileFiles.remove(name); return new InMemoryWritableFile(this::setLastModified, this::getContent, this::setContent, this::delete, writeLock); } 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 5074c015d..509fdd77e 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 @@ -22,7 +22,8 @@ import org.cryptomator.filesystem.Folder; class InMemoryFolder extends InMemoryNode implements Folder { final Map children = new TreeMap<>(); - final Map volatileChildren = new HashMap<>(); + final Map volatileFiles = new HashMap<>(); + final Map volatileFolders = new HashMap<>(); public InMemoryFolder(InMemoryFolder parent, String name, Instant lastModified) { super(parent, name, lastModified); @@ -39,7 +40,9 @@ class InMemoryFolder extends InMemoryNode implements Folder { if (node instanceof InMemoryFile) { return (InMemoryFile) node; } else { - return new InMemoryFile(this, name, Instant.MIN); + return volatileFiles.computeIfAbsent(name, (n) -> { + return new InMemoryFile(this, n, Instant.MIN); + }); } } @@ -49,7 +52,9 @@ class InMemoryFolder extends InMemoryNode implements Folder { if (node instanceof InMemoryFolder) { return (InMemoryFolder) node; } else { - return new InMemoryFolder(this, name, Instant.MIN); + return volatileFolders.computeIfAbsent(name, (n) -> { + return new InMemoryFolder(this, n, Instant.MIN); + }); } } @@ -59,7 +64,7 @@ class InMemoryFolder extends InMemoryNode implements Folder { return; } parent.create(); - parent.children.compute(this.name(), (k, v) -> { + parent.children.compute(name, (k, v) -> { if (v == null) { this.lastModified = Instant.now(); return this; @@ -67,6 +72,7 @@ class InMemoryFolder extends InMemoryNode implements Folder { throw new UncheckedIOException(new FileExistsException(k)); } }); + parent.volatileFolders.remove(name); assert this.exists(); } diff --git a/main/filesystem-nameshortening/src/test/java/org/cryptomator/filesystem/shortening/ShorteningFileSystemTest.java b/main/filesystem-nameshortening/src/test/java/org/cryptomator/filesystem/shortening/ShorteningFileSystemTest.java index 8b92a198c..6a6b65d65 100644 --- a/main/filesystem-nameshortening/src/test/java/org/cryptomator/filesystem/shortening/ShorteningFileSystemTest.java +++ b/main/filesystem-nameshortening/src/test/java/org/cryptomator/filesystem/shortening/ShorteningFileSystemTest.java @@ -30,9 +30,7 @@ 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(); Assert.assertTrue(longNamedFolder.exists());