### Eclipse Workspace Patch 1.0 #P jackrabbit-core Index: src/main/java/org/apache/jackrabbit/core/NodeImpl.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/NodeImpl.java (revision 952269) +++ src/main/java/org/apache/jackrabbit/core/NodeImpl.java (working copy) @@ -314,7 +314,7 @@ // make transient (copy-on-write) NodeState transientState = stateMgr.createTransientNodeState( - data.getNodeState(), ItemState.STATUS_EXISTING_MODIFIED); + (NodeState) stateMgr.getItemState(getId()), ItemState.STATUS_EXISTING_MODIFIED); // replace persistent with transient state data.setState(transientState); } catch (ItemStateException ise) { Index: src/test/java/org/apache/jackrabbit/core/XATest.java =================================================================== --- src/test/java/org/apache/jackrabbit/core/XATest.java (revision 952269) +++ src/test/java/org/apache/jackrabbit/core/XATest.java (working copy) @@ -1874,6 +1874,61 @@ other.save(); utx.commit(); } + + /** + * Tests if it is possible to add-lock a node and unlock-remove it with + * a shared session in different transactions + * (see JCR-2341) + * @throws Exception + */ + public void testAddLockTokenRemoveNode2() 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(); + + // lock this new node + Lock lock = n.lock(true, false); + String lockToken = lock.getLockToken(); + + // commit + utx.commit(); + + + // refresh Lock Info + lock = n.getLock(); + + // start new Transaction and try to add lock token unlock the node and then remove it + utx = new UserTransactionImpl(superuser); + utx.begin(); + + Node otherNode = superuser.getNodeByUUID(uuid); + assertTrue("Node not locked", otherNode.isLocked()); + // add lock token + superuser.addLockToken(lockToken); + + // refresh Lock Info + lock = otherNode.getLock(); + + // assert: session must hold lock token + assertTrue("session must hold lock token", containsLockToken(superuser, lockToken)); + + otherNode.unlock(); + + assertFalse("Node is locked", otherNode.isLocked()); + + otherNode.remove(); + superuser.save(); + utx.commit(); + } /** * Test setting the same property multiple times. Exposes an issue where