[exo-jcr-commits] exo-jcr SVN: r747 - in jcr/branches/1.12.0-JBC/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
Wed Nov 18 06:28:17 EST 2009


Author: nzamosenchuk
Date: 2009-11-18 06:28:16 -0500 (Wed, 18 Nov 2009)
New Revision: 747

Removed:
   jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestLockImpl.java
Modified:
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
   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 LockData and LockImpl to new design.

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2009-11-18 11:18:07 UTC (rev 746)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2009-11-18 11:28:16 UTC (rev 747)
@@ -176,8 +176,10 @@
 
       this.workspace = new WorkspaceImpl(workspaceName, container, this, observationManager);
 
-      // TODO: try to get lock time out from workspace configuration, as it was before
-      this.sessionLockManager = new SessionLockManager(this, SessionLockManager.DEFAULT_LOCK_TIMEOUT);
+      // TODO: try to get lock timeout from workspace configuration, as it was before
+      this.sessionLockManager =
+         new SessionLockManager(this.getId(), this.getUserID(), this.getTransientNodesManager(),
+            SessionLockManager.DEFAULT_LOCK_TIMEOUT);
 
       this.lifecycleListeners = new ArrayList<SessionLifecycleListener>();
       this.registerLifecycleListener((ObservationManagerImpl)observationManager);

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 11:18:07 UTC (rev 746)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java	2009-11-18 11:28:16 UTC (rev 747)
@@ -148,7 +148,7 @@
    @Override
    public int hashCode()
    {
-      return super.hashCode() + tokenHash.hashCode();
+      return tokenHash.hashCode();
    }
 
    public boolean isDeep()
@@ -157,14 +157,6 @@
    }
 
    /**
-    * @return the live
-    */
-   public boolean isLive()
-   {
-      return live;
-   }
-
-   /**
     * @return
     */
    public boolean isSessionScoped()
@@ -173,23 +165,6 @@
    }
 
    /**
-    * 
-    */
-   public void refresh()
-   {
-      birthday = System.currentTimeMillis();
-   }
-
-   /**
-    * @param the
-    *          live to set
-    */
-   public void setLive(boolean live)
-   {
-      this.live = live;
-   }
-
-   /**
     * @return
     */
    protected long getTimeOut()
@@ -197,11 +172,4 @@
       return timeOut;
    }
 
-   /**
-    * @param timeOut
-    */
-   protected void setTimeOut(long timeOut)
-   {
-      this.timeOut = timeOut;
-   }
 }

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 11:18:07 UTC (rev 746)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java	2009-11-18 11:28:16 UTC (rev 747)
@@ -19,7 +19,7 @@
 package org.exoplatform.services.jcr.impl.core.lock;
 
 import org.exoplatform.services.jcr.core.lock.ExtendedLock;
-import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import org.exoplatform.services.jcr.impl.core.SessionDataManager;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -36,8 +36,10 @@
 {
    private LockData lockData;
 
-   private SessionImpl session;
+   private boolean live;
 
+   private SessionDataManager sessionDataManager;
+
    // Token is not stored in lockData any more
    private String token;
 
@@ -45,11 +47,12 @@
     * @param session
     * @param lockData
     */
-   public LockImpl(SessionImpl session, LockData lockData, String token)
+   public LockImpl(SessionDataManager sessionDataManager, LockData lockData, String token)
    {
       this.lockData = lockData;
-      this.session = session;
+      this.sessionDataManager = sessionDataManager;
       this.token = token;
+      this.live = true;
    }
 
    /**
@@ -73,7 +76,32 @@
     */
    public boolean isLive()
    {
-      return lockData.isLive();
+      // it is already not alive
+      if (!live)
+      {
+         return false;
+      }
+      // update from cache. If it is not present there - means it is not live
+      try
+      {
+         // node unlocked and/or re-locked with another session 
+         LockData newlockData = sessionDataManager.getLockData(lockData.getNodeIdentifier());
+         if (newlockData == null || newlockData.getTokenHash() != lockData.getTokenHash())
+         {
+            live = false;
+            return false;
+         }
+         else
+         {
+            // update, whether time to death changed, or whatever
+            this.lockData = newlockData;
+            return true;
+         }
+      }
+      catch (RepositoryException e)
+      {
+         return false;
+      }
    }
 
    /**
@@ -83,7 +111,7 @@
    {
       if (!isLive())
          throw new LockException("Lock is not live");
-      lockData.refresh();
+      // TODO: recreate lockData
    }
 
    /**
@@ -93,7 +121,7 @@
    {
       try
       {
-         return (Node)session.getTransientNodesManager().getItemByIdentifier(lockData.getNodeIdentifier(), true);
+         return (Node)sessionDataManager.getItemByIdentifier(lockData.getNodeIdentifier(), true);
       }
       catch (RepositoryException e)
       {
@@ -134,12 +162,4 @@
       return lockData;
    }
 
-   /**
-    * @param timeOut
-    */
-   protected void setTimeOut(long timeOut)
-   {
-      lockData.setTimeOut(timeOut);
-   }
-
 }

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 11:18:07 UTC (rev 746)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java	2009-11-18 11:28:16 UTC (rev 747)
@@ -30,7 +30,7 @@
 import org.exoplatform.services.jcr.datamodel.PropertyData;
 import org.exoplatform.services.jcr.datamodel.QPathEntry;
 import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import org.exoplatform.services.jcr.impl.core.SessionDataManager;
 import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
 import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
 import org.exoplatform.services.jcr.observation.ExtendedEvent;
@@ -76,13 +76,14 @@
     */
    private static final int SEARCH_CHILD = 4;
 
-   /**
-    * Session through which this lock manager is created
-    */
-   private final SessionImpl session;
+   private String sessionID;
 
-   protected final Log log = ExoLogger.getLogger(this.getClass().getName());
+   private String userId;
 
+   private SessionDataManager sessionDataManager;
+
+   private final Log log = ExoLogger.getLogger(this.getClass().getName());
+
    /**
     * Holds session's tokens and their hashes to avoid calculation every time.
     * Token <--> Hash  
@@ -105,10 +106,12 @@
     * @param session
     * @param lockTimeOut
     */
-   public SessionLockManager(SessionImpl session, long lockTimeOut)
+   public SessionLockManager(String sessionID, String userId, SessionDataManager sessionDataManager, long lockTimeOut)
    {
-      this.session = session;
       this.lockTimeOut = lockTimeOut;
+      this.sessionID = sessionID;
+      this.userId = userId;
+      this.sessionDataManager = sessionDataManager;
       // TODO: configured lock timeout should be acquired from WSconfig
       /*      if (config.getLockManager() != null)
       {
@@ -158,7 +161,7 @@
          throw new LockException("Node not locked: " + node.getQPath());
       }
       // if session doesn't have token, null will be returned
-      return new LockImpl(session, lockData, tokenHash.get(lockData.getTokenHash()));
+      return new LockImpl(sessionDataManager, lockData, tokenHash.get(lockData.getTokenHash()));
    }
 
    /**
@@ -237,21 +240,20 @@
       String hash = getHash(token);
 
       LockData lockData =
-         new LockData(node.getIdentifier(), hash, isDeep, isSessionScoped, session.getUserID(), timeOut > 0 ? timeOut
-            : lockTimeOut);
+         new LockData(node.getIdentifier(), hash, isDeep, isSessionScoped, userId, timeOut > 0 ? timeOut : lockTimeOut);
 
       tokens.put(token, hash);
       tokenHash.put(hash, token);
 
       // Create and pass changes log 
       LockPlainChangesLogImpl changesLog =
-         new LockPlainChangesLogImpl(new ArrayList<ItemState>(), session.getId(), ExtendedEvent.LOCK);
+         new LockPlainChangesLogImpl(new ArrayList<ItemState>(), sessionID, ExtendedEvent.LOCK);
 
       changesLog.setLockData(lockData);
 
       PropertyData propData =
          TransientPropertyData.createPropertyData(node, Constants.JCR_LOCKOWNER, PropertyType.STRING, false,
-            new TransientValueData(session.getUserID()));
+            new TransientValueData(userId));
       changesLog.add(ItemState.createAddedState(propData));
 
       propData =
@@ -259,9 +261,9 @@
             new TransientValueData(isDeep));
       changesLog.add(ItemState.createAddedState(propData));
 
-      LockImpl newLock = new LockImpl(session, lockData, token);
+      LockImpl newLock = new LockImpl(sessionDataManager, lockData, token);
 
-      session.getTransientNodesManager().getTransactManager().save(changesLog);
+      sessionDataManager.getTransactManager().save(changesLog);
       return newLock;
    }
 
@@ -273,20 +275,17 @@
     */
    public void unlock(NodeData node) throws RepositoryException
    {
-      PlainChangesLog changesLog =
-         new PlainChangesLogImpl(new ArrayList<ItemState>(), session.getId(), ExtendedEvent.UNLOCK);
+      PlainChangesLog changesLog = new PlainChangesLogImpl(new ArrayList<ItemState>(), sessionID, ExtendedEvent.UNLOCK);
 
-      ItemData lockOwner =
-         session.getTransientNodesManager().getItemData(node, new QPathEntry(Constants.JCR_LOCKOWNER, 0));
+      ItemData lockOwner = sessionDataManager.getItemData(node, new QPathEntry(Constants.JCR_LOCKOWNER, 0));
 
       changesLog.add(ItemState.createDeletedState(lockOwner));
 
-      ItemData lockIsDeep =
-         session.getTransientNodesManager().getItemData(node, new QPathEntry(Constants.JCR_LOCKISDEEP, 0));
+      ItemData lockIsDeep = sessionDataManager.getItemData(node, new QPathEntry(Constants.JCR_LOCKISDEEP, 0));
 
       changesLog.add(ItemState.createDeletedState(lockIsDeep));
 
-      session.getTransientNodesManager().getTransactManager().save(changesLog);
+      sessionDataManager.getTransactManager().save(changesLog);
    }
 
    /**
@@ -330,15 +329,15 @@
       {
          if ((searchType & SEARCH_EXACMATCH) != 0)
          {
-            retval = session.getTransientNodesManager().getLockData(data.getIdentifier());
+            retval = sessionDataManager.getLockData(data.getIdentifier());
          }
          if (retval == null && (searchType & SEARCH_PARENT) != 0)
          {
 
-            NodeData parentData = (NodeData)session.getTransientNodesManager().getItemData(data.getParentIdentifier());
+            NodeData parentData = (NodeData)sessionDataManager.getItemData(data.getParentIdentifier());
             if (parentData != null)
             {
-               retval = session.getTransientNodesManager().getLockData(parentData.getIdentifier());
+               retval = sessionDataManager.getLockData(parentData.getIdentifier());
                // parent not found try to find upper
                if (retval == null)
                {
@@ -349,10 +348,10 @@
          if (retval == null && (searchType & SEARCH_CHILD) != 0)
          {
 
-            List<NodeData> childData = session.getTransientNodesManager().getChildNodesData(data);
+            List<NodeData> childData = sessionDataManager.getChildNodesData(data);
             for (NodeData nodeData : childData)
             {
-               retval = session.getTransientNodesManager().getLockData(nodeData.getIdentifier());
+               retval = sessionDataManager.getLockData(nodeData.getIdentifier());
                if (retval != null)
                   break;
             }
@@ -384,7 +383,7 @@
     */
    private boolean isLockHolder(LockData lockData)
    {
-      return (SystemIdentity.SYSTEM.equals(session.getId()) || tokenHash.get(lockData.getTokenHash()) != null);
+      return (SystemIdentity.SYSTEM.equals(sessionID) || tokenHash.get(lockData.getTokenHash()) != null);
    }
 
    /**
@@ -392,7 +391,35 @@
     */
    public void onCloseSession(ExtendedSession session)
    {
-      // TODO: remove session scoped locks
+      // the logic as it was before, if session holds token for lock, and lock is open scoped - remove it.   
+      List<LockData> lockDatas;
+      try
+      {
+         lockDatas = sessionDataManager.getLocksData();
+      }
+      catch (RepositoryException e)
+      {
+         // exception getting list of locks, return.
+         log.error(e.getMessage(), e);
+         return;
+      }
+      // list acquired, traversing to cleanup;
+      for (LockData lockData : lockDatas)
+      {
+         if (lockData.isSessionScoped() && isLockHolder(lockData))
+         {
+            NodeData node;
+            try
+            {
+               node = (NodeData)sessionDataManager.getItemData(lockData.getNodeIdentifier());
+               unlock(node);
+            }
+            catch (RepositoryException e)
+            {
+               log.error("Can't unlock node:" + lockData.getNodeIdentifier(), e);
+            }
+         }
+      }
    }
 
 }

Deleted: jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestLockImpl.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestLockImpl.java	2009-11-18 11:18:07 UTC (rev 746)
+++ jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestLockImpl.java	2009-11-18 11:28:16 UTC (rev 747)
@@ -1,109 +0,0 @@
-/*
- * 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.ExtendedNode;
-import org.exoplatform.services.jcr.impl.core.NodeImpl;
-
-import javax.jcr.RepositoryException;
-
-/**
- * @author <a href="mailto:Sergey.Kabashnyuk at gmail.com">Sergey Kabashnyuk</a>
- * @version $Id$
- */
-public class TestLockImpl extends JcrImplBaseTest
-{
-   private ExtendedNode lockedNode = null;
-
-   private static final long LOCK_TIMEOUT = 5; // sec
-
-   //private static final long LOCK_REMOVER_WAIT = LockRemover.DEFAULT_THREAD_TIMEOUT + (LOCK_TIMEOUT + 1) * 1000; // 15
-   private static final long LOCK_REMOVER_WAIT = (LOCK_TIMEOUT + 30) * 1000; //
-
-   // sec
-
-   public void setUp() throws Exception
-   {
-
-      super.setUp();
-
-      if (lockedNode == null)
-         try
-         {
-            lockedNode = (ExtendedNode)root.addNode("locked node");
-            if (lockedNode.canAddMixin("mix:lockable"))
-               lockedNode.addMixin("mix:lockable");
-            root.save();
-         }
-         catch (RepositoryException e)
-         {
-            fail("Child node must be accessible and readable. But error occurs: " + e);
-         }
-   }
-
-   public void testNonSessionScopedLockRemoveOnTimeOut()
-   {
-      try
-      {
-         LockImpl lock = (LockImpl)lockedNode.lock(true, false);
-
-         assertTrue(lockedNode.isLocked());
-         lock.setTimeOut(LOCK_TIMEOUT);// 5 sec
-         if (log.isDebugEnabled())
-            log.debug("Stoping thread. Wait for removing lock for node "
-               + ((NodeImpl)lockedNode).getData().getIdentifier() + "by LockRemover");
-         Thread.sleep(LOCK_REMOVER_WAIT);
-         assertFalse(lockedNode.isLocked());
-
-      }
-      catch (RepositoryException e)
-      {
-         fail(e.getLocalizedMessage());
-      }
-      catch (InterruptedException e)
-      {
-         fail(e.getLocalizedMessage());
-      }
-   }
-
-   public void testSessionScopedLockRemoveOnTimeOut()
-   {
-      try
-      {
-         LockImpl lock = (LockImpl)lockedNode.lock(true, true);
-         assertTrue(lockedNode.isLocked());
-         lock.setTimeOut(LOCK_TIMEOUT); // sec
-         if (log.isDebugEnabled())
-            log.debug("Stoping thread. Wait for removing lock by LockRemover");
-         Thread.sleep(LOCK_REMOVER_WAIT);
-         assertTrue(lockedNode.isLocked());
-         lockedNode.unlock();
-      }
-      catch (RepositoryException e)
-      {
-         fail(e.getLocalizedMessage());
-      }
-      catch (InterruptedException e)
-      {
-         fail(e.getLocalizedMessage());
-      }
-   }
-
-}



More information about the exo-jcr-commits mailing list