瀏覽代碼

determine file size of all files during directory listing [ci skip]

Sebastian Stenzel 9 年之前
父節點
當前提交
1d6f4284c8

+ 22 - 3
main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavFile.java

@@ -12,6 +12,7 @@ import java.io.IOException;
 import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 import java.time.Instant;
+import java.util.Optional;
 
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavResource;
@@ -22,6 +23,7 @@ import org.apache.jackrabbit.webdav.io.OutputContext;
 import org.apache.jackrabbit.webdav.lock.LockManager;
 import org.apache.jackrabbit.webdav.property.DavProperty;
 import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
 import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
 import org.cryptomator.filesystem.ReadableFile;
 import org.cryptomator.filesystem.WritableFile;
@@ -89,12 +91,29 @@ class DavFile extends DavNode<FileLocator> {
 
 	@Override
 	public DavProperty<?> getProperty(DavPropertyName name) {
-		if (DavPropertyName.GETCONTENTLENGTH.equals(name) && node.exists()) {
+		if (DavPropertyName.GETCONTENTLENGTH.equals(name)) {
+			return sizeProperty().get();
+		} else {
+			return super.getProperty(name);
+		}
+	}
+
+	@Override
+	public DavPropertySet getProperties() {
+		final DavPropertySet result = super.getProperties();
+		if (!result.contains(DavPropertyName.GETCONTENTLENGTH)) {
+			sizeProperty().ifPresent(result::add);
+		}
+		return result;
+	}
+
+	private Optional<DavProperty<?>> sizeProperty() {
+		if (node.exists()) {
 			try (ReadableFile src = node.openReadable()) {
-				return new DefaultDavProperty<Long>(DavPropertyName.GETCONTENTLENGTH, src.size());
+				return Optional.of(new DefaultDavProperty<Long>(DavPropertyName.GETCONTENTLENGTH, src.size()));
 			}
 		} else {
-			return super.getProperty(name);
+			return Optional.empty();
 		}
 	}