Return-Path: Delivered-To: apmail-incubator-jackrabbit-commits-archive@www.apache.org Received: (qmail 7459 invoked from network); 10 Mar 2005 21:06:19 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 10 Mar 2005 21:06:19 -0000 Received: (qmail 37832 invoked by uid 500); 10 Mar 2005 21:06:18 -0000 Mailing-List: contact jackrabbit-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: jackrabbit-dev@incubator.apache.org Delivered-To: mailing list jackrabbit-commits@incubator.apache.org Received: (qmail 37818 invoked by uid 500); 10 Mar 2005 21:06:18 -0000 Delivered-To: apmail-incubator-jackrabbit-cvs@incubator.apache.org Received: (qmail 37815 invoked by uid 99); 10 Mar 2005 21:06:18 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Thu, 10 Mar 2005 13:06:18 -0800 Received: (qmail 7435 invoked by uid 65534); 10 Mar 2005 21:06:16 -0000 Message-ID: <20050310210616.7434.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Mailer: svnmailer-1.0.0-dev Date: Thu, 10 Mar 2005 21:06:16 -0000 Subject: svn commit: r156989 - in incubator/jackrabbit/trunk/src: java/org/apache/jackrabbit/core/SessionImpl.java java/org/apache/jackrabbit/core/lock/LockManagerImpl.java java/org/apache/jackrabbit/core/lock/PathMap.java test/org/apache/jackrabbit/test/api/lock/LockTest.java To: jackrabbit-cvs@incubator.apache.org From: tripod@apache.org X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: tripod Date: Thu Mar 10 13:06:12 2005 New Revision: 156989 URL: http://svn.apache.org/viewcvs?view=3Drev&rev=3D156989 Log: - fixing some minor locking issues Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Loc= kManagerImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Pat= hMap.java incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/lock= /LockTest.java Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Se= ssionImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/SessionImpl.java?view=3Ddiff&r1=3D156988&r2=3D156989 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java Thu Mar 10 13:06:12 2005 @@ -170,7 +170,7 @@ /** * Lock tokens */ - protected final List lockTokens =3D new ArrayList(); + protected final Set lockTokens =3D new HashSet(); =20 /** * Protected constructor. @@ -1131,9 +1131,7 @@ */ public void addLockToken(String lt, boolean notify) { synchronized (lockTokens) { - lockTokens.add(lt); - - if (notify) { + if (lockTokens.add(lt) && notify) { try { wsp.getLockManager().lockTokenAdded(this, lt); } catch (RepositoryException e) { @@ -1168,9 +1166,7 @@ */ public void removeLockToken(String lt, boolean notify) { synchronized (lockTokens) { - lockTokens.remove(lt); - - if (notify) { + if (lockTokens.remove(lt) && notify) { try { wsp.getLockManager().lockTokenRemoved(this, lt); } catch (RepositoryException e) { Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lo= ck/LockManagerImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/lock/LockManagerImpl.java?view=3Ddiff&r1=3D156988&r2= =3D156989 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Loc= kManagerImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Loc= kManagerImpl.java Thu Mar 10 13:06:12 2005 @@ -207,7 +207,7 @@ LockInfo info =3D (LockInfo) child.get(); if (info !=3D null) { if (child.hasPath(path)) { - throw new LockException("Node already locked: " + path); + throw new LockException("Node already locked: " + node.saf= eGetJCRPath()); } else if (info.deep) { throw new LockException("Parent node has deep lock."); } @@ -239,12 +239,12 @@ PathMap.Child child =3D lockMap.map(path, false); LockInfo info =3D (LockInfo) child.get(); if (info =3D=3D null) { - throw new LockException("Node not locked: " + path); + throw new LockException("Node not locked: " + node.safeGetJCRP= ath()); } if (child.hasPath(path) || info.deep) { return new LockImpl(info, node); } else { - throw new LockException("Node not locked: " + path); + throw new LockException("Node not locked: " + node.safeGetJCRP= ath()); } } =20 @@ -258,17 +258,17 @@ =20 PathMap.Child child =3D lockMap.map(path, true); if (child =3D=3D null) { - throw new LockException("Node not locked: " + path); + throw new LockException("Node not locked: " + node.safeGetJCRP= ath()); } =20 LockInfo info =3D (LockInfo) child.get(); if (info =3D=3D null) { - throw new LockException("Node not locked: " + path); + throw new LockException("Node not locked: " + node.safeGetJCRP= ath()); } if (!node.getSession().equals(info.getLockHolder())) { - throw new LockException("Node not locked by session: " + path); + throw new LockException("Node not locked by session: " + node.= safeGetJCRPath()); } - child.remove(); + child.set(null); =20 info.setLive(false); info.setLockHolder(null); Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lo= ck/PathMap.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/lock/PathMap.java?view=3Ddiff&r1=3D156988&r2=3D156989 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Pat= hMap.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/lock/Pat= hMap.java Thu Mar 10 13:06:12 2005 @@ -272,6 +272,10 @@ */ public void set(Object obj) { this.obj =3D obj; + + if (obj =3D=3D null && childrenCount =3D=3D 0) { + remove(); + } } =20 /** Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/ap= i/lock/LockTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/lock/LockTest.java?view=3Ddiff&r1=3D156988&r2=3D= 156989 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/lock= /LockTest.java (original) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/lock= /LockTest.java Thu Mar 10 13:06:12 2005 @@ -96,5 +96,57 @@ // assertion: isLive must return false assertFalse("Lock must be dead", lock.isLive()); } + + /** + * Test parent/child lock + */ + public void testParentChildLock() throws Exception { + // create new nodes + Node n1 =3D testRootNode.addNode(nodeName1, testNodeType); + n1.addMixin(mixReferenceable); + n1.addMixin(mixLockable); + Node n2 =3D n1.addNode(nodeName2, testNodeType); + n2.addMixin(mixReferenceable); + n2.addMixin(mixLockable); + testRootNode.save(); + + // lock parent node + n1.lock(false, true); + + // lock child node + n2.lock(false, true); + + // unlock parent node + n1.unlock(); + + // child node must still hold lock + assertTrue("child node must still hold lock", n2.holdsLock()); + } + + /** + * Test parent/child lock + */ + public void testParentChildDeepLock() throws Exception { + // create new nodes + Node n1 =3D testRootNode.addNode(nodeName1, testNodeType); + n1.addMixin(mixReferenceable); + n1.addMixin(mixLockable); + Node n2 =3D n1.addNode(nodeName2, testNodeType); + n2.addMixin(mixReferenceable); + n2.addMixin(mixLockable); + testRootNode.save(); + + // lock child node + n2.lock(false, true); + + // lock parent node + n1.lock(true, false); + + // unlock child node + n2.unlock(); + + // parent node must still hold lock + assertTrue("parent node must still hold lock", n1.holdsLock()); + } } =20