浏览代码

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

Sebastian Stenzel 9 年之前
父节点
当前提交
c21654eac1

+ 11 - 3
main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFile.java

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

+ 17 - 2
main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFileSystem.java

@@ -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 - 3
main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFolder.java

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

+ 6 - 6
main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingNode.java

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

+ 15 - 15
main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java

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

+ 16 - 16
main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFolderTest.java

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