fixed InMemoryFileSystem: Only one volatile file/folder for a given name at a time.

This commit is contained in:
Sebastian Stenzel
2016-01-01 23:09:48 +01:00
parent a9744167c1
commit e9f5593e33
3 changed files with 12 additions and 7 deletions

View File

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

View File

@@ -22,7 +22,8 @@ import org.cryptomator.filesystem.Folder;
class InMemoryFolder extends InMemoryNode implements Folder {
final Map<String, InMemoryNode> children = new TreeMap<>();
final Map<String, InMemoryNode> volatileChildren = new HashMap<>();
final Map<String, InMemoryFile> volatileFiles = new HashMap<>();
final Map<String, InMemoryFolder> 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();
}

View File

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