Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 83267 invoked from network); 16 Oct 2009 05:37:36 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 Oct 2009 05:37:36 -0000 Received: (qmail 69779 invoked by uid 500); 16 Oct 2009 05:37:36 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 69694 invoked by uid 500); 16 Oct 2009 05:37:36 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 69684 invoked by uid 99); 16 Oct 2009 05:37:36 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Oct 2009 05:37:36 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Oct 2009 05:37:33 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 188142388895; Fri, 16 Oct 2009 05:37:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r825772 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java test/java/org/apache/jackrabbit/core/XATest.java Date: Fri, 16 Oct 2009 05:37:11 -0000 To: commits@jackrabbit.apache.org From: ckoell@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091016053712.188142388895@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: ckoell Date: Fri Oct 16 05:37:11 2009 New Revision: 825772 URL: http://svn.apache.org/viewvc?rev=825772&view=rev Log: JCR-2356 Session holds LockToken after removeLockToken in XA Environment Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java?rev=825772&r1=825771&r2=825772&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java Fri Oct 16 05:37:11 2009 @@ -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); } } Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java?rev=825772&r1=825771&r2=825772&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java Fri Oct 16 05:37:11 2009 @@ -828,6 +828,79 @@ other.logout(); } } + + /** + * Test locking and unlocking behavior in transaction + * (see JCR-2356) + * @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