[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