[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