You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2007/09/05 17:54:41 UTC

svn commit: r572978 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: SessionImpl.java lock/LockManager.java lock/LockManagerImpl.java lock/XAEnvironment.java lock/XALockManager.java

Author: stefan
Date: Wed Sep  5 08:54:41 2007
New Revision: 572978

URL: http://svn.apache.org/viewvc?rev=572978&view=rev
Log:
JCR-1104: JSR 283 support (work in progress...)

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=572978&r1=572977&r2=572978&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Wed Sep  5 08:54:41 2007
@@ -52,6 +52,7 @@
 import javax.jcr.Workspace;
 import javax.jcr.Property;
 import javax.jcr.lock.LockException;
+import javax.jcr.lock.Lock;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.observation.EventListener;
@@ -1539,6 +1540,28 @@
             return true;
         } catch (PathNotFoundException pnfe) {
             return false;
+        }
+    }
+
+    /**
+     * Returns all locks owned by this session.
+     *
+     * @return an array of <code>Lock</code>s
+     * @since JCR 2.0
+     */
+    public Lock[] getLocks() {
+        // check sanity of this session
+        //sanityCheck();
+        if (!alive) {
+            log.error("failed to retrieve locks: session has been closed");
+            return new Lock[0];
+        }
+
+        try {
+            return getLockManager().getLocks(this);
+        } catch (RepositoryException e) {
+            log.error("Lock manager not available.", e);
+            return new Lock[0];
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java?rev=572978&r1=572977&r2=572978&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManager.java Wed Sep  5 08:54:41 2007
@@ -55,6 +55,15 @@
     Lock getLock(NodeImpl node) throws LockException, RepositoryException;
 
     /**
+     * Returns all locks owned by the specified session.
+     * @param session session
+     * @return an array of lock objects
+     * @throws RepositoryException if an error occurs
+     * @see SessionImpl#getLocks
+     */
+    Lock[] getLocks(SessionImpl session) throws RepositoryException;
+
+    /**
      * Removes the lock on a node given by its path.
      * @param node node
      * @throws LockException if this node is not locked or the session

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java?rev=572978&r1=572977&r2=572978&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java Wed Sep  5 08:54:41 2007
@@ -364,6 +364,26 @@
     }
 
     /**
+     * Package-private low-level helper method returning all
+     * <code>AbstractLockInfo</code>s associated with the specified
+     * session.
+     * @param session session
+     * @return an array of <code>AbstractLockInfo</code>s
+     */
+    AbstractLockInfo[] getLockInfos(final SessionImpl session) {
+        final ArrayList infos = new ArrayList();
+        lockMap.traverse(new PathMap.ElementVisitor() {
+            public void elementVisited(PathMap.Element element) {
+                LockInfo info = (LockInfo) element.get();
+                if (info.isLive() && info.getLockHolder().equals(session)) {
+                    infos.add(info);
+                }
+            }
+        }, false);
+        return (AbstractLockInfo[]) infos.toArray(new AbstractLockInfo[infos.size()]);
+    }
+
+    /**
      * Return the most appropriate lock information for a node. This is either
      * the lock info for the node itself, if it is locked, or a lock info for one
      * of its parents, if that is deep locked.
@@ -428,6 +448,28 @@
             }
         } catch (ItemNotFoundException e) {
             throw new LockException("Node not locked: " + node.safeGetJCRPath());
+        } finally {
+            release();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Lock[] getLocks(SessionImpl session) throws RepositoryException {
+
+        acquire();
+
+        AbstractLockInfo infos[] = getLockInfos(session);
+
+        try {
+            Lock[] locks = new Lock[infos.length];
+            for (int i = 0; i < infos.length; i++) {
+                AbstractLockInfo info = infos[i];
+                Node holder = (Node) session.getItemManager().getItem(info.getId());
+                locks[i] = new LockImpl(info, holder);
+            }
+            return locks;
         } finally {
             release();
         }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java?rev=572978&r1=572977&r2=572978&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XAEnvironment.java Wed Sep  5 08:54:41 2007
@@ -25,6 +25,7 @@
 
 import javax.jcr.RepositoryException;
 import javax.jcr.lock.LockException;
+import javax.jcr.lock.Lock;
 import javax.transaction.Status;
 import java.util.Map;
 import java.util.HashMap;
@@ -208,6 +209,33 @@
         }
         // ask parent
         return lockMgr.getLockInfo(id);
+    }
+
+    /**
+     * Returns all <code>AbstractLockInfo</code>s associated with the specified
+     * session.
+     * @param session session
+     * @return an array of <code>AbstractLockInfo</code>s
+     * @throws RepositoryException if an error occurs
+     */
+    public AbstractLockInfo[] getLockInfos(SessionImpl session)
+            throws RepositoryException {
+        ArrayList result = new ArrayList();
+
+        // get lock infos from global lock manager first
+        AbstractLockInfo[] infos = lockMgr.getLockInfos(session);
+        for (int i = 0; i < infos.length; i++) {
+            AbstractLockInfo info = infos[i];
+            // check negative set
+            if (!unlockedNodesMap.containsKey(info.getId())) {
+                result.add(info);
+            }
+        }
+
+        // add 'uncommitted' lock infos 
+        result.addAll(lockedNodesMap.values());
+
+        return (AbstractLockInfo[]) result.toArray(new AbstractLockInfo[result.size()]);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java?rev=572978&r1=572977&r2=572978&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java Wed Sep  5 08:54:41 2007
@@ -27,6 +27,7 @@
 import javax.jcr.Session;
 import javax.jcr.lock.Lock;
 import javax.jcr.lock.LockException;
+import java.util.ArrayList;
 
 /**
  * Session-local lock manager that implements the semantical changes inside
@@ -91,6 +92,27 @@
         SessionImpl session = (SessionImpl) node.getSession();
         NodeImpl holder = (NodeImpl) session.getItemManager().getItem(info.getId());
         return new XALock(this, info, holder);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Lock[] getLocks(SessionImpl session) throws RepositoryException {
+        AbstractLockInfo[] infos;
+        if (isInXA()) {
+            infos = xaEnv.getLockInfos(session);
+        } else {
+            infos = lockMgr.getLockInfos(session);
+        }
+
+        XALock[] locks = new XALock[infos.length];
+
+        for (int i = 0; i < infos.length; i++) {
+            AbstractLockInfo info = infos[i];
+            NodeImpl holder = (NodeImpl) session.getItemManager().getItem(info.getId());
+            locks[i] = new XALock(this, info, holder);
+        }
+        return locks;
     }
 
     /**