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