You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/05/26 17:53:47 UTC
svn commit: r778775 - in /jackrabbit/branches/1.5/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
test/java/org/apache/jackrabbit/core/XATest.java
Author: jukka
Date: Tue May 26 15:53:47 2009
New Revision: 778775
URL: http://svn.apache.org/viewvc?rev=778775&view=rev
Log:
1.5: Merged revision 776761 (JCR-1633)
Modified:
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java?rev=778775&r1=778774&r2=778775&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java Tue May 26 15:53:47 2009
@@ -125,7 +125,7 @@
/**
* System session
*/
- private final SessionImpl session;
+ private final SessionImpl sysSession;
/**
* Locks file
@@ -152,7 +152,7 @@
public LockManagerImpl(SessionImpl session, FileSystem fs)
throws RepositoryException {
- this.session = session;
+ this.sysSession = session;
this.locksFile = new FileSystemResource(fs, FileSystem.SEPARATOR + LOCKS_FILE);
session.getWorkspace().getObservationManager().
@@ -207,8 +207,8 @@
private void reapplyLock(LockToken lockToken) {
try {
NodeImpl node = (NodeImpl)
- session.getItemManager().getItem(lockToken.getId());
- Path path = getPath(lockToken.getId());
+ sysSession.getItemManager().getItem(lockToken.getId());
+ Path path = getPath(sysSession, lockToken.getId());
LockInfo info = new LockInfo(lockToken, false,
node.getProperty(NameConstants.JCR_LOCKISDEEP).getBoolean(),
@@ -294,7 +294,7 @@
try {
// check whether node is already locked
- Path path = getPath(node.getId());
+ Path path = getPath(session, node.getId());
PathMap.Element element = lockMap.map(path, false);
LockInfo other = (LockInfo) element.get();
@@ -354,7 +354,7 @@
SessionImpl session = (SessionImpl) node.getSession();
// check whether node is locked by this session
- PathMap.Element element = lockMap.map(getPath(node.getId()), true);
+ PathMap.Element element = lockMap.map(getPath(session, node.getId()), true);
if (element == null) {
throw new LockException("Node not locked: " + node);
}
@@ -413,7 +413,7 @@
public AbstractLockInfo getLockInfo(NodeId id) throws RepositoryException {
Path path;
try {
- path = getPath(id);
+ path = getPath(sysSession, id);
} catch (ItemNotFoundException e) {
return null;
}
@@ -455,7 +455,7 @@
try {
SessionImpl session = (SessionImpl) node.getSession();
- Path path = getPath(node.getId());
+ Path path = getPath(session, node.getId());
PathMap.Element element = lockMap.map(path, false);
AbstractLockInfo info = (AbstractLockInfo) element.get();
@@ -514,7 +514,8 @@
acquire();
try {
- PathMap.Element element = lockMap.map(getPath(node.getId()), true);
+ SessionImpl session = (SessionImpl) node.getSession();
+ PathMap.Element element = lockMap.map(getPath(session, node.getId()), true);
if (element == null) {
return false;
}
@@ -534,7 +535,8 @@
acquire();
try {
- PathMap.Element element = lockMap.map(getPath(node.getId()), true);
+ SessionImpl nodeSession = (SessionImpl) node.getSession();
+ PathMap.Element element = lockMap.map(getPath(nodeSession, node.getId()), true);
if (element == null) {
return false;
}
@@ -554,7 +556,8 @@
acquire();
try {
- Path path = getPath(node.getId());
+ SessionImpl session = (SessionImpl) node.getSession();
+ Path path = getPath(session, node.getId());
PathMap.Element element = lockMap.map(path, false);
AbstractLockInfo info = (AbstractLockInfo) element.get();
@@ -580,7 +583,7 @@
throws LockException, RepositoryException {
SessionImpl session = (SessionImpl) node.getSession();
- checkLock(getPath(node.getId()), session);
+ checkLock(getPath(session, node.getId()), session);
}
/**
@@ -608,7 +611,7 @@
LockToken lockToken = LockToken.parse(lt);
NodeImpl node = (NodeImpl)
- this.session.getItemManager().getItem(lockToken.getId());
+ this.sysSession.getItemManager().getItem(lockToken.getId());
PathMap.Element element = lockMap.map(node.getPrimaryPath(), true);
if (element != null) {
AbstractLockInfo info = (AbstractLockInfo) element.get();
@@ -640,7 +643,7 @@
LockToken lockToken = LockToken.parse(lt);
NodeImpl node = (NodeImpl)
- this.session.getItemManager().getItem(lockToken.getId());
+ this.sysSession.getItemManager().getItem(lockToken.getId());
PathMap.Element element = lockMap.map(node.getPrimaryPath(), true);
if (element != null) {
AbstractLockInfo info = (AbstractLockInfo) element.get();
@@ -665,7 +668,7 @@
* Return the path of an item given its id. This method will lookup the
* item inside the systme session.
*/
- private Path getPath(ItemId id) throws RepositoryException {
+ private Path getPath(SessionImpl session, ItemId id) throws RepositoryException {
return session.getHierarchyManager().getPath(id);
}
@@ -841,7 +844,7 @@
try {
he = new HierarchyEvent(event.getChildId(),
- session.getQPath(event.getPath()).getNormalizedPath(),
+ sysSession.getQPath(event.getPath()).getNormalizedPath(),
event.getType());
} catch (MalformedPathException e) {
log.info("Unable to get event's path: " + e.getMessage());
@@ -885,7 +888,7 @@
for (int i = 0; i < infos.size(); i++) {
LockInfo info = (LockInfo) infos.get(i);
try {
- NodeImpl node = (NodeImpl) session.getItemManager().
+ NodeImpl node = (NodeImpl) sysSession.getItemManager().
getItem(info.getId());
lockMap.put(node.getPrimaryPath(), info);
} catch (RepositoryException e) {
@@ -1007,9 +1010,19 @@
NodeImpl node = (NodeImpl) session.getItemManager().getItem(getId());
node.unlock();
} catch (RepositoryException e) {
- log.warn("Unable to remove session-scoped lock on node '"
- + lockToken + "': " + e.getMessage());
- log.debug("Root cause: ", e);
+ // Session is not allowed/able to unlock.
+ // Use system session present with lock-mgr as fallback
+ // in order to make sure, that session-scoped locks are
+ // properly cleaned.
+ SessionImpl systemSession = LockManagerImpl.this.sysSession;
+ setLockHolder(systemSession);
+ try {
+ NodeImpl node = (NodeImpl) systemSession.getItemManager().getItem(getId());
+ node.unlock();
+ } catch (RepositoryException re) {
+ log.warn("Unable to remove session-scoped lock on node '" + lockToken + "': " + e.getMessage());
+ log.debug("Root cause: ", e);
+ }
}
} else {
if (session == lockHolder) {
@@ -1046,7 +1059,7 @@
acquire();
try {
- Path path = getPath(nodeId);
+ Path path = getPath(sysSession, nodeId);
// create lock token
LockInfo info = new LockInfo(new LockToken(nodeId), false, isDeep, userId);
@@ -1066,7 +1079,7 @@
acquire();
try {
- Path path = getPath(nodeId);
+ Path path = getPath(sysSession, nodeId);
PathMap.Element element = lockMap.map(path, true);
if (element == null) {
throw new LockException("Node not locked: " + path.toString());
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java?rev=778775&r1=778774&r2=778775&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java Tue May 26 15:53:47 2009
@@ -874,7 +874,7 @@
* Test locking a new node inside a transaction.
* @throws Exception
*/
- public void xxxtestLockNewNode() throws Exception {
+ public void testLockNewNode() throws Exception {
// get user transaction object, start
UserTransaction utx = new UserTransactionImpl(superuser);
utx.begin();
@@ -887,9 +887,27 @@
// lock this new node
n.lock(false, true);
+ assertTrue("Node locked in transaction", n.isLocked());
// commit
utx.commit();
+
+ // Check if it is locked in other session
+ Session other = helper.getSuperuserSession();
+ Node nOther = other.getNodeByUUID(n.getUUID());
+ assertTrue(nOther.isLocked());
+
+ // Check if it is also locked in other transaction
+ Session other2 = helper.getSuperuserSession();
+ // start new Transaction and try to add locktoken
+ utx = new UserTransactionImpl(other2);
+ utx.begin();
+
+ Node nOther2 = other2.getNodeByUUID(n.getUUID());
+ assertTrue(nOther2.isLocked());
+
+ utx.commit();
+
}
/**