Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (revision 1072283) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (working copy) @@ -35,6 +35,7 @@ import org.apache.jackrabbit.core.fs.FileSystemResource; import org.apache.jackrabbit.core.observation.EventImpl; import org.apache.jackrabbit.core.observation.SynchronousEventListener; +import org.apache.jackrabbit.core.security.principal.AdminPrincipal; import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.core.state.PropertyState; @@ -63,9 +64,11 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.security.Principal; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -357,6 +360,16 @@ } } + private boolean isAdmin(Session session) { + Set principals = ((SessionImpl)session).getSubject().getPrincipals(); + for (Principal p : principals) { + if (p instanceof AdminPrincipal) { + return true; + } + } + return false; + } + static SessionLockManager getSessionLockManager(SessionImpl session) throws RepositoryException { Workspace wsp = session.getWorkspace(); return (SessionLockManager) wsp.getLockManager(); @@ -468,6 +481,9 @@ if (info == null) { throw new LockException("Node not locked: " + node); } + if(!info.isSessionScoped()&&isAdmin(session)) { + info.setLockHolder((SessionImpl)session); + } checkUnlock(info, session); getSessionLockManager(session).lockTokenRemoved(info.getLockToken()); @@ -751,6 +767,9 @@ if (info == null) { throw new LockException("Node not locked: " + node); } + if(!info.isSessionScoped()&&isAdmin(session)) { + info.setLockHolder((SessionImpl)session); + } checkUnlock(info, session); } Index: jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java =================================================================== --- jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java (revision 1072283) +++ jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java (working copy) @@ -144,16 +144,9 @@ public void testUnlockAfterTokenTransfer() throws Exception { String lockToken = lock.getLockToken(); - try { - superuser.removeLockToken(lockToken); - lockedNode.unlock(); - fail("After transfering lock token the original lock object cannot be unlocked by session, that does hold lock any more."); - } catch (LockException e) { - // oK - } finally { - // move lock token back in order to have lock removed properly - superuser.addLockToken(lockToken); - } + superuser.removeLockToken(lockToken); + lockedNode.unlock(); + assertFalse(lockedNode.isLocked()); } public void testUnlockAfterTokenTransfer2() throws Exception { Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/lock/AbstractLockTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/lock/AbstractLockTest.java (revision 1072283) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/lock/AbstractLockTest.java (working copy) @@ -312,18 +312,18 @@ public void testUnlockByOtherSession() throws RepositoryException, NotExecutableException { Session otherSession = getHelper().getReadWriteSession(); try { - getLockManager(otherSession).unlock(lockedNode.getPath()); - fail("Another session must not be allowed to unlock."); + getLockManager(otherSession).unlock(lockedNode.getPath()); + if(!isSessionScoped()) { + assertFalse(lockMgr.isLocked(lockedNode.getPath())); + otherSession.logout(); + } } catch (LockException e) { - // success - // make sure the node is still locked and the lock properties are - // still present. - assertTrue(lockMgr.isLocked(lockedNode.getPath())); - assertTrue(lockedNode.hasProperty(jcrlockIsDeep)); - assertTrue(lockedNode.hasProperty(jcrLockOwner)); - } finally { - otherSession.logout(); - } + assertTrue(lockMgr.isLocked(lockedNode.getPath())); + assertTrue(lockedNode.hasProperty(jcrlockIsDeep)); + assertTrue(lockedNode.hasProperty(jcrLockOwner)); + } finally { + otherSession.logout(); + } } public void testIsLockedChild() throws RepositoryException {