mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-28 15:40:20 +00:00
DelegatingFileSystem: Use factories for Files, Folders, ReadableFiles and WritableFiles
This commit is contained in:
@@ -9,23 +9,31 @@
|
||||
package org.cryptomator.filesystem.delegating;
|
||||
|
||||
import java.io.UncheckedIOException;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.cryptomator.filesystem.File;
|
||||
import org.cryptomator.filesystem.ReadableFile;
|
||||
import org.cryptomator.filesystem.WritableFile;
|
||||
|
||||
public class DelegatingFile extends DelegatingNode<File>implements File {
|
||||
|
||||
public DelegatingFile(DelegatingFolder parent, File delegate) {
|
||||
private final Function<ReadableFile, DelegatingReadableFile> readableFileFactory;
|
||||
private final Function<WritableFile, DelegatingWritableFile> writableFileFactory;
|
||||
|
||||
public DelegatingFile(DelegatingFolder parent, File delegate, Function<ReadableFile, DelegatingReadableFile> readableFileFactory, Function<WritableFile, DelegatingWritableFile> writableFileFactory) {
|
||||
super(parent, delegate);
|
||||
this.readableFileFactory = readableFileFactory;
|
||||
this.writableFileFactory = writableFileFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DelegatingReadableFile openReadable() throws UncheckedIOException {
|
||||
return new DelegatingReadableFile(delegate.openReadable());
|
||||
return readableFileFactory.apply(delegate.openReadable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public DelegatingWritableFile openWritable() throws UncheckedIOException {
|
||||
return new DelegatingWritableFile(delegate.openWritable());
|
||||
return writableFileFactory.apply(delegate.openWritable());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,13 +8,28 @@
|
||||
*******************************************************************************/
|
||||
package org.cryptomator.filesystem.delegating;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import org.cryptomator.filesystem.File;
|
||||
import org.cryptomator.filesystem.FileSystem;
|
||||
import org.cryptomator.filesystem.Folder;
|
||||
|
||||
public class DelegatingFileSystem extends DelegatingFolder implements FileSystem {
|
||||
|
||||
public DelegatingFileSystem(Folder delegate) {
|
||||
super(null, delegate);
|
||||
private DelegatingFileSystem(Folder delegate, BiFunction<DelegatingFolder, Folder, DelegatingFolder> folderFactory, BiFunction<DelegatingFolder, File, DelegatingFile> fileFactory) {
|
||||
super(null, delegate, folderFactory, fileFactory);
|
||||
}
|
||||
|
||||
public static DelegatingFileSystem withDelegate(Folder delegate) {
|
||||
return new DelegatingFileSystem(delegate, DelegatingFileSystem::subFolder, DelegatingFileSystem::subFile);
|
||||
}
|
||||
|
||||
private static DelegatingFolder subFolder(DelegatingFolder parent, Folder delegateSubFolder) {
|
||||
return new DelegatingFolder(parent, delegateSubFolder, DelegatingFileSystem::subFolder, DelegatingFileSystem::subFile);
|
||||
}
|
||||
|
||||
private static DelegatingFile subFile(DelegatingFolder parent, File delegateSubFile) {
|
||||
return new DelegatingFile(parent, delegateSubFile, DelegatingReadableFile::new, DelegatingWritableFile::new);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package org.cryptomator.filesystem.delegating;
|
||||
|
||||
import java.io.UncheckedIOException;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.cryptomator.filesystem.File;
|
||||
@@ -16,8 +17,13 @@ import org.cryptomator.filesystem.Folder;
|
||||
|
||||
public class DelegatingFolder extends DelegatingNode<Folder>implements Folder {
|
||||
|
||||
public DelegatingFolder(DelegatingFolder parent, Folder delegate) {
|
||||
private final BiFunction<DelegatingFolder, Folder, DelegatingFolder> folderFactory;
|
||||
private final BiFunction<DelegatingFolder, File, DelegatingFile> fileFactory;
|
||||
|
||||
public DelegatingFolder(DelegatingFolder parent, Folder delegate, BiFunction<DelegatingFolder, Folder, DelegatingFolder> folderFactory, BiFunction<DelegatingFolder, File, DelegatingFile> fileFactory) {
|
||||
super(parent, delegate);
|
||||
this.folderFactory = folderFactory;
|
||||
this.fileFactory = fileFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -41,7 +47,7 @@ public class DelegatingFolder extends DelegatingNode<Folder>implements Folder {
|
||||
}
|
||||
|
||||
private DelegatingFile file(File delegate) {
|
||||
return new DelegatingFile(this, delegate);
|
||||
return fileFactory.apply(this, delegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -50,7 +56,7 @@ public class DelegatingFolder extends DelegatingNode<Folder>implements Folder {
|
||||
}
|
||||
|
||||
private DelegatingFolder folder(Folder delegate) {
|
||||
return new DelegatingFolder(this, delegate);
|
||||
return folderFactory.apply(this, delegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,9 +14,9 @@ import java.util.Optional;
|
||||
|
||||
import org.cryptomator.filesystem.Node;
|
||||
|
||||
class DelegatingNode<T extends Node> implements Node {
|
||||
abstract class DelegatingNode<T extends Node> implements Node {
|
||||
|
||||
protected final DelegatingFolder parent;
|
||||
private final DelegatingFolder parent;
|
||||
protected final T delegate;
|
||||
|
||||
public DelegatingNode(DelegatingFolder parent, T delegate) {
|
||||
@@ -28,13 +28,13 @@ class DelegatingNode<T extends Node> implements Node {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() throws UncheckedIOException {
|
||||
return delegate.name();
|
||||
public Optional<DelegatingFolder> parent() throws UncheckedIOException {
|
||||
return Optional.ofNullable(parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<DelegatingFolder> parent() throws UncheckedIOException {
|
||||
return Optional.ofNullable(parent);
|
||||
public String name() throws UncheckedIOException {
|
||||
return delegate.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,7 +23,7 @@ public class DelegatingFileTest {
|
||||
@Test
|
||||
public void testName() {
|
||||
File mockFile = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile, null, null);
|
||||
|
||||
Mockito.when(mockFile.name()).thenReturn("Test");
|
||||
Assert.assertEquals(mockFile.name(), delegatingFile.name());
|
||||
@@ -34,15 +34,15 @@ public class DelegatingFileTest {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
File mockFile = Mockito.mock(File.class);
|
||||
|
||||
DelegatingFolder delegatingParent = new DelegatingFileSystem(mockFolder);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(delegatingParent, mockFile);
|
||||
DelegatingFolder delegatingParent = DelegatingFileSystem.withDelegate(mockFolder);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(delegatingParent, mockFile, null, null);
|
||||
Assert.assertEquals(delegatingParent, delegatingFile.parent().get());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExists() {
|
||||
File mockFile = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile, null, null);
|
||||
|
||||
Mockito.when(mockFile.exists()).thenReturn(true);
|
||||
Assert.assertTrue(delegatingFile.exists());
|
||||
@@ -57,7 +57,7 @@ public class DelegatingFileTest {
|
||||
Instant now = Instant.now();
|
||||
|
||||
Mockito.when(mockFile.lastModified()).thenReturn(now);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile, null, null);
|
||||
Assert.assertEquals(now, delegatingFile.lastModified());
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public class DelegatingFileTest {
|
||||
ReadableFile mockReadableFile = Mockito.mock(ReadableFile.class);
|
||||
|
||||
Mockito.when(mockFile.openReadable()).thenReturn(mockReadableFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile, DelegatingReadableFile::new, null);
|
||||
Assert.assertNotNull(delegatingFile.openReadable());
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ public class DelegatingFileTest {
|
||||
WritableFile mockWritableFile = Mockito.mock(WritableFile.class);
|
||||
|
||||
Mockito.when(mockFile.openWritable()).thenReturn(mockWritableFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile);
|
||||
DelegatingFile delegatingFile = new DelegatingFile(null, mockFile, null, DelegatingWritableFile::new);
|
||||
Assert.assertNotNull(delegatingFile.openWritable());
|
||||
}
|
||||
|
||||
@@ -85,8 +85,8 @@ public class DelegatingFileTest {
|
||||
public void testMoveTo() {
|
||||
File mockFile1 = Mockito.mock(File.class);
|
||||
File mockFile2 = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1, null, null);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2, null, null);
|
||||
|
||||
delegatingFile1.moveTo(delegatingFile2);
|
||||
Mockito.verify(mockFile1).moveTo(mockFile2);
|
||||
@@ -96,7 +96,7 @@ public class DelegatingFileTest {
|
||||
public void testMoveToDestinationFromDifferentLayer() {
|
||||
File mockFile1 = Mockito.mock(File.class);
|
||||
File mockFile2 = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1, null, null);
|
||||
|
||||
delegatingFile1.moveTo(mockFile2);
|
||||
}
|
||||
@@ -105,8 +105,8 @@ public class DelegatingFileTest {
|
||||
public void testCopyTo() {
|
||||
File mockFile1 = Mockito.mock(File.class);
|
||||
File mockFile2 = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1, null, null);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2, null, null);
|
||||
|
||||
delegatingFile1.copyTo(delegatingFile2);
|
||||
Mockito.verify(mockFile1).copyTo(mockFile2);
|
||||
@@ -116,7 +116,7 @@ public class DelegatingFileTest {
|
||||
public void testCopyToDestinationFromDifferentLayer() {
|
||||
File mockFile1 = Mockito.mock(File.class);
|
||||
File mockFile2 = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1, null, null);
|
||||
|
||||
delegatingFile1.copyTo(mockFile2);
|
||||
Mockito.verify(mockFile1).copyTo(mockFile2);
|
||||
@@ -128,8 +128,8 @@ public class DelegatingFileTest {
|
||||
File mockFile2 = Mockito.mock(File.class);
|
||||
|
||||
Mockito.when(mockFile1.compareTo(mockFile2)).thenReturn(-1);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2);
|
||||
DelegatingFile delegatingFile1 = new DelegatingFile(null, mockFile1, null, null);
|
||||
DelegatingFile delegatingFile2 = new DelegatingFile(null, mockFile2, null, null);
|
||||
Assert.assertEquals(-1, delegatingFile1.compareTo(delegatingFile2));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class DelegatingFolderTest {
|
||||
@Test
|
||||
public void testName() {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder, null, null);
|
||||
|
||||
Mockito.when(mockFolder.name()).thenReturn("Test");
|
||||
Assert.assertEquals(mockFolder.name(), delegatingFolder.name());
|
||||
@@ -37,15 +37,15 @@ public class DelegatingFolderTest {
|
||||
Folder mockFolder1 = Mockito.mock(Folder.class);
|
||||
Folder mockFolder2 = Mockito.mock(Folder.class);
|
||||
|
||||
DelegatingFolder delegatingParent = new DelegatingFileSystem(mockFolder1);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(delegatingParent, mockFolder2);
|
||||
DelegatingFolder delegatingParent = DelegatingFileSystem.withDelegate(mockFolder1);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(delegatingParent, mockFolder2, null, null);
|
||||
Assert.assertEquals(delegatingParent, delegatingFolder.parent().get());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExists() {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder, null, null);
|
||||
|
||||
Mockito.when(mockFolder.exists()).thenReturn(true);
|
||||
Assert.assertTrue(delegatingFolder.exists());
|
||||
@@ -60,19 +60,19 @@ public class DelegatingFolderTest {
|
||||
Instant now = Instant.now();
|
||||
|
||||
Mockito.when(mockFolder.lastModified()).thenReturn(now);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder, null, null);
|
||||
Assert.assertEquals(now, delegatingFolder.lastModified());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChildren() {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = DelegatingFileSystem.withDelegate(mockFolder);
|
||||
|
||||
Folder subFolder1 = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingSubFolder1 = new DelegatingFolder(delegatingFolder, subFolder1);
|
||||
DelegatingFolder delegatingSubFolder1 = new DelegatingFolder(delegatingFolder, subFolder1, null, null);
|
||||
File subFile1 = Mockito.mock(File.class);
|
||||
DelegatingFile delegatingSubFile1 = new DelegatingFile(delegatingFolder, subFile1);
|
||||
DelegatingFile delegatingSubFile1 = new DelegatingFile(delegatingFolder, subFile1, null, null);
|
||||
|
||||
/* folders */
|
||||
Mockito.when(mockFolder.folder("subFolder1")).thenReturn(subFolder1);
|
||||
@@ -105,8 +105,8 @@ public class DelegatingFolderTest {
|
||||
public void testMoveTo() {
|
||||
Folder mockFolder1 = Mockito.mock(Folder.class);
|
||||
Folder mockFolder2 = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1);
|
||||
DelegatingFolder delegatingFolder2 = new DelegatingFolder(null, mockFolder2);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1, null, null);
|
||||
DelegatingFolder delegatingFolder2 = new DelegatingFolder(null, mockFolder2, null, null);
|
||||
|
||||
delegatingFolder1.moveTo(delegatingFolder2);
|
||||
Mockito.verify(mockFolder1).moveTo(mockFolder2);
|
||||
@@ -116,7 +116,7 @@ public class DelegatingFolderTest {
|
||||
public void testMoveToDestinationFromDifferentLayer() {
|
||||
Folder mockFolder1 = Mockito.mock(Folder.class);
|
||||
Folder mockFolder2 = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1, null, null);
|
||||
|
||||
delegatingFolder1.moveTo(mockFolder2);
|
||||
}
|
||||
@@ -125,8 +125,8 @@ public class DelegatingFolderTest {
|
||||
public void testCopyTo() {
|
||||
Folder mockFolder1 = Mockito.mock(Folder.class);
|
||||
Folder mockFolder2 = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1);
|
||||
DelegatingFolder delegatingFolder2 = new DelegatingFolder(null, mockFolder2);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1, null, null);
|
||||
DelegatingFolder delegatingFolder2 = new DelegatingFolder(null, mockFolder2, null, null);
|
||||
|
||||
delegatingFolder1.copyTo(delegatingFolder2);
|
||||
Mockito.verify(mockFolder1).copyTo(mockFolder2);
|
||||
@@ -136,7 +136,7 @@ public class DelegatingFolderTest {
|
||||
public void testCopyToDestinationFromDifferentLayer() {
|
||||
Folder mockFolder1 = Mockito.mock(Folder.class);
|
||||
Folder mockFolder2 = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1);
|
||||
DelegatingFolder delegatingFolder1 = new DelegatingFolder(null, mockFolder1, null, null);
|
||||
|
||||
delegatingFolder1.copyTo(mockFolder2);
|
||||
Mockito.verify(mockFolder1).copyTo(mockFolder2);
|
||||
@@ -145,7 +145,7 @@ public class DelegatingFolderTest {
|
||||
@Test
|
||||
public void testCreate() {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder, null, null);
|
||||
|
||||
delegatingFolder.create();
|
||||
Mockito.verify(mockFolder).create();
|
||||
@@ -154,7 +154,7 @@ public class DelegatingFolderTest {
|
||||
@Test
|
||||
public void testDelete() {
|
||||
Folder mockFolder = Mockito.mock(Folder.class);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder);
|
||||
DelegatingFolder delegatingFolder = new DelegatingFolder(null, mockFolder, null, null);
|
||||
|
||||
delegatingFolder.delete();
|
||||
Mockito.verify(mockFolder).delete();
|
||||
|
||||
Reference in New Issue
Block a user