[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