You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2015/08/25 15:32:42 UTC

svn commit: r1697672 - in /jackrabbit/oak/trunk/oak-jcr: pom.xml src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java

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) {