- Fixes #128 and #119 by using unique directory id as associated data during filename encryption/decryption

- Using WeakValuedCache in all filesystem layers to prevent "twin" instances of the same folder
- Merge branch 'layered-io' of https://github.com/cryptomator/cryptomator into layered-io
This commit is contained in:
Sebastian Stenzel
2016-01-10 16:27:56 +01:00
21 changed files with 467 additions and 66 deletions
@@ -13,6 +13,7 @@ import java.time.Instant;
import java.util.Optional;
import java.util.stream.Stream;
import org.cryptomator.common.WeakValuedCache;
import org.cryptomator.filesystem.File;
import org.cryptomator.filesystem.Folder;
import org.cryptomator.filesystem.Node;
@@ -21,6 +22,8 @@ public abstract class DelegatingFolder<R extends DelegatingReadableFile, W exten
implements Folder {
private final D parent;
private final WeakValuedCache<Folder, D> folders = WeakValuedCache.usingLoader(this::newFolder);
private final WeakValuedCache<File, F> files = WeakValuedCache.usingLoader(this::newFile);
public DelegatingFolder(D parent, Folder delegate) {
super(delegate);
@@ -39,27 +42,27 @@ public abstract class DelegatingFolder<R extends DelegatingReadableFile, W exten
@Override
public Stream<D> folders() {
return delegate.folders().map(this::folder);
return delegate.folders().map(folders::get);
}
@Override
public Stream<F> files() throws UncheckedIOException {
return delegate.files().map(this::file);
return delegate.files().map(files::get);
}
@Override
public F file(String name) throws UncheckedIOException {
return file(delegate.file(name));
return files.get(delegate.file(name));
}
protected abstract F file(File delegate);
protected abstract F newFile(File delegate);
@Override
public D folder(String name) throws UncheckedIOException {
return folder(delegate.folder(name));
return folders.get(delegate.folder(name));
}
protected abstract D folder(Folder delegate);
protected abstract D newFolder(Folder delegate);
@Override
public void create() throws UncheckedIOException {
@@ -161,4 +161,17 @@ public class DelegatingFolderTest {
Mockito.verify(mockFolder).delete();
}
@Test
public void testSubresourcesAreSameInstance() {
Folder mockFolder = Mockito.mock(Folder.class);
Folder mockSubFolder = Mockito.mock(Folder.class);
File mockSubFile = Mockito.mock(File.class);
Mockito.when(mockFolder.folder("mockSubFolder")).thenReturn(mockSubFolder);
Mockito.when(mockFolder.file("mockSubFile")).thenReturn(mockSubFile);
DelegatingFolder<?, ?, ?, ?> delegatingFolder = new TestDelegatingFolder(null, mockFolder);
Assert.assertSame(delegatingFolder.folder("mockSubFolder"), delegatingFolder.folder("mockSubFolder"));
Assert.assertSame(delegatingFolder.file("mockSubFile"), delegatingFolder.file("mockSubFile"));
}
}
@@ -10,12 +10,12 @@ class TestDelegatingFolder extends DelegatingFolder<DelegatingReadableFile, Dele
}
@Override
protected TestDelegatingFile file(File delegate) {
protected TestDelegatingFile newFile(File delegate) {
return new TestDelegatingFile(this, delegate);
}
@Override
protected TestDelegatingFolder folder(Folder delegate) {
protected TestDelegatingFolder newFolder(Folder delegate) {
return new TestDelegatingFolder(this, delegate);
}