From fcf4476ae3868cc8473570af665f943ced5dd2c7 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sat, 9 Jan 2016 16:39:14 +0100 Subject: [PATCH] Added ReadableFile#size() --- .../java/org/cryptomator/filesystem/ReadableFile.java | 8 ++++++++ .../filesystem/delegating/DelegatingReadableFile.java | 5 +++++ .../filesystem/crypto/CryptoReadableFile.java | 6 ++++++ .../filesystem/crypto/CryptoWritableFile.java | 1 + .../filesystem/inmem/InMemoryReadableFile.java | 5 +++++ .../filesystem/inmem/InMemoryFileSystemTest.java | 5 +++++ .../cryptomator/filesystem/nio/ReadableNioFile.java | 7 ++++++- .../filesystem/nio/ReadableNioFileTest.java | 10 ++++++++++ .../cryptomator/webdav/jackrabbitservlet/DavFile.java | 7 ++++--- .../webdav/jackrabbitservlet/DavFolder.java | 5 +++-- 10 files changed, 53 insertions(+), 6 deletions(-) diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java index a7e64cadb..634ede5d6 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java +++ b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/ReadableFile.java @@ -29,8 +29,16 @@ public interface ReadableFile extends ReadableByteChannel { * if an {@link IOException} occurs while reading from this * {@code ReadableBytes} */ + @Override int read(ByteBuffer target) throws UncheckedIOException; + /** + * @return The current size of the file. This value is a snapshot and might have been changed by concurrent modifications. + * @throws UncheckedIOException + * if an {@link IOException} occurs + */ + long size() throws UncheckedIOException; + /** *

* Fast-forwards or rewinds the file to the specified position. diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java index b41382433..68a41234e 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java +++ b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingReadableFile.java @@ -42,6 +42,11 @@ public class DelegatingReadableFile implements ReadableFile { return delegate.read(target); } + @Override + public long size() throws UncheckedIOException { + return delegate.size(); + } + @Override public void position(long position) throws UncheckedIOException { delegate.position(position); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java index 82d72be56..f7f72e1b7 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoReadableFile.java @@ -61,6 +61,12 @@ class CryptoReadableFile implements ReadableFile { } } + @Override + public long size() throws UncheckedIOException { + assert decryptor != null : "decryptor is always being set during position(long)"; + return decryptor.contentLength(); + } + @Override public void position(long position) throws UncheckedIOException { if (readAheadTask != null) { diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java index 443bd6737..c71eba542 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java @@ -109,6 +109,7 @@ class CryptoWritableFile implements WritableFile { encryptor.append(FileContentCryptor.EOF); writeTask.get(); writeHeader(); + // TODO append padding } catch (ExecutionException e) { if (e.getCause() instanceof UncheckedIOException) { throw (UncheckedIOException) e.getCause(); diff --git a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java index ff69ddfea..19dc10040 100644 --- a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java +++ b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryReadableFile.java @@ -55,6 +55,11 @@ class InMemoryReadableFile implements ReadableFile { } } + @Override + public long size() throws UncheckedIOException { + return contentGetter.get().limit(); + } + @Override public void position(long position) throws UncheckedIOException { assert position < Integer.MAX_VALUE : "Can not use that big in-memory files."; diff --git a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java b/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java index 0225601fc..9c20c9709 100644 --- a/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java +++ b/main/filesystem-inmemory/src/test/java/org/cryptomator/filesystem/inmem/InMemoryFileSystemTest.java @@ -103,6 +103,11 @@ public class InMemoryFileSystemTest { } Assert.assertTrue(fooFile.exists()); + // check if size = 11 bytes + try (ReadableFile readable = fooFile.openReadable()) { + Assert.assertEquals(11, readable.size()); + } + // copy foo to bar File barFile = fs.file("bar.txt"); try (WritableFile writable = barFile.openWritable()) { diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java index 6b107360c..c98b2222e 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java +++ b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/ReadableNioFile.java @@ -45,6 +45,11 @@ class ReadableNioFile implements ReadableFile { return open; } + @Override + public long size() throws UncheckedIOException { + return channel.size(); + } + @Override public void position(long position) throws UncheckedIOException { assertOpen(); @@ -73,7 +78,7 @@ class ReadableNioFile implements ReadableFile { target.ensureChannelIsOpened(); SharedFileChannel targetChannel = target.channel(); targetChannel.truncate(0); - long size = channel.size(); + long size = size(); long transferred = 0; while (transferred < size) { transferred += channel.transferTo(transferred, size - transferred, targetChannel, transferred); diff --git a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java index d83acee82..3ca8d26a0 100644 --- a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java +++ b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/ReadableNioFileTest.java @@ -88,6 +88,16 @@ public class ReadableNioFileTest { inTest.position(-1); } + @Test + public void testSizeReturnsSizeOfChannel() { + long expectedSize = 85472; + when(channel.size()).thenReturn(expectedSize); + + long actualSize = inTest.size(); + + assertThat(actualSize, is(expectedSize)); + } + @Test public void testReadDelegatesToChannelReadFullyWithZeroPositionIfNotSet() { ByteBuffer buffer = mock(ByteBuffer.class); diff --git a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java index 40facff16..8f21c51b6 100644 --- a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java +++ b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java @@ -28,6 +28,8 @@ import org.cryptomator.filesystem.jackrabbit.FileLocator; class DavFile extends DavNode { + private static final int BUFFER_SIZE = 32 * 1024; + public DavFile(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FileLocator node) { super(factory, lockManager, session, node); } @@ -44,9 +46,8 @@ class DavFile extends DavNode { return; } try (ReadableFile src = node.openReadable(); WritableByteChannel dst = Channels.newChannel(outputContext.getOutputStream())) { - // TODO filesize before sending content - outputContext.setContentLength(-1l); - ByteBuffer buf = ByteBuffer.allocate(1337); + outputContext.setContentLength(src.size()); + ByteBuffer buf = ByteBuffer.allocate(BUFFER_SIZE); do { buf.clear(); src.read(buf); diff --git a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFolder.java b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFolder.java index 54c819bd5..7d204613e 100644 --- a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFolder.java +++ b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFolder.java @@ -40,6 +40,8 @@ import org.cryptomator.filesystem.jackrabbit.FolderLocator; class DavFolder extends DavNode { + private static final int BUFFER_SIZE = 32 * 1024; + public DavFolder(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FolderLocator folder) { super(factory, lockManager, session, folder); properties.add(new ResourceType(ResourceType.COLLECTION)); @@ -73,7 +75,7 @@ class DavFolder extends DavNode { private void addMemberFile(DavFile memberFile, InputStream inputStream) { try (ReadableByteChannel src = Channels.newChannel(inputStream); WritableFile dst = node.file(memberFile.getDisplayName()).openWritable()) { - ByteBuffer buf = ByteBuffer.allocate(1337); + ByteBuffer buf = ByteBuffer.allocate(BUFFER_SIZE); while (src.read(buf) != -1) { buf.flip(); dst.write(buf); @@ -150,7 +152,6 @@ class DavFolder extends DavNode { @Override protected void setModificationTime(Instant instant) { // TODO Auto-generated method stub - } @Override