You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2009/06/02 14:36:44 UTC

svn commit: r781017 - in /jackrabbit/trunk: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logg...

Author: angela
Date: Tue Jun  2 12:36:43 2009
New Revision: 781017

URL: http://svn.apache.org/viewvc?rev=781017&view=rev
Log:
JCR-2004: Update SPI locking to match JCR 2.0

Modified:
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/SessionInfoLogger.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/SessionInfoImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java Tue Jun  2 12:36:43 2009
@@ -93,7 +93,7 @@
      *
      * @see javax.jcr.lock.LockManager#getLockTokens()
      */
-    public String[] getLockTokens() {
+    public String[] getLockTokens() throws RepositoryException {
         return lockStateMgr.getLockTokens();
     }
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Tue Jun  2 12:36:43 2009
@@ -463,7 +463,12 @@
      * @see javax.jcr.Session#getLockTokens()
      */
     public String[] getLockTokens() {
-        return getLockStateManager().getLockTokens();
+        try {
+            return getLockStateManager().getLockTokens();
+        } catch (RepositoryException e) {
+            log.warn("Unable to retrieve lock tokens for this session. (" + e.getMessage() + ")");            
+            return new String[0];
+        }
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Tue Jun  2 12:36:43 2009
@@ -100,7 +100,6 @@
 import javax.jcr.ItemExistsException;
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.MergeException;
-import javax.jcr.Session;
 import javax.jcr.ReferentialIntegrityException;
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.version.VersionException;
@@ -211,15 +210,15 @@
         return service.getWorkspaceNames(sessionInfo);
     }
 
-    public IdFactory getIdFactory() throws RepositoryException {
+    public IdFactory getIdFactory() {
         return idFactory;
     }
 
-    public NameFactory getNameFactory() throws RepositoryException {
+    public NameFactory getNameFactory() {
         return nameFactory;
     }
 
-    public PathFactory getPathFactory() throws RepositoryException {
+    public PathFactory getPathFactory()  {
         return pathFactory;
     }
 
@@ -231,44 +230,42 @@
         return service.getLockInfo(sessionInfo, nodeId);
     }
 
-    public String[] getLockTokens() {
+    /**
+     * Returns the lock tokens present with the <code>SessionInfo</code>.
+     *
+     * @return lock tokens present with the <code>SessionInfo</code>.
+     * @throws UnsupportedRepositoryOperationException
+     * @throws RepositoryException
+     * @see org.apache.jackrabbit.spi.SessionInfo#getLockTokens() 
+     */
+    public String[] getLockTokens() throws UnsupportedRepositoryOperationException, RepositoryException {
         return sessionInfo.getLockTokens();
     }
 
     /**
-     * This method always succeeds.
-     * This is not compliant to the requirements for {@link Session#addLockToken(String)}
-     * as defined by JSR170, which defines that at most one single <code>Session</code>
-     * may contain the same lock token. However, with SPI it is not possible
-     * to determine, whether another session holds the lock, nor can the client
-     * determine, which lock this token belongs to. The latter would be
-     * necessary in order to build the 'Lock' object properly.
+     * This method succeeds if the lock tokens could be added to the
+     * <code>SessionInfo</code>.
      *
      * @param lt
+     * @throws UnsupportedRepositoryOperationException
      * @throws LockException
      * @throws RepositoryException
+     * @see SessionInfo#addLockToken(String)
      */
-    public void addLockToken(String lt) throws LockException, RepositoryException {
+    public void addLockToken(String lt) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
         sessionInfo.addLockToken(lt);
-        /*
-        // TODO: JSR170 defines that a token can be present with one session only.
-        //       however, we cannot find out about another session holding the lock.
-        //       and neither knows the server, which session is holding a lock token.
-        */
     }
 
     /**
-     * Tries to remove the given token from the <code>SessionInfo</code>. If the
-     * SessionInfo does not contains the specified token, this method returns
-     * silently.<br>
-     * Note, that any restriction regarding removal of lock tokens must be asserted
-     * before this method is called.
+     * Tries to remove the given token from the <code>SessionInfo</code>.
      *
      * @param lt
+     * @throws UnsupportedRepositoryOperationException
      * @throws LockException
      * @throws RepositoryException
+     * @see SessionInfo#removeLockToken(String)
      */
-    public void removeLockToken(String lt) throws LockException, RepositoryException {
+    public void removeLockToken(String lt) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
         String[] tokems = sessionInfo.getLockTokens();
         for (int i = 0; i < tokems.length; i++) {
             if (tokems[i].equals(lt)) {
@@ -278,7 +275,7 @@
         }
         // sessionInfo doesn't contain the given lock token and is therefore
         // not the lock holder
-        throw new RepositoryException("Unable to remove locktoken '" + lt + "' from Session.");
+        throw new LockException("Unable to remove locktoken '" + lt + "' from Session.");
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java Tue Jun  2 12:36:43 2009
@@ -33,7 +33,6 @@
 import org.apache.jackrabbit.spi.LockInfo;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
-import org.apache.jackrabbit.spi.commons.conversion.PathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,6 +41,7 @@
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.lock.Lock;
 import javax.jcr.lock.LockException;
 import java.util.HashMap;
@@ -192,7 +192,7 @@
      *
      * @see LockStateManager#getLockTokens()
      */
-    public String[] getLockTokens() {
+    public String[] getLockTokens() throws UnsupportedRepositoryOperationException, RepositoryException {
         return wspManager.getLockTokens();
     }
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java Tue Jun  2 12:36:43 2009
@@ -114,7 +114,7 @@
      * @return The lock tokens associated with the <code>Session</code> this
      * lock manager has been created for.
      */
-    public String[] getLockTokens();
+    public String[] getLockTokens() throws RepositoryException;
 
     /**
      * Invoked by a session to inform that a lock token has been added.

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/SessionInfoLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/SessionInfoLogger.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/SessionInfoLogger.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/SessionInfoLogger.java Tue Jun  2 12:36:43 2009
@@ -18,6 +18,8 @@
 
 import org.apache.jackrabbit.spi.SessionInfo;
 
+import javax.jcr.RepositoryException;
+
 /**
  * Log wrapper for a {@link SessionInfo}.
  */
@@ -60,26 +62,26 @@
         }, "getWorkspaceName()", new Object[]{});
     }
 
-    public String[] getLockTokens() {
-        return (String[]) execute(new SafeCallable() {
-            public Object call() {
+    public String[] getLockTokens() throws RepositoryException {
+        return (String[]) execute(new Callable() {
+            public Object call() throws RepositoryException {
                 return sessionInfo.getLockTokens();
             }
         }, "getLockTokens()", new Object[]{});
     }
 
-    public void addLockToken(final String lockToken) {
-        execute(new SafeCallable() {
-            public Object call() {
+    public void addLockToken(final String lockToken) throws RepositoryException {
+        execute(new Callable() {
+            public Object call() throws RepositoryException {
                 sessionInfo.addLockToken(lockToken);
                 return null;
             }
         }, "addLockToken(String)", new Object[]{lockToken});
     }
 
-    public void removeLockToken(final String lockToken) {
-        execute(new SafeCallable() {
-            public Object call() {
+    public void removeLockToken(final String lockToken) throws RepositoryException {
+        execute(new Callable() {
+            public Object call() throws RepositoryException {
                 sessionInfo.removeLockToken(lockToken);
                 return null;
             }

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java Tue Jun  2 12:36:43 2009
@@ -16,6 +16,10 @@
  */
 package org.apache.jackrabbit.spi;
 
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.LockException;
+
 /**
  * <code>SessionInfo</code> is created upon
  * {@link RepositoryService#obtain(javax.jcr.Credentials, String)} or
@@ -51,8 +55,10 @@
      * Returns the lock tokens present on this <code>SessionInfo</code>.
      *
      * @return lock tokens present on this <code>SessionInfo</code>.
+     * @throws UnsupportedRepositoryOperationException If locking is not supported.
+     * @throws RepositoryException If another error occurs.
      */
-    public String[] getLockTokens();
+    public String[] getLockTokens() throws UnsupportedRepositoryOperationException, RepositoryException;
 
     /**
      * Add the given lock token to this <code>SessionInfo</code>. The token will
@@ -60,8 +66,12 @@
      * lock identified by the given token.
      *
      * @param lockToken to be added.
+     * @param lockToken
+     * @throws UnsupportedRepositoryOperationException If locking is not supported.
+     * @throws LockException If the token cannot be added.
+     * @throws RepositoryException If another error occurs.
      */
-    public void addLockToken(String lockToken);
+    public void addLockToken(String lockToken) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
 
     /**
      * Removes the given lock token from this <code>SessionInfo</code>.
@@ -72,6 +82,9 @@
      * with LockException provided the lock hasn't been released.
      *
      * @param lockToken to be removed.
+     * @throws UnsupportedRepositoryOperationException If locking is not supported.
+     * @throws LockException If the token cannot be removed.
+     * @throws RepositoryException If another error occurs.
      */
-    public void removeLockToken(String lockToken);
+    public void removeLockToken(String lockToken) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
 }

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java Tue Jun  2 12:36:43 2009
@@ -380,10 +380,15 @@
     }
 
     private static void addIfHeader(SessionInfo sInfo, HttpMethod method) {
-        String[] locktokens = sInfo.getLockTokens();
-        if (locktokens != null && locktokens.length > 0) {
-            IfHeader ifH = new IfHeader(locktokens);
-            method.setRequestHeader(ifH.getHeaderName(), ifH.getHeaderValue());
+        try {
+            String[] locktokens = sInfo.getLockTokens();
+            if (locktokens != null && locktokens.length > 0) {
+                IfHeader ifH = new IfHeader(locktokens);
+                method.setRequestHeader(ifH.getHeaderName(), ifH.getHeaderValue());
+            }
+        } catch (RepositoryException e) {
+            // should never get here
+            log.error("Unable to retrieve lock tokens: omitted from request header.");
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml Tue Jun  2 12:36:43 2009
@@ -69,7 +69,6 @@
               <value>
                 org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryTest#testReRegisteredNamespaceVisibility
                 org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryTest#testRegisteredNamespaceVisibility
-                org.apache.jackrabbit.test.api.lock.LockManagerTest
                 org.apache.jackrabbit.test.api.observation.GetDateTest
                 org.apache.jackrabbit.test.api.observation.GetIdentifierTest
                 org.apache.jackrabbit.test.api.observation.GetInfoTest

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/SessionInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/SessionInfoImpl.java?rev=781017&r1=781016&r2=781017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/SessionInfoImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/SessionInfoImpl.java Tue Jun  2 12:36:43 2009
@@ -35,6 +35,8 @@
 import javax.jcr.Session;
 import javax.jcr.RepositoryException;
 import javax.jcr.Credentials;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.lock.LockException;
 import java.io.ObjectInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ObjectOutputStream;
@@ -225,21 +227,21 @@
     /**
      * @inheritDoc
      */
-    public String[] getLockTokens() {
-        return session.getLockTokens();
+    public String[] getLockTokens() throws UnsupportedRepositoryOperationException, RepositoryException {
+        return session.getWorkspace().getLockManager().getLockTokens();
     }
 
     /**
      * @inheritDoc
      */
-    public void addLockToken(String lockToken) {
-        session.addLockToken(lockToken);
+    public void addLockToken(String lockToken) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        session.getWorkspace().getLockManager().addLockToken(lockToken);
     }
 
     /**
      * @inheritDoc
      */
-    public void removeLockToken(String lockToken) {
-        session.removeLockToken(lockToken);
+    public void removeLockToken(String lockToken) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        session.getWorkspace().getLockManager().removeLockToken(lockToken);
     }
 }