mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-21 20:21:27 +00:00
support for webdav properties:
- getcontentlength - getlastmodified - creationdate (why isn't this one called "get"?)
This commit is contained in:
@@ -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<FileLocator> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DavProperty<?> getProperty(DavPropertyName name) {
|
||||
if (DavPropertyName.GETCONTENTLENGTH.equals(name) && node.exists()) {
|
||||
try (ReadableFile src = node.openReadable()) {
|
||||
return new DefaultDavProperty<Long>(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<Long>(DavPropertyName.GETCONTENTLENGTH, src.size()));
|
||||
} catch (UncheckedIOException e) {
|
||||
result.add(new DefaultDavProperty<Long>(DavPropertyName.GETCONTENTLENGTH, -1l));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setModificationTime(Instant instant) {
|
||||
try (WritableFile writable = node.openWritable()) {
|
||||
|
||||
@@ -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<T extends FileSystemResourceLocator> 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<String> 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<String> lastModifiedDateProp = new DefaultDavProperty<>(DavPropertyName.GETLASTMODIFIED, lastModifiedDateStr);
|
||||
properties.add(lastModifiedDateProp);
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
@@ -129,17 +154,15 @@ abstract class DavNode<T extends FileSystemResourceLocator> 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
|
||||
|
||||
Reference in New Issue
Block a user