diff --git a/source/java/org/alfresco/repo/webdav/LockInfo.java b/source/java/org/alfresco/repo/webdav/LockInfo.java new file mode 100644 index 0000000000..a465036194 --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/LockInfo.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.webdav; + +import java.util.Date; +import java.util.Set; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * Interface to represent WebDAV lock info. This interface mainly exists to allow + * decoupling of the LockStore classes from the rest of the WebDAV code base + * therefore allowing the LockStore related classes to live in the repository + * project without creating a dependency on the remote-api project. + * + * @author Matt Ward + */ +public interface LockInfo +{ + /** + * Retrieves the {@link ReentrantReadWriteLock} associated with this LockInfo. This is + * to allow client code to protect against invalid concurrent access to the state of + * this class. + *

+ * Not to be confused with WebDAV locks. + * + * @return + */ + ReentrantReadWriteLock getRWLock(); + + /** + * Returns true if node has shared or exclusive locks + * + * @return boolean + */ + boolean isLocked(); + + /** + * Setter for exclusive lock token + * + * @param token Lock token + */ + void setExclusiveLockToken(String token); + + /** + * Getter for exclusive lock token. + * + * @return String + */ + String getExclusiveLockToken(); + + /** + * Setter for lock scope. + * + * @param scope + */ + void setScope(String scope); + + /** + * Returns lock scope + * + * @return lock scope + */ + String getScope(); + + /** + * Setter for lock depth + * + * @param depth lock depth + */ + void setDepth(String depth); + + /** + * Returns lock depth + * + * @return lock depth + */ + String getDepth(); + + /** + * Getter for sharedLockTokens list. + * + * @return LinkedList + */ + Set getSharedLockTokens(); + + /** + * Setter for sharedLockTokens list. + * + * @param sharedLockTokens + */ + void setSharedLockTokens(Set sharedLockTokens); + + /** + * Adds new shared lock token to sharedLockTokens list. + * + * @param token The token to add. + */ + void addSharedLockToken(String token); + + /** + * Is it a shared lock? + * + * @return true if shared. + */ + boolean isShared(); + + /** + * Return the lock info as a string + * + * @return String + */ + String toString(); + + /** + * Whether this lock has expired. If no expiry is set (i.e. expires is null) + * then false is always returned. + * + * @return true if expired. + */ + boolean isExpired(); + + /** + * Is it an exclusive lock? + * + * @return true if exclusive. + */ + boolean isExclusive(); + + /** + * Who owns the lock? + * + * @return the owner + */ + String getOwner(); + + /** + * Set the username of who owns the lock. + * + * @param owner Owner's username + */ + void setOwner(String owner); + + /** + * Set the expiry date/time for this lock. Set to null for never expires. + * + * @param expires the expires to set + */ + void setExpires(Date expires); + + /** + * Retrieve the expiry date/time for this lock, or null if it never expires. + * + * @return the expires + */ + Date getExpires(); + + /** + * Sets the expiry date/time to lockTimeout seconds into the future. Provide + * a lockTimeout of WebDAV.TIMEOUT_INFINITY for never expires. + * + * @param lockTimeout + */ + void setTimeoutSeconds(int lockTimeout); +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/webdav/LockStore.java b/source/java/org/alfresco/repo/webdav/LockStore.java new file mode 100644 index 0000000000..2565c50ad1 --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/LockStore.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * Provides storage for WebDAV {@link LockInfo lock information}. + *

+ * Note: the existence of LockInfo does NOT mean that a node is necessarily locked. It may have timed-out, + * been unlocked, or be left in an invalid state for some reason. The LockInfo is a record of a requested lock - + * the actual values should be examined as necessary. + *

+ * Implementations of this interface should be fast, ideally an in-memory map. Implementations should also be thread- + * and cluster-safe. + * + * @author Matt Ward + */ +public interface LockStore +{ + /** + * Provide LockInfo about a specific node to the LockStore. + * + * @param nodeToLock + * @param lockInfo + */ + void put(NodeRef nodeToLock, LockInfo lockInfo); + + /** + * Retrieves LockInfo for as given nodeRef. The LockInfo may specify that a node is + * NOT locked, so the LockInfo should always be checked for validity. + *

+ * The presence of LockInfo does not imply that a node is locked. + * + * @param nodeRef + * @return + */ + LockInfo get(NodeRef nodeRef); + + + /** + * Remove LockInfo for the specified NodeRef. The LockInfo cannot be considered locked + * once removed from the LockStore. + * + * @param nodeRef + */ + void remove(NodeRef nodeRef); +} diff --git a/source/java/org/alfresco/repo/webdav/LockStoreFactory.java b/source/java/org/alfresco/repo/webdav/LockStoreFactory.java new file mode 100644 index 0000000000..207ede744e --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/LockStoreFactory.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + + +/** + * Factory to create {@link LockStore} instances. + * + * @author Matt Ward + */ +public interface LockStoreFactory +{ + LockStore getLockStore(); +} diff --git a/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java new file mode 100644 index 0000000000..59521b07d1 --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + +import java.util.concurrent.ConcurrentMap; + +import org.alfresco.service.cmr.repository.NodeRef; + +import com.hazelcast.core.HazelcastInstance; + + +/** + * Default implementation of the {@link LockStoreFactory} interface. Creates {@link LockStore}s + * backed by a Hazelcast distributed {@link java.util.Map Map}. + * + * @see LockStoreFactory + * @see LockStoreImpl + * @author Matt Ward + */ +public class LockStoreFactoryImpl implements LockStoreFactory +{ + private HazelcastInstance hazelcast; + + @Override + public LockStore getLockStore() + { + ConcurrentMap map = hazelcast.getMap("webdav-locks"); + return new LockStoreImpl(map); + } + + /** + * @param hazelcast the hazelcast to set + */ + public void setHazelcast(HazelcastInstance hazelcast) + { + this.hazelcast = hazelcast; + } +} diff --git a/source/java/org/alfresco/repo/webdav/LockStoreImpl.java b/source/java/org/alfresco/repo/webdav/LockStoreImpl.java new file mode 100644 index 0000000000..f21ee18f6d --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/LockStoreImpl.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + +import java.util.concurrent.ConcurrentMap; + +import org.alfresco.service.cmr.repository.NodeRef; + + +/** + * The default {@link LockStore} implementation. This is based upon a ConcurrentMap intended to be supplied by + * Hazelcast (or a similar, distributed data structure library). + * + * @see LockStore + * @author Matt Ward + */ +public class LockStoreImpl implements LockStore +{ + private final ConcurrentMap lockInfoMap; + + public LockStoreImpl(ConcurrentMap lockInfoMap) + { + this.lockInfoMap = lockInfoMap; + } + + @Override + public void put(NodeRef nodeToLock, LockInfo lockInfo) + { + lockInfoMap.put(nodeToLock, lockInfo); + } + + @Override + public LockInfo get(NodeRef nodeRef) + { + return lockInfoMap.get(nodeRef); + } + + @Override + public void remove(NodeRef nodeRef) + { + lockInfoMap.remove(nodeRef); + } +}