diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFile.java index a17107a87..7d1b68d63 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFile.java +++ b/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 DelegatingNodeimplements File { - public DelegatingFile(DelegatingFolder parent, File delegate) { + private final Function readableFileFactory; + private final Function writableFileFactory; + + public DelegatingFile(DelegatingFolder parent, File delegate, Function readableFileFactory, Function 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 diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFileSystem.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFileSystem.java index 37cd1a805..c03475dcc 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFileSystem.java +++ b/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 folderFactory, BiFunction 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); } } diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFolder.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFolder.java index da6a12aaa..ba9f7192f 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFolder.java +++ b/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 DelegatingNodeimplements Folder { - public DelegatingFolder(DelegatingFolder parent, Folder delegate) { + private final BiFunction folderFactory; + private final BiFunction fileFactory; + + public DelegatingFolder(DelegatingFolder parent, Folder delegate, BiFunction folderFactory, BiFunction fileFactory) { super(parent, delegate); + this.folderFactory = folderFactory; + this.fileFactory = fileFactory; } @Override @@ -41,7 +47,7 @@ public class DelegatingFolder extends DelegatingNodeimplements 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 DelegatingNodeimplements Folder { } private DelegatingFolder folder(Folder delegate) { - return new DelegatingFolder(this, delegate); + return folderFactory.apply(this, delegate); } @Override diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingNode.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingNode.java index 4d46b163c..affeb2f3d 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingNode.java +++ b/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 implements Node { +abstract class DelegatingNode 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 implements Node { } @Override - public String name() throws UncheckedIOException { - return delegate.name(); + public Optional parent() throws UncheckedIOException { + return Optional.ofNullable(parent); } @Override - public Optional parent() throws UncheckedIOException { - return Optional.ofNullable(parent); + public String name() throws UncheckedIOException { + return delegate.name(); } @Override diff --git a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java b/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java index b2b5d2d00..6b9297dd4 100644 --- a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java +++ b/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)); } diff --git a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFolderTest.java b/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFolderTest.java index 69bf5557c..f9412fa7f 100644 --- a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFolderTest.java +++ b/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();