[exo-jcr-commits] exo-jcr SVN: r3395 - in jcr/branches/1.12.x/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/core/lock and 1 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Thu Nov 4 06:24:00 EDT 2010
Author: dkuleshov
Date: 2010-11-04 06:23:59 -0400 (Thu, 04 Nov 2010)
New Revision: 3395
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java
Log:
JCR-1476: "Impossible to retrieve the lock on a node even by the root" fixed
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-11-04 09:33:32 UTC (rev 3394)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-11-04 10:23:59 UTC (rev 3395)
@@ -2253,7 +2253,7 @@
if (!session.getLockManager().holdsLock((NodeData)this.getData()))
throw new LockException("The node not locked " + getPath());
- if (!session.getLockManager().isLockHolder(this.nodeData()))
+ if (!session.getLockManager().isLockHolder(this))
throw new LockException("There are no permission to unlock the node " + getPath());
if (dataManager.hasPendingChanges(getInternalPath()))
@@ -2635,7 +2635,7 @@
{
// locked, should be unlocked
- if (!session.getLockManager().isLockHolder(this.nodeData()))
+ if (!session.getLockManager().isLockHolder(this))
throw new LockException("There are no permission to unlock the node " + getPath());
// remove mix:lockable properties (as the node is locked)
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java 2010-11-04 09:33:32 UTC (rev 3394)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java 2010-11-04 10:23:59 UTC (rev 3395)
@@ -18,7 +18,9 @@
*/
package org.exoplatform.services.jcr.impl.core.lock;
+import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import javax.jcr.RepositoryException;
@@ -90,6 +92,30 @@
/**
* {@inheritDoc}
*/
+ public boolean isLockHolder(NodeImpl node) throws RepositoryException
+ {
+ NodeData nodeData = (NodeData)node.getData();
+
+ // check if session has system credentials
+ if (SystemIdentity.SYSTEM.equals(node.getSession().getUserID()))
+ {
+ return true;
+ }
+
+ //check is parent node also new
+ if (transientManager.isNew(nodeData.getIdentifier()) && transientManager.isNew(nodeData.getParentIdentifier()))
+ {
+ return true;
+ }
+ else
+ {
+ return isPersistedLockHolder(nodeData);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public boolean isLockHolder(NodeData node) throws RepositoryException
{
//check is parent node also new
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java 2010-11-04 09:33:32 UTC (rev 3394)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java 2010-11-04 10:23:59 UTC (rev 3395)
@@ -18,8 +18,6 @@
*/
package org.exoplatform.services.jcr.impl.core.lock;
-import org.exoplatform.services.jcr.access.SystemIdentity;
-
import java.util.HashSet;
import java.util.Set;
@@ -198,7 +196,7 @@
*/
public boolean isLockHolder(String sessionId)
{
- return lockHolders.contains(sessionId) || SystemIdentity.SYSTEM.equals(sessionId);
+ return lockHolders.contains(sessionId);
}
/**
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2010-11-04 09:33:32 UTC (rev 3394)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2010-11-04 10:23:59 UTC (rev 3395)
@@ -117,6 +117,20 @@
boolean isLockHolder(NodeData 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 implementation
+ * @return if the specified session holds a lock on the given node; otherwise returns
+ * <code>false</code>
+ */
+ boolean isLockHolder(NodeImpl node) throws RepositoryException;
+
+ /**
* Invoked by a session to inform that a lock token has been removed.
*
* @param session
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java 2010-11-04 09:33:32 UTC (rev 3394)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java 2010-11-04 10:23:59 UTC (rev 3395)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.api.lock;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
+import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.core.CredentialsImpl;
import java.io.ByteArrayInputStream;
@@ -451,4 +452,55 @@
}
}
+ public void testUnlockWithSystemSession() throws Exception
+ {
+ Node lockedNode = root.addNode("locked node 2");
+ Session session2 = null, session3 = null;
+ try
+ {
+ Node node = (Node)session.getItem(lockedNode.getPath());
+
+ if (!node.isNodeType("mix:lockable"))
+ {
+ if (node.canAddMixin("mix:lockable"))
+ {
+ node.addMixin("mix:lockable");
+ session.save();
+ }
+ }
+ node.lock(true, false);
+
+ session2 = repository.login(credentials, "ws");
+ node = (Node)session2.getItem(lockedNode.getPath());
+ assertTrue(node.isLocked());
+ try
+ {
+ node.unlock();
+ fail("a LockException is expected");
+ }
+ catch (LockException e)
+ {
+ // a LockException is expected
+ }
+ // The system session
+ session3 = repository.login(new CredentialsImpl(SystemIdentity.SYSTEM, "".toCharArray()), "ws");
+ node = (Node)session3.getItem(lockedNode.getPath());
+ assertTrue(node.isLocked());
+ node.unlock();
+ }
+ finally
+ {
+ lockedNode.remove();
+ session.save();
+ if (session2 != null)
+ {
+ session2.logout();
+ }
+ if (session3 != null)
+ {
+ session3.logout();
+ }
+ }
+ }
+
}
More information about the exo-jcr-commits
mailing list