[exo-jcr-commits] exo-jcr SVN: r755 - in jcr/branches/1.12.0-JBC/component/core/src: test/java/org/exoplatform/services/jcr/impl/core/lock and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Nov 18 11:17:23 EST 2009


Author: nzamosenchuk
Date: 2009-11-18 11:17:22 -0500 (Wed, 18 Nov 2009)
New Revision: 755

Added:
   jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
Modified:
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
Log:
EXOJCR-243: Updated LockManager, LockImpl: added refresh functionality. Added tests.

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java	2009-11-18 16:16:19 UTC (rev 754)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java	2009-11-18 16:17:22 UTC (rev 755)
@@ -197,11 +197,11 @@
       buf = new byte[in.readInt()];
       in.readFully(buf);
       this.nodeIdentifier = new String(buf, Constants.DEFAULT_ENCODING);
-      // read uuid
+      // read owner
       buf = new byte[in.readInt()];
       in.readFully(buf);
       this.owner = new String(buf, Constants.DEFAULT_ENCODING);
-      // read uuid
+      // read token
       buf = new byte[in.readInt()];
       in.readFully(buf);
       this.tokenHash = new String(buf, Constants.DEFAULT_ENCODING);
@@ -223,11 +223,11 @@
       byte[] ptbuf = nodeIdentifier.getBytes(Constants.DEFAULT_ENCODING);
       out.writeInt(ptbuf.length);
       out.write(ptbuf);
-      // node uuid
+      // node owner
       ptbuf = owner.getBytes(Constants.DEFAULT_ENCODING);
       out.writeInt(ptbuf.length);
       out.write(ptbuf);
-      // node uuid
+      // node token
       ptbuf = tokenHash.getBytes(Constants.DEFAULT_ENCODING);
       out.writeInt(ptbuf.length);
       out.write(ptbuf);

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java	2009-11-18 16:16:19 UTC (rev 754)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java	2009-11-18 16:17:22 UTC (rev 755)
@@ -19,8 +19,13 @@
 package org.exoplatform.services.jcr.impl.core.lock;
 
 import org.exoplatform.services.jcr.core.lock.ExtendedLock;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.LockPlainChangesLogImpl;
 import org.exoplatform.services.jcr.impl.core.SessionDataManager;
+import org.exoplatform.services.jcr.observation.ExtendedEvent;
 
+import java.util.ArrayList;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.lock.LockException;
@@ -43,16 +48,19 @@
    // Token is not stored in lockData any more
    private String token;
 
+   private String sessionId;
+
    /**
     * @param session
     * @param lockData
     */
-   public LockImpl(SessionDataManager sessionDataManager, LockData lockData, String token)
+   public LockImpl(SessionDataManager sessionDataManager, LockData lockData, String token, String sessionId)
    {
       this.lockData = lockData;
       this.sessionDataManager = sessionDataManager;
       this.token = token;
       this.live = true;
+      this.sessionId = sessionId;
    }
 
    /**
@@ -111,7 +119,16 @@
    {
       if (!isLive())
          throw new LockException("Lock is not live");
-      // TODO: recreate lockData
+
+      // add new lock data. Storage connection will recognize it as a update, because lock token is the same
+      LockPlainChangesLogImpl addChangesLog =
+         new LockPlainChangesLogImpl(new ArrayList<ItemState>(), sessionId, ExtendedEvent.LOCK);
+      LockData newLockData =
+         new LockData(lockData.getNodeIdentifier(), lockData.getTokenHash(), lockData.isDeep(), lockData
+            .isSessionScoped(), lockData.getOwner(), lockData.getTimeOut());
+      addChangesLog.setLockData(newLockData);
+      sessionDataManager.getWorkspaceDataManager().save(addChangesLog);
+      this.lockData = newLockData;
    }
 
    /**

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java	2009-11-18 16:16:19 UTC (rev 754)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java	2009-11-18 16:17:22 UTC (rev 755)
@@ -161,7 +161,7 @@
          throw new LockException("Node not locked: " + node.getQPath());
       }
       // if session doesn't have token, null will be returned
-      return new LockImpl(sessionDataManager, lockData, tokenHash.get(lockData.getTokenHash()));
+      return new LockImpl(sessionDataManager, lockData, tokenHash.get(lockData.getTokenHash()), sessionID);
    }
 
    /**
@@ -261,7 +261,7 @@
             new TransientValueData(isDeep));
       changesLog.add(ItemState.createAddedState(propData));
 
-      LockImpl newLock = new LockImpl(sessionDataManager, lockData, token);
+      LockImpl newLock = new LockImpl(sessionDataManager, lockData, token, sessionID);
 
       sessionDataManager.getTransactManager().save(changesLog);
       return newLock;

Added: jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java	                        (rev 0)
+++ jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java	2009-11-18 16:17:22 UTC (rev 755)
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.lock;
+
+import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.core.CredentialsImpl;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
+import org.exoplatform.services.jcr.impl.core.SessionImpl;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.Lock;
+
+/**
+ * @author <a href="mailto:nikolazius at gmail.com">Nikolay Zamosenchuk</a>
+ * @version $Id$
+ *
+ */
+public class TestSessionLockManager extends JcrImplBaseTest
+{
+   NodeImpl testRoot;
+
+   @Override
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      testRoot = (NodeImpl)root.addNode("TestSessionLockManager");
+      session.save();
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      testRoot.remove();
+      session.save();
+      super.tearDown();
+   }
+
+   public void testAddLockToken() throws RepositoryException
+   {
+      NodeImpl node1 = (NodeImpl)testRoot.addNode("testAddLockToken");
+      node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
+      session.save();
+      // lock through session1
+      Lock lock1 = node1.lock(false, true);
+
+      // create new session2
+      CredentialsImpl credentials = new CredentialsImpl("admin", "admin".toCharArray());
+      SessionImpl session2 = (SessionImpl)repository.login(credentials, "ws");
+
+      NodeImpl node2 = (NodeImpl)session2.getNodeByUUID(node1.getUUID());
+      // check node locked
+      assertTrue(node2.isLocked());
+      // check session2 has NO access to lock  
+      assertFalse(session2.getLockManager().isLockHolder((NodeData)node2.getData()));
+      // add token and check session2 has access to lock
+      session2.addLockToken(lock1.getLockToken());
+      assertTrue(session2.getLockManager().isLockHolder((NodeData)node2.getData()));
+      node2.unlock();
+      session2.logout();
+   }
+
+   public void testRemoveOnLogOut() throws RepositoryException
+   {
+      NodeImpl node1 = (NodeImpl)testRoot.addNode("testRemoveOnLogOut");
+      node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
+      session.save();
+      // create new session2
+      CredentialsImpl credentials = new CredentialsImpl("admin", "admin".toCharArray());
+      SessionImpl session2 = (SessionImpl)repository.login(credentials, "ws");
+
+      NodeImpl node2 = (NodeImpl)session2.getNodeByUUID(node1.getUUID());
+      // lock through session2
+      Lock lock2 = node2.lock(false, true);
+      // check session2 has access to lock  
+      assertTrue(node2.isLocked());
+      assertTrue(session2.getLockManager().isLockHolder((NodeData)node2.getData()));
+
+      // session2 logout
+      session2.logout();
+      // lock should be removed and node should be unlocked
+      assertFalse(lock2.isLive());
+      assertFalse(node2.isLocked());
+      assertFalse(node1.isLocked());
+   }
+
+   public void testRemoveByTimeOut() throws RepositoryException
+   {
+      int REMOVER_SCHEDULE_TIME = 10000; // 10s?! need to place correct value
+      int lockTimeOut = 2000;
+      NodeImpl node1 = (NodeImpl)testRoot.addNode("testRemoveByTimeOut");
+      node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
+      session.save();
+      // set time out 2s
+      node1.lock(false, lockTimeOut);
+      try
+      {
+         // sleep for Remover period time + lockTimeOut + 1s for stability
+         Thread.sleep(REMOVER_SCHEDULE_TIME + lockTimeOut + 1000);
+      }
+      catch (InterruptedException e)
+      {
+      }
+      assertFalse(node1.isLocked());
+   }
+}


Property changes on: jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native



More information about the exo-jcr-commits mailing list