You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/08/28 06:05:58 UTC
svn commit: r1518066 - in /jackrabbit/oak/trunk/oak-jcr: ./
src/main/java/org/apache/jackrabbit/oak/jcr/
src/main/java/org/apache/jackrabbit/oak/jcr/lock/
Author: jukka
Date: Wed Aug 28 04:05:58 2013
New Revision: 1518066
URL: http://svn.apache.org/r1518066
Log:
OAK-150: Basic JCR LockManager support
Simplify cleanup of session-scoped locks
Further trimming of the known issue list
Modified:
jackrabbit/oak/trunk/oak-jcr/pom.xml
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1518066&r1=1518065&r2=1518066&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Wed Aug 28 04:05:58 2013
@@ -66,7 +66,7 @@
org.apache.jackrabbit.test.api.DocumentViewImportTest#testWorkspaceImportXml <!-- OAK-970 -->
org.apache.jackrabbit.test.api.DocumentViewImportTest#testSessionGetImportContentHandler <!-- OAK-970 -->
- <!-- Locking : not implemented -->
+ <!-- Locking : not fully implemented -->
org.apache.jackrabbit.test.api.SerializationTest#testLockExceptionWorkspaceWithHandler <!-- OAK-127: no session scoped locking -->
org.apache.jackrabbit.test.api.SerializationTest#testLockExceptionSessionWithHandler <!-- OAK-127: no session scoped locking -->
org.apache.jackrabbit.test.api.SerializationTest#testLockExceptionWorkspace <!-- OAK-127: no session scoped locking -->
@@ -76,11 +76,8 @@
org.apache.jackrabbit.test.api.lock.LockTest#testParentChildDeepLock
org.apache.jackrabbit.test.api.lock.LockTest#testIsSessionScoped
org.apache.jackrabbit.test.api.lock.LockTest#testLockTransfer
- org.apache.jackrabbit.test.api.lock.LockTest#testRefreshNotLive
org.apache.jackrabbit.test.api.lock.LockTest#testAddRemoveLockToken
- org.apache.jackrabbit.test.api.lock.LockTest#testCheckedIn
org.apache.jackrabbit.test.api.lock.LockTest#testOpenScopedLocks
- org.apache.jackrabbit.test.api.lock.LockTest#testCheckedInUnlock
org.apache.jackrabbit.test.api.lock.LockTest#testLogout
org.apache.jackrabbit.test.api.lock.SetValueLockExceptionTest#testSetValueLockException
@@ -89,35 +86,12 @@
org.apache.jackrabbit.test.api.lock.DeepLockTest#testParentChildDeepLock
org.apache.jackrabbit.test.api.lock.DeepLockTest#testDeepLockAboveLockedChild
org.apache.jackrabbit.test.api.lock.DeepLockTest#testRemoveLockedChild
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testIsSessionScoped
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testRefreshNotLive
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testIsLockOwningSession
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testUnlockByOtherSession
- org.apache.jackrabbit.test.api.lock.DeepLockTest#testGetSecondsRemainingAfterUnlock
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testLockTransfer
org.apache.jackrabbit.test.api.lock.LockManagerTest#testLockTransfer2
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testLockTransfer3
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testRemoveLockToken
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testRemoveLockToken2
org.apache.jackrabbit.test.api.lock.LockManagerTest#testRemoveLockToken3
org.apache.jackrabbit.test.api.lock.LockManagerTest#testLockWithPendingChanges
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testGetLockTokens
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testRemoveLockTokenTwice
- org.apache.jackrabbit.test.api.lock.LockManagerTest#testAddLockTokenAgain
org.apache.jackrabbit.test.api.lock.LockManagerTest#testAddLockTokenToAnotherSession
- org.apache.jackrabbit.test.api.lock.OpenScopedLockTest#testGetLockToken
- org.apache.jackrabbit.test.api.lock.OpenScopedLockTest#testRefreshNotLive
- org.apache.jackrabbit.test.api.lock.OpenScopedLockTest#testIsLockOwningSession
- org.apache.jackrabbit.test.api.lock.OpenScopedLockTest#testUnlockByOtherSession
- org.apache.jackrabbit.test.api.lock.OpenScopedLockTest#testGetSecondsRemainingAfterUnlock
-
- org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testIsSessionScoped
- org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testRefreshNotLive
- org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testIsLockOwningSession
- org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testUnlockByOtherSession
- org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testGetSecondsRemainingAfterUnlock
org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testImplicitUnlock
org.apache.jackrabbit.test.api.lock.SessionScopedLockTest#testImplicitUnlock2
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java?rev=1518066&r1=1518065&r2=1518066&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java Wed Aug 28 04:05:58 2013
@@ -21,6 +21,7 @@ import static com.google.common.collect.
import static com.google.common.collect.Sets.newTreeSet;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -44,11 +45,13 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.jcr.delegate.AccessControlManagerDelegator;
import org.apache.jackrabbit.oak.jcr.delegate.JackrabbitAccessControlManagerDelegator;
+import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.PrincipalManagerDelegator;
import org.apache.jackrabbit.oak.jcr.delegate.PrivilegeManagerDelegator;
import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.UserManagerDelegator;
import org.apache.jackrabbit.oak.jcr.observation.ObservationManagerImpl;
+import org.apache.jackrabbit.oak.jcr.operation.SessionOperation;
import org.apache.jackrabbit.oak.jcr.security.AccessManager;
import org.apache.jackrabbit.oak.namepath.LocalNameMapper;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
@@ -65,6 +68,8 @@ import org.apache.jackrabbit.oak.spi.sec
import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Instances of this class are passed to all JCR implementation classes
@@ -74,6 +79,10 @@ import org.apache.jackrabbit.oak.spi.xml
*/
public class SessionContext implements NamePathMapper {
+ /** Logger instance */
+ private static final Logger log =
+ LoggerFactory.getLogger(SessionContext.class);
+
private final RepositoryImpl repository;
private final Whiteboard whiteboard;
private final Map<String, Object> attributes;
@@ -352,13 +361,45 @@ public class SessionContext implements N
//-----------------------------------------------------------< internal >---
void dispose() {
- getWorkspace().getLockManager().unlockAllSessionScopedLocks();
+ try {
+ unlockAllSessionScopedLocks();
+ } catch (RepositoryException e) {
+ throw new RuntimeException("Unexpected repository error", e);
+ }
if (observationManager != null) {
observationManager.dispose();
}
namespaces.clear();
}
+ /**
+ * Unlocks all existing session-scoped locks (if any). Used for cleanup
+ * when a session is being closed.
+ *
+ * @throws RepositoryException if an unexpected problem occurs
+ */
+ // TODO: should this be in SessionImpl?
+ private void unlockAllSessionScopedLocks() throws RepositoryException {
+ delegate.perform(new SessionOperation<Void>() {
+ @Override
+ public Void perform() throws RepositoryException {
+ Iterator<String> iterator = sessionScopedLocks.iterator();
+ while (iterator.hasNext()) {
+ NodeDelegate node = delegate.getNode(iterator.next());
+ if (node != null) {
+ try {
+ node.unlock(); // TODO: use a single commit
+ } catch (RepositoryException e) {
+ log.warn("Failed to unlock a session scoped lock", e);
+ }
+ }
+ iterator.remove();
+ }
+ return null;
+ }
+ });
+ }
+
@Nonnull
private <T> T getConfig(Class<T> clss) {
return repository.getSecurityProvider().getConfiguration(clss);
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java?rev=1518066&r1=1518065&r2=1518066&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java Wed Aug 28 04:05:58 2013
@@ -61,7 +61,6 @@ public class WorkspaceImpl implements Ja
private final SessionContext sessionContext;
private final SessionDelegate sessionDelegate;
private final QueryManagerImpl queryManager;
- private final LockManagerImpl lockManager;
private final VersionManagerImpl versionManager;
private final ReadWriteNodeTypeManager nodeTypeManager;
@@ -69,7 +68,6 @@ public class WorkspaceImpl implements Ja
this.sessionContext = sessionContext;
this.sessionDelegate = sessionContext.getSessionDelegate();
this.queryManager = new QueryManagerImpl(sessionContext);
- this.lockManager = new LockManagerImpl(sessionContext);
this.versionManager = new VersionManagerImpl(sessionContext);
this.nodeTypeManager = new ReadWriteNodeTypeManager() {
@Override
@@ -182,8 +180,8 @@ public class WorkspaceImpl implements Ja
}
@Override
- public LockManagerImpl getLockManager() {
- return lockManager;
+ public LockManager getLockManager() {
+ return new LockManagerImpl(sessionContext);
}
@Override
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java?rev=1518066&r1=1518065&r2=1518066&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java Wed Aug 28 04:05:58 2013
@@ -16,7 +16,6 @@
*/
package org.apache.jackrabbit.oak.jcr.lock;
-import java.util.Iterator;
import java.util.Set;
import javax.annotation.Nonnull;
@@ -32,8 +31,6 @@ import org.apache.jackrabbit.oak.jcr.Ses
import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
import org.apache.jackrabbit.oak.jcr.operation.SessionOperation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Simple lock manager implementation that just keeps track of a set of lock
@@ -42,10 +39,6 @@ import org.slf4j.LoggerFactory;
*/
public class LockManagerImpl implements LockManager {
- /** Logger instance */
- private static final Logger log =
- LoggerFactory.getLogger(LockManagerImpl.class);
-
private final SessionContext sessionContext;
private final SessionDelegate delegate;
@@ -187,33 +180,6 @@ public class LockManagerImpl implements
});
}
- public void unlockAllSessionScopedLocks() {
- try {
- perform(new SessionOperation<Void>() {
- @Override
- public Void perform() throws RepositoryException {
- SessionDelegate delegate = sessionContext.getSessionDelegate();
- Iterator<String> iterator =
- sessionContext.getSessionScopedLocks().iterator();
- while (iterator.hasNext()) {
- NodeDelegate node = delegate.getNode(iterator.next());
- if (node != null) {
- try {
- node.unlock();
- } catch (RepositoryException e) {
- log.warn("Failed to clean up a session scoped lock", e);
- }
- }
- iterator.remove();
- }
- return null;
- }
- });
- } catch (RepositoryException e) {
- log.warn("Unexpected repository exception", e);
- }
- }
-
private <T> T perform(SessionOperation<T> operation)
throws RepositoryException {
return delegate.perform(operation);