Author: dkuleshov
Date: 2010-11-03 06:11:06 -0400 (Wed, 03 Nov 2010)
New Revision: 3385
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java
Log:
EXOJCR-1030: "Impossible to retrieve the lock on a node even by the root" fixed
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-11-03
09:02:48 UTC (rev 3384)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-11-03
10:11:06 UTC (rev 3385)
@@ -2401,7 +2401,7 @@
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());
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java 2010-11-03
09:02:48 UTC (rev 3384)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/AbstractSessionLockManager.java 2010-11-03
10:11:06 UTC (rev 3385)
@@ -19,7 +19,9 @@
package org.exoplatform.services.jcr.impl.core.lock;
import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
+import org.exoplatform.services.security.IdentityConstants;
import javax.jcr.RepositoryException;
import javax.jcr.lock.LockException;
@@ -90,6 +92,30 @@
/**
* {@inheritDoc}
*/
+ public boolean isLockHolder(NodeImpl node) throws RepositoryException
+ {
+ NodeData nodeData = (NodeData)node.getData();
+
+ // check if session has system credentials
+ if (IdentityConstants.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/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2010-11-03
09:02:48 UTC (rev 3384)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2010-11-03
10:11:06 UTC (rev 3385)
@@ -106,17 +106,32 @@
* 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
+ * node data
* @return if the specified session holds a lock on the given node; otherwise returns
* <code>false</code>
+ * @deprecated
*/
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 nodeImpl
+ * node implementation
+ * @return if the specified session holds a lock on the given node; otherwise returns
+ * <code>false</code>
+ */
+ boolean isLockHolder(NodeImpl nodeImpl) throws RepositoryException;
+
+ /**
* Invoked by a session to inform that a lock token has been removed.
*
* @param session
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java 2010-11-03
09:02:48 UTC (rev 3384)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/lock/TestLock.java 2010-11-03
10:11:06 UTC (rev 3385)
@@ -20,6 +20,7 @@
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import org.exoplatform.services.jcr.core.CredentialsImpl;
+import org.exoplatform.services.security.IdentityConstants;
import java.io.ByteArrayInputStream;
import java.util.Calendar;
@@ -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(IdentityConstants.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();
+ }
+ }
+ }
+
}