support for RFC 4331: DAV:quota-available-bytes and DAV:quota-used-bytes

references #97; quota calculation in NIO filesystem still missing
This commit is contained in:
Sebastian Stenzel
2016-02-23 18:13:19 +01:00
parent 95b5f4c765
commit 7cb435e517
14 changed files with 158 additions and 15 deletions
@@ -9,10 +9,10 @@
package org.cryptomator.filesystem.jackrabbit;
import org.apache.jackrabbit.webdav.DavLocatorFactory;
import org.cryptomator.filesystem.FileSystem;
import org.cryptomator.filesystem.Folder;
import org.cryptomator.filesystem.delegating.DelegatingFileSystem;
class FileSystemLocator extends FolderLocator implements FileSystem {
class FileSystemLocator extends FolderLocator implements DelegatingFileSystem {
public FileSystemLocator(DavLocatorFactory factory, String prefix, Folder delegate) {
super(factory, prefix, null, delegate);
@@ -28,4 +28,9 @@ class FileSystemLocator extends FolderLocator implements FileSystem {
return "/";
}
@Override
public Folder getDelegate() {
return delegate;
}
}
@@ -17,6 +17,7 @@ import java.time.Instant;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavResourceIterator;
@@ -26,6 +27,7 @@ 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.DefaultDavProperty;
import org.apache.jackrabbit.webdav.property.ResourceType;
@@ -39,6 +41,9 @@ import com.google.common.io.ByteStreams;
class DavFolder extends DavNode<FolderLocator> {
private static final DavPropertyName PROPERTY_QUOTA_AVAILABLE = DavPropertyName.create("quota-available-bytes");
private static final DavPropertyName PROPERTY_QUOTA_USED = DavPropertyName.create("quota-used-bytes");
public DavFolder(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FolderLocator folder) {
super(factory, lockManager, session, folder);
properties.add(new ResourceType(ResourceType.COLLECTION));
@@ -173,7 +178,7 @@ class DavFolder extends DavNode<FolderLocator> {
@Override
protected void setModificationTime(Instant instant) {
// TODO Auto-generated method stub
node.setLastModified(instant);
}
@Override
@@ -181,4 +186,20 @@ class DavFolder extends DavNode<FolderLocator> {
node.setCreationTime(instant);
}
@Override
public DavPropertyName[] getPropertyNames() {
return ArrayUtils.addAll(super.getPropertyNames(), PROPERTY_QUOTA_AVAILABLE, PROPERTY_QUOTA_USED);
}
@Override
public DavProperty<?> getProperty(DavPropertyName name) {
if (PROPERTY_QUOTA_AVAILABLE.equals(name)) {
return node.fileSystem().quotaAvailableBytes().map(numBytes -> new DefaultDavProperty<Long>(name, numBytes)).orElse(null);
} else if (PROPERTY_QUOTA_USED.equals(name)) {
return node.fileSystem().quotaUsedBytes().map(numBytes -> new DefaultDavProperty<Long>(name, numBytes)).orElse(null);
} else {
return super.getProperty(name);
}
}
}
@@ -20,6 +20,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavSession;
@@ -40,8 +41,8 @@ import org.cryptomator.filesystem.jackrabbit.FileSystemResourceLocator;
abstract class DavNode<T extends FileSystemResourceLocator> implements DavResource {
private static final String DAV_COMPLIANCE_CLASSES = "1, 2";
private static final String[] DAV_CREATIONDATE_PROPNAMES = {DavPropertyName.CREATIONDATE.getName(), "Win32CreationTime"};
private static final String[] DAV_MODIFIEDDATE_PROPNAMES = {DavPropertyName.GETLASTMODIFIED.getName(), "Win32LastModifiedTime"};
private static final String[] DAV_CREATIONDATE_PROPNAMES = {DavConstants.PROPERTY_CREATIONDATE, "Win32CreationTime"};
private static final String[] DAV_MODIFIEDDATE_PROPNAMES = {DavConstants.PROPERTY_GETLASTMODIFIED, "Win32LastModifiedTime"};
protected final FilesystemResourceFactory factory;
protected final LockManager lockManager;