DelegatingFileSystem: Use factories for Files, Folders, ReadableFiles and WritableFiles

This commit is contained in:
Sebastian Stenzel
2015-12-29 11:46:37 +01:00
parent c466c7e3ba
commit c21654eac1
6 changed files with 74 additions and 45 deletions

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

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