Author: nzamosenchuk
Date: 2009-11-19 04:22:38 -0500 (Thu, 19 Nov 2009)
New Revision: 762
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/SessionLockManager.java
jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
Log:
EXOJCR-243: Default lock timeout from config is now handled. Tests updated.
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-19
09:21:17 UTC (rev 761)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2009-11-19
09:22:38 UTC (rev 762)
@@ -176,10 +176,8 @@
this.workspace = new WorkspaceImpl(workspaceName, container, this,
observationManager);
- // 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);
+ new SessionLockManager(this.getId(), this.getUserID(),
this.getTransientNodesManager(), wsConfig);
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/SessionLockManager.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2009-11-19
09:21:17 UTC (rev 761)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2009-11-19
09:22:38 UTC (rev 762)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.impl.core.lock;
import org.exoplatform.services.jcr.access.SystemIdentity;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ExtendedSession;
import org.exoplatform.services.jcr.core.SessionLifecycleListener;
import org.exoplatform.services.jcr.dataflow.ItemState;
@@ -106,20 +107,19 @@
* @param session
* @param lockTimeOut
*/
- public SessionLockManager(String sessionID, String userId, SessionDataManager
sessionDataManager, long lockTimeOut)
+ public SessionLockManager(String sessionID, String userId, SessionDataManager
sessionDataManager,
+ WorkspaceEntry wsConfig)
{
- 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)
+ if (wsConfig.getLockManager() != null)
{
- lockTimeOut =
- config.getLockManager().getTimeout() > 0 ?
config.getLockManager().getTimeout() : DEFAULT_LOCK_TIMEOUT;
+ this.lockTimeOut =
+ wsConfig.getLockManager().getTimeout() > 0 ?
wsConfig.getLockManager().getTimeout() : DEFAULT_LOCK_TIMEOUT;
}
else
- lockTimeOut = DEFAULT_LOCK_TIMEOUT;*/
+ lockTimeOut = DEFAULT_LOCK_TIMEOUT;
}
/**
@@ -403,12 +403,13 @@
log.error(e.getMessage(), e);
return;
}
- // list acquired, traversing to cleanup;
+ // list acquired, traversing to cleanup locks;
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());
@@ -416,7 +417,7 @@
}
catch (RepositoryException e)
{
- log.error("Can't unlock node:" +
lockData.getNodeIdentifier(), e);
+ log.error("Can't unlock node on session logout, id:" +
lockData.getNodeIdentifier(), e);
}
}
}
Modified:
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 2009-11-19
09:21:17 UTC (rev 761)
+++
jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java 2009-11-19
09:22:38 UTC (rev 762)
@@ -77,8 +77,50 @@
session2.logout();
}
+ public void testLockUnlock() throws RepositoryException
+ {
+ NodeImpl node1 = (NodeImpl)testRoot.addNode("testLockUnlock");
+ node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
+ session.save();
+ // lock through session1
+ Lock lock1 = node1.lock(false, false);
+
+ // 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(node1.isLocked());
+ assertTrue(node2.isLocked());
+ // add lock token
+ session2.addLockToken(lock1.getLockToken());
+ // unlock through session2
+ node2.unlock();
+ // asset not locked
+ assertFalse(node1.isLocked());
+ assertFalse(node2.isLocked());
+
+ session2.logout();
+ }
+
+ public void testGetLock() throws RepositoryException
+ {
+ NodeImpl node1 = (NodeImpl)testRoot.addNode("testGetLock");
+ node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
+ session.save();
+ // lock
+ Lock lock1 = node1.lock(false, false);
+ // get lock
+ Lock lock2 = node1.getLock();
+ assertEquals(lock1.getLockToken(), lock2.getLockToken());
+ //unlock
+ node1.unlock();
+ }
+
public void testRemoveOnLogOut() throws RepositoryException
{
+ // checks that session-scoped locks are removed on logout
NodeImpl node1 = (NodeImpl)testRoot.addNode("testRemoveOnLogOut");
node1.addMixin(Constants.MIX_LOCKABLE.getAsString());
session.save();
@@ -87,7 +129,7 @@
SessionImpl session2 = (SessionImpl)repository.login(credentials, "ws");
NodeImpl node2 = (NodeImpl)session2.getNodeByUUID(node1.getUUID());
- // lock through session2
+ // lock through session2, as session-scoped
Lock lock2 = node2.lock(false, true);
// check session2 has access to lock
assertTrue(node2.isLocked());
@@ -101,6 +143,35 @@
assertFalse(node1.isLocked());
}
+ public void testNotRemoveOnLogOut() throws RepositoryException
+ {
+ // checks that open-scoped locks are not removed on logout
+ NodeImpl node1 = (NodeImpl)testRoot.addNode("testNotRemoveOnLogOut");
+ 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, as open-scoped
+ Lock lock2 = node2.lock(false, false);
+ // check session2 has access to lock
+ assertTrue(node2.isLocked());
+ assertTrue(session2.getLockManager().isLockHolder((NodeData)node2.getData()));
+
+ // session2 logout
+ session2.logout();
+ // lock should NOT be removed and node should be unlocked
+ assertTrue(lock2.isLive());
+ assertTrue(node2.isLocked());
+ assertTrue(node1.isLocked());
+
+ session.addLockToken(lock2.getLockToken());
+ node1.unlock();
+ assertFalse(node1.isLocked());
+ }
+
public void testRemoveByTimeOut() throws RepositoryException
{
int REMOVER_SCHEDULE_TIME = 10000; // 10s?! need to place correct value