### Eclipse Workspace Patch 1.0 #P jackrabbit-core Index: src/test/java/org/apache/jackrabbit/core/XATest.java =================================================================== --- src/test/java/org/apache/jackrabbit/core/XATest.java (revision 820925) +++ src/test/java/org/apache/jackrabbit/core/XATest.java (working copy) @@ -828,7 +828,79 @@ other.logout(); } } + + /** + * Test locking and unlocking behavior in transaction + * @throws Exception + */ + public void testCreateLockUnlockInDifferentTransactions() throws Exception { + // create new node and lock it + UserTransaction utx = new UserTransactionImpl(superuser); + utx.begin(); + // add node that is both lockable and referenceable, save + Node rootNode = superuser.getRootNode(); + Node n = rootNode.addNode(nodeName1); + n.addMixin(mixLockable); + n.addMixin(mixReferenceable); + rootNode.save(); + + String uuid = n.getUUID(); + + // commit + utx.commit(); + + // start new Transaction and try to add lock token + utx = new UserTransactionImpl(superuser); + utx.begin(); + + n = superuser.getNodeByUUID(uuid); + // lock this new node + Lock lock = n.lock(true, false); + + // verify node is locked + assertTrue("Node not locked", n.isLocked()); + + String lockToken = lock.getLockToken(); + // assert: session must get a non-null lock token + assertNotNull("session must get a non-null lock token", lockToken); + // assert: session must hold lock token + assertTrue("session must hold lock token", containsLockToken(superuser, lockToken)); + + n.save(); + + superuser.removeLockToken(lockToken); + assertNull("session must get a null lock token", lock.getLockToken()); + assertFalse("session must not hold lock token", containsLockToken(superuser, lockToken)); + + // commit + utx.commit(); + + assertFalse("session must not hold lock token", containsLockToken(superuser, lockToken)); + assertNull("session must get a null lock token", lock.getLockToken()); + + // start new Transaction and try to unlock + utx = new UserTransactionImpl(superuser); + utx.begin(); + + n = superuser.getNodeByUUID(uuid); + + // verify node is locked + assertTrue("Node not locked", n.isLocked()); + // assert: session must not hold lock token + assertFalse("session must not hold lock token", containsLockToken(superuser, lockToken)); + + superuser.addLockToken(lockToken); + + // assert: session must not hold lock token + assertTrue("session must hold lock token", containsLockToken(superuser, lockToken)); + + n.unlock(); + + // commit + utx.commit(); + } + /** * Test locking a node in one session. Verify that node is not locked * in session after rollback. Index: src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java (revision 820925) +++ src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java (working copy) @@ -485,6 +485,8 @@ LockInfo xaEnvLock = getLockInfo(node); // Check if the lockToken has been removed in the transaction ... if (xaEnvLock != null && xaEnvLock.getLockHolder() == null) { + //Remove lockToken from SessionLockManager + getSessionLockManager(internalLock.getLockHolder()).lockTokenRemoved(internalLock.getLockToken()); internalLock.setLockHolder(null); } }