You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2006/11/29 15:59:44 UTC
svn commit: r480587 - in
/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core:
NodeImpl.java lock/LockManager.java lock/LockManagerImpl.java
lock/XALockManager.java
Author: stefan
Date: Wed Nov 29 06:59:39 2006
New Revision: 480587
URL: http://svn.apache.org/viewvc?view=rev&rev=480587
Log:
JCR-641
Modified:
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?view=diff&rev=480587&r1=480586&r2=480587
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Wed Nov 29 06:59:39 2006
@@ -4090,7 +4090,7 @@
LockManager lockMgr = session.getLockManager();
synchronized (lockMgr) {
- if (lockMgr.holdsLock(this)) {
+ if (lockMgr.isLockHolder(session, this)) {
// save first, and unlock later. this guards concurrent access
// remove properties in content
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java?view=diff&rev=480587&r1=480586&r2=480587
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java Wed Nov 29 06:59:39 2006
@@ -65,13 +65,26 @@
/**
* Returns <code>true</code> if the node given holds a lock;
- * otherwise returns <code>false</code>
+ * otherwise returns <code>false</code>.
* @param node node
* @return <code>true</code> if the node given holds a lock;
* otherwise returns <code>false</code>
* @see javax.jcr.Node#holdsLock
*/
boolean holdsLock(NodeImpl node) throws RepositoryException;
+
+ /**
+ * Returns <code>true</code> if the specified session holds a lock on the
+ * given node; otherwise returns <code>false</code>.
+ * <p/>
+ * Note that <code>isLockHolder(session, node)==true</code> implies
+ * <code>holdsLock(node)==true</code>.
+ * @param session session
+ * @param node node
+ * @return if the specified session holds a lock on the given node;
+ * otherwise returns <code>false</code>
+ */
+ boolean isLockHolder(Session session, NodeImpl node) throws RepositoryException;
/**
* Returns <code>true</code> if this node is locked either as a result
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java?view=diff&rev=480587&r1=480586&r2=480587
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java Wed Nov 29 06:59:39 2006
@@ -322,7 +322,7 @@
if (info == null) {
throw new LockException("Node not locked: " + node.safeGetJCRPath());
}
- if (!session.equals(info.getLockHolder())) {
+ if (session != info.getLockHolder()) {
throw new LockException("Node not locked by session: " + node.safeGetJCRPath());
}
session.removeLockToken(info.getLockToken(session), false);
@@ -447,6 +447,27 @@
/**
* {@inheritDoc}
*/
+ public boolean isLockHolder(Session session, NodeImpl node)
+ throws RepositoryException {
+ acquire();
+
+ try {
+ PathMap.Element element = lockMap.map(getPath(node.getId()), true);
+ if (element == null) {
+ return false;
+ }
+ AbstractLockInfo info = (AbstractLockInfo) element.get();
+ return info != null && info.getLockHolder() == session;
+ } catch (ItemNotFoundException e) {
+ return false;
+ } finally {
+ release();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public boolean isLocked(NodeImpl node) throws RepositoryException {
acquire();
@@ -490,7 +511,7 @@
AbstractLockInfo info = (AbstractLockInfo) element.get();
if (info != null) {
if (element.hasPath(path) || info.deep) {
- if (!session.equals(info.getLockHolder())) {
+ if (session != info.getLockHolder()) {
throw new LockException("Node locked.");
}
}
@@ -512,6 +533,9 @@
if (info != null) {
if (info.getLockHolder() == null) {
info.setLockHolder(session);
+ if (info instanceof LockInfo) {
+ session.addListener((LockInfo) info);
+ }
} else {
log.warn("Adding lock token has no effect: "
+ "lock already held by other session.");
@@ -539,7 +563,7 @@
if (element != null) {
AbstractLockInfo info = (AbstractLockInfo) element.get();
if (info != null) {
- if (session.equals(info.getLockHolder())) {
+ if (session == info.getLockHolder()) {
info.setLockHolder(null);
} else {
log.warn("Removing lock token has no effect: "
@@ -910,7 +934,7 @@
log.debug("Root cause: ", e);
}
} else {
- if (session.equals(lockHolder)) {
+ if (session == lockHolder) {
session.removeLockToken(lockToken.toString());
lockHolder = null;
}
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java?view=diff&rev=480587&r1=480586&r2=480587
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java Wed Nov 29 06:59:39 2006
@@ -25,6 +25,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.ItemNotFoundException;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockException;
@@ -122,6 +123,21 @@
info = lockMgr.getLockInfo(node.getNodeId());
}
return info != null && info.getId().equals(node.getId());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isLockHolder(Session session, NodeImpl node)
+ throws RepositoryException {
+ AbstractLockInfo info;
+ if (isInXA()) {
+ info = xaEnv.getLockInfo(node);
+ } else {
+ info = lockMgr.getLockInfo(node.getNodeId());
+ }
+ return info != null && info.getId().equals(node.getId())
+ && info.getLockHolder() == session;
}
/**