Author: reschke
Date: Tue Aug 25 13:32:42 2015
New Revision: 1697672
URL: http://svn.apache.org/r1697672
Log:
OAK-3261: consider existing locks when creating new ones
Modified:
jackrabbit/oak/trunk/oak-jcr/pom.xml
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1697672&r1=1697671&r2=1697672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Aug 25 13:32:42 2015
@@ -52,13 +52,10 @@
<!-- Locking : not fully implemented -->
org.apache.jackrabbit.test.api.lock.LockTest#testNodeLocked <!--
OAK-3260 -->
- org.apache.jackrabbit.test.api.lock.LockTest#testParentChildDeepLock
<!-- OAK-3261 -->
org.apache.jackrabbit.test.api.lock.LockTest#testAddRemoveLockToken <!--
OAK-2149 -->
org.apache.jackrabbit.test.api.lock.SetValueLockExceptionTest#testSetValueLockException
<!-- OAK-2149 -->
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testParentChildDeepLock
<!-- OAK-3261 -->
-
org.apache.jackrabbit.test.api.lock.DeepLockTest#testDeepLockAboveLockedChild
<!-- OAK-3261 -->
org.apache.jackrabbit.test.api.lock.DeepLockTest#testRemoveLockedChild
<!-- OAK-2149 -->
org.apache.jackrabbit.test.api.lock.LockManagerTest#testLockTransfer2
<!-- OAK-3262 -->
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java?rev=1697672&r1=1697671&r2=1697672&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
Tue Aug 25 13:32:42 2015
@@ -759,6 +759,21 @@ public class NodeDelegate extends ItemDe
&& (!deep || property.getValue(BOOLEAN));
}
+ @CheckForNull
+ private Tree findDescendantLock(@Nonnull Tree tree) {
+ for (Tree child : tree.getChildren()) {
+ if (holdsLock(child, false)) {
+ return child;
+ } else {
+ Tree desc = findDescendantLock(child);
+ if (desc != null) {
+ return desc;
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Checks whether this node holds a lock.
*
@@ -795,6 +810,20 @@ public class NodeDelegate extends ItemDe
throw new LockException("Node " + path + " is already locked");
}
+ // look for locked ancestor
+ Tree inheritedLock = findLock(tree, true);
+ if (inheritedLock != null) {
+ throw new LockException("Node already indirectly locked by " +
inheritedLock.getPath());
+ }
+
+ // scan for locked descendant
+ if (isDeep) {
+ Tree descendantLock = findDescendantLock(tree);
+ if (descendantLock != null) {
+ throw new LockException("Lock conflicts with lock hold by " +
descendantLock.getPath());
+ }
+ }
+
try {
String owner = sessionDelegate.getAuthInfo().getUserID();
if (owner == null) {