From e90880ac9a6dff376146e53b85b35885c4fdb24b Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 24 Aug 2016 17:27:36 +0200 Subject: [PATCH] speedboost 3000 --- .../java/org/cryptomator/filesystem/File.java | 8 ++++++- .../cryptomator/filesystem/ReadableFile.java | 7 ------ .../filesystem/delegating/DelegatingFile.java | 7 +++++- .../delegating/DelegatingReadableFile.java | 5 ----- .../delegating/DelegatingFileTest.java | 10 +++++++++ .../DelegatingReadableFileTest.java | 11 ---------- .../CryptoFileSystemIntegrationTest.java | 2 +- .../crypto/BlockAlignedReadableFile.java | 5 ----- .../filesystem/crypto/ConflictResolver.java | 8 +++---- .../filesystem/crypto/CryptoFile.java | 22 +++++++++++++++++++ .../filesystem/crypto/CryptoReadableFile.java | 17 -------------- .../impl/FileContentCryptorImplTest.java | 14 ------------ .../impl/FileContentEncryptorImplTest.java | 14 ------------ .../filesystem/inmem/InMemoryFile.java | 9 ++++++-- .../inmem/InMemoryReadableFile.java | 5 ----- .../inmem/InMemoryFileSystemTest.java | 4 +--- .../filesystem/nio/DefaultNioAccess.java | 8 ++++++- .../cryptomator/filesystem/nio/NioAccess.java | 2 ++ .../cryptomator/filesystem/nio/NioFile.java | 9 ++++++++ .../filesystem/nio/ReadableNioFile.java | 5 ----- .../filesystem/nio/NioFileTest.java | 22 +++++++++++++++++++ .../filesystem/nio/ReadableNioFileTest.java | 10 --------- .../webdav/jackrabbitservlet/DavFile.java | 12 ++-------- .../jackrabbitservlet/DavFileWithRange.java | 2 +- .../DavFileWithUnsatisfiableRange.java | 6 ++--- 25 files changed, 104 insertions(+), 120 deletions(-) diff --git a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/File.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/File.java index ddcefd11a..e973c7255 100644 --- a/main/filesystem-api/src/main/java/org/cryptomator/filesystem/File.java +++ b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/File.java @@ -17,6 +17,13 @@ public interface File extends Node, Comparable { static final int EOF = -1; + /** + * @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; + /** *

* Opens this file for reading. @@ -39,7 +46,6 @@ public interface File extends Node, Comparable { * if an {@link IOException} occurs while opening the file, the * file does not exist or is a directory */ - ReadableFile openReadable() throws UncheckedIOException; /** 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 398d87e72..300ad32ec 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 @@ -30,13 +30,6 @@ public interface ReadableFile extends ReadableByteChannel { @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/DelegatingFile.java b/main/filesystem-api/src/main/java/org/cryptomator/filesystem/delegating/DelegatingFile.java index 49bc9eb6d..af119c90c 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 @@ -15,7 +15,7 @@ import org.cryptomator.filesystem.File; import org.cryptomator.filesystem.ReadableFile; import org.cryptomator.filesystem.WritableFile; -public abstract class DelegatingFile> extends DelegatingNodeimplements File { +public abstract class DelegatingFile> extends DelegatingNode implements File { private final D parent; @@ -29,6 +29,11 @@ public abstract class DelegatingFile> extends D return Optional.of(parent); } + @Override + public long size() throws UncheckedIOException { + return delegate.size(); + } + @Override public ReadableFile openReadable() throws UncheckedIOException { return delegate.openReadable(); 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 435601782..d9a022d06 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 @@ -31,11 +31,6 @@ 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-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java b/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingFileTest.java index 2e20b1de4..36365d3e2 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 @@ -30,6 +30,16 @@ public class DelegatingFileTest { Assert.assertEquals(mockFile.name(), delegatingFile.name()); } + @Test + public void testSize() { + File mockFile = Mockito.mock(File.class); + DelegatingFile delegatingFile = new TestDelegatingFile(null, mockFile); + + Mockito.when(mockFile.size()).thenReturn(42l); + Assert.assertEquals(42l, delegatingFile.size()); + Mockito.verify(mockFile).size(); + } + @Test public void testParent() { Folder mockFolder = Mockito.mock(Folder.class); diff --git a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingReadableFileTest.java b/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingReadableFileTest.java index 0777bd5da..cd3fb106a 100644 --- a/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingReadableFileTest.java +++ b/main/filesystem-api/src/test/java/org/cryptomator/filesystem/delegating/DelegatingReadableFileTest.java @@ -42,17 +42,6 @@ public class DelegatingReadableFileTest { Mockito.verify(mockReadableFile).read(buf); } - @Test - public void testSize() { - ReadableFile mockReadableFile = Mockito.mock(ReadableFile.class); - @SuppressWarnings("resource") - DelegatingReadableFile delegatingReadableFile = new DelegatingReadableFile(mockReadableFile); - - Mockito.when(mockReadableFile.size()).thenReturn(42l); - Assert.assertEquals(42l, delegatingReadableFile.size()); - Mockito.verify(mockReadableFile).size(); - } - @Test public void testPosition() { ReadableFile mockReadableFile = Mockito.mock(ReadableFile.class); diff --git a/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java b/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java index de1f2a6d1..9d8b26869 100644 --- a/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java +++ b/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java @@ -130,7 +130,7 @@ public class CryptoFileSystemIntegrationTest { // toggle last bit try (WritableFile writable = physicalFile.openWritable(); ReadableFile readable = physicalFile.openReadable()) { - ByteBuffer buf = ByteBuffer.allocate((int) readable.size()); + ByteBuffer buf = ByteBuffer.allocate((int) physicalFile.size()); readable.read(buf); buf.array()[buf.limit() - 1] ^= 0x01; buf.flip(); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/BlockAlignedReadableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/BlockAlignedReadableFile.java index 34e37e925..4ae1c0a10 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/BlockAlignedReadableFile.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/BlockAlignedReadableFile.java @@ -100,11 +100,6 @@ class BlockAlignedReadableFile implements ReadableFile { return delegate.isOpen(); } - @Override - public long size() throws UncheckedIOException { - return delegate.size(); - } - @Override public void close() throws UncheckedIOException { delegate.close(); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/ConflictResolver.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/ConflictResolver.java index 138ec226f..a15c0a6fe 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/ConflictResolver.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/ConflictResolver.java @@ -79,10 +79,10 @@ final class ConflictResolver { } private boolean isSameFileBasedOnSample(File file1, File file2, int sampleSize) { - try (ReadableFile r1 = file1.openReadable(); ReadableFile r2 = file2.openReadable()) { - if (r1.size() != r2.size()) { - return false; - } else { + if (file1.size() != file2.size()) { + return false; + } else { + try (ReadableFile r1 = file1.openReadable(); ReadableFile r2 = file2.openReadable()) { ByteBuffer beginOfFile1 = ByteBuffer.allocate(sampleSize); ByteBuffer beginOfFile2 = ByteBuffer.allocate(sampleSize); int bytesRead1 = r1.read(beginOfFile1); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFile.java index ff0df04e7..9d2afa238 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFile.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFile.java @@ -8,6 +8,9 @@ *******************************************************************************/ package org.cryptomator.filesystem.crypto; +import static org.cryptomator.crypto.engine.impl.Constants.CHUNK_SIZE; +import static org.cryptomator.crypto.engine.impl.Constants.PAYLOAD_SIZE; + import java.io.UncheckedIOException; import java.nio.file.FileAlreadyExistsException; import java.util.Optional; @@ -28,6 +31,25 @@ class CryptoFile extends CryptoNode implements File { return parent().get().encryptChildName(name()); } + @Override + public long size() throws UncheckedIOException { + if (!physicalFile().isPresent()) { + return -1l; + } else { + File file = physicalFile().get(); + long ciphertextSize = file.size() - cryptor.getFileContentCryptor().getHeaderSize(); + long overheadPerChunk = CHUNK_SIZE - PAYLOAD_SIZE; + long numFullChunks = ciphertextSize / CHUNK_SIZE; // floor by int-truncation + long additionalCiphertextBytes = ciphertextSize % CHUNK_SIZE; + if (additionalCiphertextBytes > 0 && additionalCiphertextBytes <= overheadPerChunk) { + throw new IllegalArgumentException("Method not defined for input value " + ciphertextSize); + } + long additionalCleartextBytes = (additionalCiphertextBytes == 0) ? 0 : additionalCiphertextBytes - overheadPerChunk; + assert additionalCleartextBytes >= 0; + return PAYLOAD_SIZE * numFullChunks + additionalCleartextBytes; + } + } + @Override public ReadableFile openReadable() { boolean authenticate = !fileSystem().delegate().shouldSkipAuthentication(toString()); 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 ad0dd3e08..9792643f2 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 @@ -8,9 +8,6 @@ *******************************************************************************/ package org.cryptomator.filesystem.crypto; -import static org.cryptomator.crypto.engine.impl.Constants.CHUNK_SIZE; -import static org.cryptomator.crypto.engine.impl.Constants.PAYLOAD_SIZE; - import java.io.IOException; import java.io.InterruptedIOException; import java.io.UncheckedIOException; @@ -73,20 +70,6 @@ class CryptoReadableFile implements ReadableFile { } } - @Override - public long size() throws UncheckedIOException { - long ciphertextSize = file.size() - cryptor.getHeaderSize(); - long overheadPerChunk = CHUNK_SIZE - PAYLOAD_SIZE; - long numFullChunks = ciphertextSize / CHUNK_SIZE; // floor by int-truncation - long additionalCiphertextBytes = ciphertextSize % CHUNK_SIZE; - if (additionalCiphertextBytes > 0 && additionalCiphertextBytes <= overheadPerChunk) { - throw new IllegalArgumentException("Method not defined for input value " + ciphertextSize); - } - long additionalCleartextBytes = (additionalCiphertextBytes == 0) ? 0 : additionalCiphertextBytes - overheadPerChunk; - assert additionalCleartextBytes >= 0; - return PAYLOAD_SIZE * numFullChunks + additionalCleartextBytes; - } - @Override public void position(long position) throws UncheckedIOException { if (readAheadTask != null) { diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorImplTest.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorImplTest.java index e1cdee671..6fa92c74b 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorImplTest.java +++ b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorImplTest.java @@ -43,20 +43,6 @@ public class FileContentCryptorImplTest { }; - private static final SecureRandom RANDOM_MOCK_2 = new SecureRandom() { - - @Override - public int nextInt(int bound) { - return 500; - } - - @Override - public void nextBytes(byte[] bytes) { - Arrays.fill(bytes, (byte) 0x00); - } - - }; - @Test(expected = IllegalArgumentException.class) public void testShortHeaderInDecryptor() throws InterruptedException { final byte[] keyBytes = new byte[32]; diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentEncryptorImplTest.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentEncryptorImplTest.java index f9503d6d8..7c36c28e4 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentEncryptorImplTest.java +++ b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentEncryptorImplTest.java @@ -35,20 +35,6 @@ public class FileContentEncryptorImplTest { }; - private static final SecureRandom RANDOM_MOCK_2 = new SecureRandom() { - - @Override - public int nextInt(int bound) { - return 42; - } - - @Override - public void nextBytes(byte[] bytes) { - Arrays.fill(bytes, (byte) 0x00); - } - - }; - @Test public void testEncryption() throws InterruptedException { final byte[] keyBytes = new byte[32]; diff --git a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java index 568f431d1..781b079b1 100644 --- a/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java +++ b/main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java @@ -43,6 +43,11 @@ class InMemoryFile extends InMemoryNode implements File { return buf; } + @Override + public long size() throws UncheckedIOException { + return content.get().limit(); + } + @Override public void moveTo(File destination) throws UncheckedIOException { if (destination instanceof InMemoryFile) { @@ -103,7 +108,7 @@ class InMemoryFile extends InMemoryNode implements File { throw new UncheckedIOException(new FileAlreadyExistsException(k)); } else { if (v == null) { - assert!content.get().hasRemaining(); + assert !content.get().hasRemaining(); this.creationTime = Instant.now(); } this.lastModified = Instant.now(); @@ -120,7 +125,7 @@ class InMemoryFile extends InMemoryNode implements File { // returning null removes the entry. return null; }); - assert!this.exists(); + assert !this.exists(); } @Override 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 90eab31f3..8d2212596 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 @@ -51,11 +51,6 @@ 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 7b913b0ba..d262e2513 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 @@ -104,9 +104,7 @@ public class InMemoryFileSystemTest { Assert.assertTrue(fooFile.exists()); // check if size = 11 bytes - try (ReadableFile readable = fooFile.openReadable()) { - Assert.assertEquals(11, readable.size()); - } + Assert.assertEquals(11, fooFile.size()); // copy foo to bar File barFile = fs.file("bar.txt"); diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/DefaultNioAccess.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/DefaultNioAccess.java index 2196b7a3e..5def2b008 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/DefaultNioAccess.java +++ b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/DefaultNioAccess.java @@ -17,6 +17,11 @@ import java.util.stream.Stream; class DefaultNioAccess implements NioAccess { + @Override + public long size(Path path) throws IOException { + return Files.size(path); + } + @Override public AsynchronousFileChannel open(Path path, OpenOption... options) throws IOException { return AsynchronousFileChannel.open(path, options); @@ -59,7 +64,8 @@ class DefaultNioAccess implements NioAccess { } catch (AccessDeniedException e) { // workaround for https://github.com/cryptomator/cryptomator/issues/317 try { - if (path.toFile().delete()) return; + if (path.toFile().delete()) + return; } catch (UnsupportedOperationException e2) { // ignore } diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioAccess.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioAccess.java index cb75026f4..f19c46a18 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioAccess.java +++ b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioAccess.java @@ -16,6 +16,8 @@ interface NioAccess { public static final Holder DEFAULT = new Holder<>(new DefaultNioAccess()); + long size(Path path) throws IOException; + AsynchronousFileChannel open(Path path, OpenOption... options) throws IOException; boolean isRegularFile(Path path, LinkOption... options); diff --git a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFile.java b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFile.java index e1afc2718..a82e0d289 100644 --- a/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFile.java +++ b/main/filesystem-nio/src/main/java/org/cryptomator/filesystem/nio/NioFile.java @@ -27,6 +27,15 @@ class NioFile extends NioNode implements File { sharedChannel = instanceFactory.sharedFileChannel(path, nioAccess); } + @Override + public long size() throws UncheckedIOException { + try { + return nioAccess.size(path); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + @Override public ReadableFile openReadable() throws UncheckedIOException { if (lock.getWriteHoldCount() > 0) { 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 ef6621eb1..b7bff19e9 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 @@ -41,11 +41,6 @@ class ReadableNioFile implements ReadableFile { return open; } - @Override - public long size() throws UncheckedIOException { - return channel.size(); - } - @Override public void position(long position) throws UncheckedIOException { assertOpen(); diff --git a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFileTest.java b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFileTest.java index ec4269fc9..05dbe75e7 100644 --- a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFileTest.java +++ b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/NioFileTest.java @@ -16,6 +16,7 @@ import static org.mockito.Mockito.when; import java.io.IOException; import java.io.UncheckedIOException; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.attribute.FileTime; import java.time.Instant; @@ -85,6 +86,27 @@ public class NioFileTest { } + public class Size { + + @Test + public void testSizeReturnsSizeOfRegularFile() throws IOException { + when(nioAccess.size(path)).thenReturn(42l); + + assertThat(inTest.size(), is(42l)); + } + + @Test + public void testSizeThrowsExceptionIfRegularFileThrowsException() throws IOException { + Throwable t = new NoSuchFileException("foo"); + when(nioAccess.size(path)).thenThrow(t); + + thrown.expect(UncheckedIOException.class); + thrown.expectCause(org.hamcrest.Matchers.sameInstance(t)); + inTest.size(); + } + + } + public class Open { @Test 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 4ff589f43..f398aa2c5 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 @@ -83,16 +83,6 @@ 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/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFile.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFile.java index bdde344b6..9c5d0ee8f 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFile.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFile.java @@ -32,14 +32,11 @@ import org.cryptomator.filesystem.File; import org.cryptomator.filesystem.Folder; import org.cryptomator.filesystem.ReadableFile; import org.cryptomator.filesystem.jackrabbit.FileLocator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.io.ByteStreams; class DavFile extends DavNode { - private static final Logger LOG = LoggerFactory.getLogger(DavFile.class); protected static final String CONTENT_TYPE_VALUE = "application/octet-stream"; protected static final String CONTENT_DISPOSITION_HEADER = "Content-Disposition"; protected static final String CONTENT_DISPOSITION_VALUE = "attachment"; @@ -64,8 +61,8 @@ class DavFile extends DavNode { outputContext.setContentType(CONTENT_TYPE_VALUE); outputContext.setProperty(CONTENT_DISPOSITION_HEADER, CONTENT_DISPOSITION_VALUE); outputContext.setProperty(X_CONTENT_TYPE_OPTIONS_HEADER, X_CONTENT_TYPE_OPTIONS_VALUE); + outputContext.setContentLength(node.size()); try (ReadableFile src = node.openReadable(); WritableByteChannel dst = Channels.newChannel(outputContext.getOutputStream())) { - outputContext.setContentLength(src.size()); ByteStreams.copy(src, dst); } } @@ -157,12 +154,7 @@ class DavFile extends DavNode { private Optional> sizeProperty() { if (node.exists()) { - try (ReadableFile src = node.openReadable()) { - return Optional.of(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, src.size())); - } catch (RuntimeException e) { - LOG.warn("Could not determine file size of " + getResourcePath(), e); - return Optional.empty(); - } + return Optional.of(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, node.size())); } else { return Optional.empty(); } diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java index 96a0bb547..8151b96c3 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java @@ -47,8 +47,8 @@ class DavFileWithRange extends DavFile { if (!outputContext.hasStream()) { return; } + final long contentLength = node.size(); try (ReadableFile src = node.openReadable(); OutputStream out = outputContext.getOutputStream()) { - final long contentLength = src.size(); final Pair range = getEffectiveRange(contentLength); if (range.getLeft() < 0 || range.getLeft() > range.getRight() || range.getRight() > contentLength) { outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java index b612d1aac..1b820f90e 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java @@ -39,10 +39,10 @@ class DavFileWithUnsatisfiableRange extends DavFile { if (!outputContext.hasStream()) { return; } + final long contentLength = node.size(); + outputContext.setContentLength(contentLength); + outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); try (ReadableFile src = node.openReadable(); OutputStream out = outputContext.getOutputStream()) { - final long contentLength = src.size(); - outputContext.setContentLength(contentLength); - outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); ByteStreams.copy(src, Channels.newChannel(out)); } }