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 8f21c51b6..ebd693d61 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 @@ -9,6 +9,7 @@ package org.cryptomator.webdav.jackrabbitservlet; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; @@ -21,6 +22,10 @@ import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.io.InputContext; 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.FileSystemFeature; import org.cryptomator.filesystem.ReadableFile; import org.cryptomator.filesystem.WritableFile; @@ -91,6 +96,30 @@ class DavFile extends DavNode { } } + @Override + public DavProperty getProperty(DavPropertyName name) { + if (DavPropertyName.GETCONTENTLENGTH.equals(name) && node.exists()) { + try (ReadableFile src = node.openReadable()) { + return new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, src.size()); + } + } else { + return super.getProperty(name); + } + } + + @Override + public DavPropertySet getProperties() { + final DavPropertySet result = super.getProperties(); + if (node.exists()) { + try (ReadableFile src = node.openReadable()) { + result.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, src.size())); + } catch (UncheckedIOException e) { + result.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, -1l)); + } + } + return result; + } + @Override protected void setModificationTime(Instant instant) { try (WritableFile writable = node.openWritable()) { diff --git a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java index 152358394..fad32ed7e 100644 --- a/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java +++ b/main/jackrabbit-filesystem-adapter/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java @@ -10,7 +10,10 @@ package org.cryptomator.webdav.jackrabbitservlet; import java.io.UncheckedIOException; import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.time.temporal.Temporal; import java.util.Arrays; import java.util.List; @@ -111,17 +114,39 @@ abstract class DavNode implements DavResour final String namespacelessPropertyName = name.getName(); if (Arrays.asList(DAV_CREATIONDATE_PROPNAMES).contains(namespacelessPropertyName)) { if (node.fileSystem().supports(FileSystemFeature.CREATION_TIME_FEATURE)) { - return new DefaultDavProperty<>(name, DateTimeFormatter.RFC_1123_DATE_TIME.format(node.creationTime())); + Temporal creationDate = OffsetDateTime.ofInstant(node.creationTime(), ZoneId.systemDefault()); + return new DefaultDavProperty<>(name, DateTimeFormatter.RFC_1123_DATE_TIME.format(creationDate)); } else { return null; } + } else if (Arrays.asList(DAV_MODIFIEDDATE_PROPNAMES).contains(namespacelessPropertyName)) { + Temporal lastModifiedDate = OffsetDateTime.ofInstant(node.lastModified(), ZoneId.systemDefault()); + return new DefaultDavProperty<>(name, DateTimeFormatter.RFC_1123_DATE_TIME.format(lastModifiedDate)); } else { - return getProperties().get(name); + return properties.get(name); } } + /** + * Returns a current snapshot of all available properties. + */ @Override public DavPropertySet getProperties() { + // creation date: + if (node.exists() && node.fileSystem().supports(FileSystemFeature.CREATION_TIME_FEATURE)) { + Temporal creationDate = OffsetDateTime.ofInstant(node.creationTime(), ZoneId.systemDefault()); + String createionDateStr = DateTimeFormatter.RFC_1123_DATE_TIME.format(creationDate); + DavProperty creationDateProp = new DefaultDavProperty<>(DavPropertyName.CREATIONDATE, createionDateStr); + properties.add(creationDateProp); + } + // modification date: + if (node.exists()) { + Temporal lastModifiedDate = OffsetDateTime.ofInstant(node.lastModified(), ZoneId.systemDefault()); + String lastModifiedDateStr = DateTimeFormatter.RFC_1123_DATE_TIME.format(lastModifiedDate); + System.err.println(lastModifiedDateStr); + DavProperty lastModifiedDateProp = new DefaultDavProperty<>(DavPropertyName.GETLASTMODIFIED, lastModifiedDateStr); + properties.add(lastModifiedDateProp); + } return properties; } @@ -129,17 +154,15 @@ abstract class DavNode implements DavResour public void setProperty(DavProperty property) throws DavException { final String namespacelessPropertyName = property.getName().getName(); if (Arrays.asList(DAV_CREATIONDATE_PROPNAMES).contains(namespacelessPropertyName) && property.getValue() instanceof String) { - final String createDateStr = (String) property.getValue(); - final Instant createTime = Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(createDateStr)); - this.setCreationTime(createTime); + String createDateStr = (String) property.getValue(); + OffsetDateTime creationDate = OffsetDateTime.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(createDateStr)); + this.setCreationTime(creationDate.toInstant()); } else if (Arrays.asList(DAV_MODIFIEDDATE_PROPNAMES).contains(namespacelessPropertyName) && property.getValue() instanceof String) { - final String lastModifiedTimeStr = (String) property.getValue(); - final Instant modificationTime = Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(lastModifiedTimeStr)); - this.setModificationTime(modificationTime); - getProperties().add(property); - } else { - getProperties().add(property); + String lastModifiedDateStr = (String) property.getValue(); + OffsetDateTime lastModifiedDate = OffsetDateTime.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(lastModifiedDateStr)); + this.setModificationTime(lastModifiedDate.toInstant()); } + properties.add(property); } @Override