- Use LockAcquisitionException instead of boolean for failures
 - Lock update with TTL=0 sets the start and expiry time to 0


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13956 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2009-04-15 13:52:12 +00:00
parent 6a20eda27f
commit 5bda334c22
6 changed files with 180 additions and 57 deletions

View File

@@ -31,6 +31,7 @@ import java.util.Map;
import java.util.StringTokenizer;
import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.repo.lock.LockAcquisitionException;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
import org.springframework.dao.ConcurrencyFailureException;
@@ -63,7 +64,7 @@ public abstract class AbstractLockDAOImpl implements LockDAO
this.qnameDAO = qnameDAO;
}
public boolean getLock(QName lockQName, String lockToken, long timeToLive)
public void getLock(QName lockQName, String lockToken, long timeToLive)
{
String qnameNamespaceUri = lockQName.getNamespaceURI();
String qnameLocalName = lockQName.getLocalName();
@@ -114,7 +115,9 @@ public abstract class AbstractLockDAOImpl implements LockDAO
boolean canTakeLock = canTakeLock(existingLock, lockToken, requiredExclusiveLockResourceId);
if (!canTakeLock)
{
return false;
throw new LockAcquisitionException(
LockAcquisitionException.ERR_EXCLUSIVE_LOCK_EXISTS,
lockQName, lockToken);
}
existingLocksMap.put(existingLock, existingLock);
}
@@ -142,24 +145,25 @@ public abstract class AbstractLockDAOImpl implements LockDAO
timeToLive);
}
}
return true;
// Done
}
public boolean refreshLock(QName lockQName, String lockToken, long timeToLive)
public void refreshLock(QName lockQName, String lockToken, long timeToLive)
{
return updateLocks(lockQName, lockToken, lockToken, timeToLive);
updateLocks(lockQName, lockToken, lockToken, timeToLive);
}
public boolean releaseLock(QName lockQName, String lockToken)
public void releaseLock(QName lockQName, String lockToken)
{
return updateLocks(lockQName, lockToken, LOCK_TOKEN_RELEASED, 0L);
updateLocks(lockQName, lockToken, LOCK_TOKEN_RELEASED, 0L);
}
/**
* Put new values against the given exclusive lock. This works against the related locks as
* well.
* @throws LockAcquisitionException on failure
*/
private boolean updateLocks(QName lockQName, String lockToken, String newLockToken, long timeToLive)
private void updateLocks(QName lockQName, String lockToken, String newLockToken, long timeToLive)
{
String qnameNamespaceUri = lockQName.getNamespaceURI();
String qnameLocalName = lockQName.getLocalName();
@@ -181,7 +185,9 @@ public abstract class AbstractLockDAOImpl implements LockDAO
if (exclusiveLockResource == null)
{
// If the exclusive lock doesn't exist, the locks don't exist
return false;
throw new LockAcquisitionException(
LockAcquisitionException.ERR_LOCK_RESOURCE_MISSING,
lockQName, lockToken);
}
Long exclusiveLockResourceId = exclusiveLockResource.getId();
// Split the lock name
@@ -194,12 +200,11 @@ public abstract class AbstractLockDAOImpl implements LockDAO
// Check
if (updateCount != requiredUpdateCount)
{
return false;
}
else
{
return true;
throw new LockAcquisitionException(
LockAcquisitionException.ERR_LOCK_UPDATE_COUNT,
lockQName, lockToken, new Integer(updateCount), new Integer(requiredUpdateCount));
}
// Done
}
/**