[exo-jcr-commits] exo-jcr SVN: r787 - jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Nov 20 06:36:15 EST 2009


Author: nzamosenchuk
Date: 2009-11-20 06:36:15 -0500 (Fri, 20 Nov 2009)
New Revision: 787

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/PersistentLockManager.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
Log:
EXOJCR-243: small fix related to refresh() and getLockToken()

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-20 11:17:03 UTC (rev 786)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java	2009-11-20 11:36:15 UTC (rev 787)
@@ -121,11 +121,6 @@
       return false;
    }
 
-   public String getTokenHash()
-   {
-      return tokenHash;
-   }
-
    /**
     * @return the nodeIdentifier
     */
@@ -150,6 +145,11 @@
       return birthday + timeOut - System.currentTimeMillis() / 1000;
    }
 
+   public String getTokenHash()
+   {
+      return tokenHash;
+   }
+
    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
@@ -174,14 +174,6 @@
    }
 
    /**
-    * @return
-    */
-   protected long getTimeOut()
-   {
-      return timeOut;
-   }
-
-   /**
     * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
     */
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
@@ -235,4 +227,12 @@
 
    }
 
+   /**
+    * @return
+    */
+   protected long getTimeOut()
+   {
+      return 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-20 11:17:03 UTC (rev 786)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockImpl.java	2009-11-20 11:36:15 UTC (rev 787)
@@ -21,6 +21,7 @@
 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.dataflow.TransactionChangesLog;
 import org.exoplatform.services.jcr.impl.core.SessionDataManager;
 import org.exoplatform.services.jcr.observation.ExtendedEvent;
 
@@ -45,8 +46,7 @@
 
    private SessionDataManager sessionDataManager;
 
-   // Token is not stored in lockData any more
-   private String token;
+   private SessionLockManager lockManager;
 
    private String sessionId;
 
@@ -54,11 +54,12 @@
     * @param session
     * @param lockData
     */
-   public LockImpl(SessionDataManager sessionDataManager, LockData lockData, String token, String sessionId)
+   public LockImpl(SessionLockManager lockManager, SessionDataManager sessionDataManager, LockData lockData,
+      String sessionId)
    {
       this.lockData = lockData;
       this.sessionDataManager = sessionDataManager;
-      this.token = token;
+      this.lockManager = lockManager;
       this.live = true;
       this.sessionId = sessionId;
    }
@@ -76,7 +77,7 @@
     */
    public String getLockToken()
    {
-      return token;
+      return lockManager.getLockToken(lockData);
    }
 
    /**
@@ -127,7 +128,9 @@
          new LockData(lockData.getNodeIdentifier(), lockData.getTokenHash(), lockData.isDeep(), lockData
             .isSessionScoped(), lockData.getOwner(), lockData.getTimeOut());
       addChangesLog.setLockData(newLockData);
-      sessionDataManager.getWorkspaceDataManager().save(addChangesLog);
+      TransactionChangesLog log = new TransactionChangesLog();
+      log.addLog(addChangesLog);
+      sessionDataManager.getWorkspaceDataManager().save(log);
       this.lockData = newLockData;
    }
 

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java	2009-11-20 11:17:03 UTC (rev 786)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java	2009-11-20 11:36:15 UTC (rev 787)
@@ -38,7 +38,7 @@
 import javax.jcr.RepositoryException;
 
 /**
- * This is a persistent lock manager, that currently is responsible for removing expired locks
+ * This is a persistent lock manager (workspace-layer), that currently is responsible for removing expired locks
  * 
  * @author <a href="mailto:nikolazius at gmail.com">Nikolay Zamosenchuk</a>
  * @version $Id$
@@ -89,6 +89,7 @@
    protected void removeExpired()
    {
       List<LockData> lockDatas;
+      // try to acquire list of locks
       try
       {
          lockDatas = dataManager.getLocksData();
@@ -99,7 +100,7 @@
          log.error(e.getMessage(), e);
          return;
       }
-
+      // if acquired, try to remove each expired
       if (lockDatas != null)
       {
          for (LockData lockData : lockDatas)

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-20 11:17:03 UTC (rev 786)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java	2009-11-20 11:36:15 UTC (rev 787)
@@ -52,6 +52,8 @@
 import javax.jcr.lock.LockException;
 
 /**
+ * Session-layer lock manager.
+ * 
  * @author <a href="mailto:nikolazius at gmail.com">Nikolay Zamosenchuk</a>
  * @version $Id$
  *
@@ -121,7 +123,7 @@
       }
       else
          lockTimeOut = DEFAULT_LOCK_TIMEOUT;
-      this.tokens = new HashMap<String, String>(); 
+      this.tokens = new HashMap<String, String>();
       this.tokenHash = new HashMap<String, String>();
    }
 
@@ -137,17 +139,6 @@
    }
 
    /**
-    * Removes token from current session
-    * @param token
-    */
-   public void removeLockToken(String token)
-   {
-      String hash = getHash(token);
-      tokens.remove(token);
-      tokenHash.remove(hash);
-   }
-
-   /**
     * Tries to get Lock for node. Is node is not a lockholder, then parent with deep lock is looked for. 
     * 
     * @param node
@@ -164,7 +155,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()), sessionID);
+      return new LockImpl(this, sessionDataManager, lockData, sessionID);
    }
 
    /**
@@ -177,28 +168,26 @@
    }
 
    /**
-    * Checks if node actually has a lock. 
+    * Returns real token, if session has it
     * 
-    * @param node
+    * @param lockData
     * @return
-    * @throws RepositoryException
     */
-   public boolean holdsLock(NodeData node) throws RepositoryException
+   public String getLockToken(LockData lockData)
    {
-      return getLockData(node, SEARCH_EXACMATCH) != null;
+      return tokenHash.get(lockData.getTokenHash());
    }
 
    /**
-    * Checks if current session has a token (access) for this node.
+    * Checks if node actually has a lock. 
     * 
     * @param node
     * @return
     * @throws RepositoryException
     */
-   public boolean isLockHolder(NodeData node) throws RepositoryException
+   public boolean holdsLock(NodeData node) throws RepositoryException
    {
-      LockData lockData = getLockData(node, SEARCH_EXACMATCH | SEARCH_PARENT);
-      return lockData != null && isLockHolder(lockData);
+      return getLockData(node, SEARCH_EXACMATCH) != null;
    }
 
    /**
@@ -219,6 +208,19 @@
    }
 
    /**
+    * Checks if current session has a token (access) for this node.
+    * 
+    * @param node
+    * @return
+    * @throws RepositoryException
+    */
+   public boolean isLockHolder(NodeData node) throws RepositoryException
+   {
+      LockData lockData = getLockData(node, SEARCH_EXACMATCH | SEARCH_PARENT);
+      return lockData != null && isLockHolder(lockData);
+   }
+
+   /**
     * Actually locks the node, adding jcr:lockOwner and jcr:lockIsDeep properties to node and adds lock token
     * to current session. 
     * 
@@ -264,13 +266,71 @@
             new TransientValueData(isDeep));
       changesLog.add(ItemState.createAddedState(propData));
 
-      LockImpl newLock = new LockImpl(sessionDataManager, lockData, token, sessionID);
+      LockImpl newLock = new LockImpl(this, sessionDataManager, lockData, sessionID);
 
       sessionDataManager.getTransactManager().save(changesLog);
       return newLock;
    }
 
    /**
+    * @see org.exoplatform.services.jcr.core.SessionLifecycleListener#onCloseSession(org.exoplatform.services.jcr.core.ExtendedSession)
+    */
+   public void onCloseSession(ExtendedSession session)
+   {
+      // 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 locks;
+      if (lockDatas != null)
+      {
+         for (LockData lockData : lockDatas)
+         {
+            if (lockData.isSessionScoped() && isLockHolder(lockData))
+            {
+               NodeData node;
+               // if can't unlock this, still try to unlock the next one
+               try
+               {
+                  node = (NodeData)sessionDataManager.getItemData(lockData.getNodeIdentifier());
+                  if (node != null)
+                  {
+                     unlock(node);
+                  }
+                  else
+                  {
+                     log.error("Node with uuid=" + lockData.getNodeIdentifier() + "  is null!");
+                  }
+               }
+               catch (RepositoryException e)
+               {
+                  log.error("Can't unlock node on session logout, id:" + lockData.getNodeIdentifier(), e);
+               }
+            }
+         }
+      }
+   }
+
+   /**
+    * Removes token from current session
+    * @param token
+    */
+   public void removeLockToken(String token)
+   {
+      String hash = getHash(token);
+      tokens.remove(token);
+      tokenHash.remove(hash);
+   }
+
+   /**
     * Actually unlock the node also removing jcr:lockOwner and jcr:lockIsDeep properties
     * 
     * @param node
@@ -389,44 +449,4 @@
       return (SystemIdentity.SYSTEM.equals(sessionID) || tokenHash.get(lockData.getTokenHash()) != null);
    }
 
-   /**
-    * @see org.exoplatform.services.jcr.core.SessionLifecycleListener#onCloseSession(org.exoplatform.services.jcr.core.ExtendedSession)
-    */
-   public void onCloseSession(ExtendedSession session)
-   {
-      // 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 locks;
-      if (lockDatas != null)
-      {
-         for (LockData lockData : lockDatas)
-         {
-            if (lockData.isSessionScoped() && isLockHolder(lockData))
-            {
-               NodeData node;
-               // if can't unlock this, still try to unlock the next one
-               try
-               {
-                  node = (NodeData)sessionDataManager.getItemData(lockData.getNodeIdentifier());
-                  unlock(node);
-               }
-               catch (RepositoryException e)
-               {
-                  log.error("Can't unlock node on session logout, id:" + lockData.getNodeIdentifier(), e);
-               }
-            }
-         }
-      }
-   }
-
 }



More information about the exo-jcr-commits mailing list