Package com.ithit.webdav.server
Interface Lock
public interface Lock
Defines methods that WebDAV Class 2 compliant server hierarchy items must implement.
Classes that implement this interface represent WebDAV Class 2 hierarchy items. To create WebDAV Class 2 compliant server you must implement this interface on your file items and folder items.
-
Method Summary
Modifier and TypeMethodDescriptionGets the array of all locks for this item.Locks this item.refreshLock
(String token, long timeout) Updates lock timeout information on this item.void
Removes lock with the specified token from this item.
-
Method Details
-
getActiveLocks
Gets the array of all locks for this item.This method must return all locks for the item including deep locks on any of the parent folders. All fields of each
LockInfo
structure in the array must be set.- Returns:
- Array of locks.
- Throws:
ServerException
- In case of an error.
The code below is part of Collection Synchronization sample provided with the SDK.@Override public List<LockInfo> getActiveLocks() throws ServerException { if (activeLocks == null) { String activeLocksJson = ExtendedAttributesExtension.getExtendedAttribute(getFullPath().toString(), activeLocksAttribute); activeLocks = new ArrayList<>(SerializationUtils.deserializeList(LockInfo.class, activeLocksJson)); } else { activeLocks = new LinkedList<>(); } return activeLocks.stream() .filter(x -> System.currentTimeMillis() < x.getTimeout()) .map(lock -> new LockInfo( lock.isShared(), lock.isDeep(), lock.getToken(), (lock.getTimeout() < 0 || lock.getTimeout() == Long.MAX_VALUE) ? lock.getTimeout() : (lock.getTimeout() - System.currentTimeMillis()) / 1000, lock.getOwner())) .collect(Collectors.toList()); }
-
lock
LockResult lock(boolean shared, boolean deep, long timeout, String owner) throws LockedException, MultistatusException, ServerException Locks this item.In your
Lock
implementation you must generate lock token and createLockResult
class instance. You must also associate generated token with the hierarchy item in your repository during this call. The token is sent to the WebDAV client.- Parameters:
shared
- Indicates whether a lock is shared or exclusive.deep
- Indicates whether a lock is enforceable on the subtree.timeout
- Lock expiration time in seconds. Negative value means never.owner
- Provides information about the principal taking out a lock.- Returns:
- Actually applied lock (Server may modify timeout).
- Throws:
LockedException
- The item is locked, so the method has been rejected.MultistatusException
- Errors have occured during processing of the subtree.ServerException
- In case of an error
The code below is part of Collection Synchronization sample provided with the SDK.@Override public LockResult lock(boolean shared, boolean deep, long timeout, String owner) throws LockedException, MultistatusException, ServerException { if (hasLock(shared)) { throw new LockedException(); } String token = UUID.randomUUID().toString(); if (timeout < 0 || timeout == Long.MAX_VALUE) { // If timeout is absent or infinity timeout requested, // grant 5 minute lock. timeout = 300; } long expires = System.currentTimeMillis() + timeout * 1000; LockInfo lockInfo = new LockInfo(shared, deep, token, expires, owner); activeLocks.add(lockInfo); ExtendedAttributesExtension.setExtendedAttribute(getFullPath().toString(), activeLocksAttribute, SerializationUtils.serialize(activeLocks)); incrementMetadataEtag(); getEngine().getWebSocketServer().notifyLocked(getPath(), getWebSocketID()); return new LockResult(token, timeout); }
-
refreshLock
RefreshLockResult refreshLock(String token, long timeout) throws PreconditionFailedException, ServerException Updates lock timeout information on this item.- Parameters:
token
- The lock token associated with a lock.timeout
- Lock expiration time in seconds. Negative value means never.- Returns:
- Actually applied lock (Server may modify timeout).
- Throws:
PreconditionFailedException
- Included lock token was not enforceable on this item.ServerException
- In case of an error.
The code below is part of Collection Synchronization sample provided with the SDK.@Override public RefreshLockResult refreshLock(String token, long timeout) throws PreconditionFailedException, ServerException { getActiveLocks(); LockInfo lockInfo = activeLocks.stream().filter(x -> x.getToken().equals(token)).findFirst().orElse(null); if (lockInfo == null) { throw new PreconditionFailedException(); } if (timeout < 0 || timeout == Long.MAX_VALUE) { // If timeout is absent or infinity timeout requested, // grant 5 minute lock. timeout = 300; } long expires = System.currentTimeMillis() + timeout * 1000; lockInfo.setTimeout(expires); ExtendedAttributesExtension.setExtendedAttribute(getFullPath().toString(), activeLocksAttribute, SerializationUtils.serialize(activeLocks)); incrementMetadataEtag(); getEngine().getWebSocketServer().notifyLocked(getPath(), getWebSocketID()); return new RefreshLockResult(lockInfo.isShared(), lockInfo.isDeep(), timeout, lockInfo.getOwner()); }
-
unlock
Removes lock with the specified token from this item.If this lock included more than one hierarchy item, the lock is removed from all items included in the lock.
- Parameters:
lockToken
- Lock with this token should be removed from the item.- Throws:
PreconditionFailedException
- Included lock token was not enforceable on this item.ServerException
- In case of an error.
The code below is part of Collection Synchronization sample provided with the SDK.@Override public void unlock(String lockToken) throws PreconditionFailedException, ServerException { getActiveLocks(); LockInfo lock = activeLocks.stream().filter(x -> x.getToken().equals(lockToken)).findFirst().orElse(null); if (lock != null) { activeLocks.remove(lock); if (!activeLocks.isEmpty()) { ExtendedAttributesExtension.setExtendedAttribute(getFullPath().toString(), activeLocksAttribute, SerializationUtils.serialize(activeLocks)); } else { ExtendedAttributesExtension.deleteExtendedAttribute(getFullPath().toString(), activeLocksAttribute); } incrementMetadataEtag(); getEngine().getWebSocketServer().notifyUnlocked(getPath(), getWebSocketID()); } else { throw new PreconditionFailedException(); } }
-