You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/05/26 14:47:18 UTC

svn commit: r778680 - in /jackrabbit/branches/1.x: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/

Author: jukka
Date: Tue May 26 12:47:17 2009
New Revision: 778680

URL: http://svn.apache.org/viewvc?rev=778680&view=rev
Log:
1.x: Merged revision 778645 (JCR-134)

Added:
    jackrabbit/branches/1.x/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RemoveOrphanVersionHistoryTest.java
      - copied unchanged from r778645, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RemoveOrphanVersionHistoryTest.java
Modified:
    jackrabbit/branches/1.x/   (props changed)
    jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
    jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
    jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
    jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java

Propchange: jackrabbit/branches/1.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 26 12:47:17 2009
@@ -1 +1 @@
-/jackrabbit/trunk:770143-773197,773483,773525-773554,773584,773588,773828,773835-775756,775833,775836,775840,775868,775981,775986,776036,776256,776310,776313,776321-776322,776332,776356-776357,776362,776373,776650-776693,776737,776757,776776-776777,777024,777029,777034,777478,777509,777541,777548,777936
+/jackrabbit/trunk:770143-773197,773483,773525-773554,773584,773588,773828,773835-775756,775833,775836,775840,775868,775981,775986,776036,776256,776310,776313,776321-776322,776332,776356-776357,776362,776373,776650-776693,776737,776757,776776-776777,777024,777029,777034,777478,777509,777541,777548,777936,778645

Modified: jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java?rev=778680&r1=778679&r2=778680&view=diff
==============================================================================
--- jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java (original)
+++ jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java Tue May 26 12:47:17 2009
@@ -40,8 +40,8 @@
 /**
  * Base implementation of the {@link VersionManager} interface.
  * <p/>
- * All read operations must aquire the read lock before reading, all write
- * operations must aquire the write lock.
+ * All read operations must acquire the read lock before reading, all write
+ * operations must acquire the write lock.
  */
 abstract class AbstractVersionManager implements VersionManager {
 
@@ -291,7 +291,7 @@
     /**
      * Returns the item with the given persistent id. Subclass responsibility.
      * <p/>
-     * Please note, that the overridden method must aquire the readlock before
+     * Please note, that the overridden method must acquire the readlock before
      * reading the state manager.
      *
      * @param id the id of the item
@@ -312,18 +312,31 @@
 
     /**
      * Checks if there are item references (from outside the version storage)
-     * that reference the given version item. Subclass responsiblity.
+     * that reference the given node. Subclass responsibility.
      * <p/>
-     * Please note, that the overridden method must aquire the readlock before
+     * Please note, that the overridden method must acquire the readlock before
      * reading the state manager.
      *
-     * @param item version item
+     * @param id the id of the node
      * @return <code>true</code> if there are item references from outside the
      *         version storage; <code>false</code> otherwise.
      * @throws RepositoryException if an error occurs while reading from the
      *                             repository.
      */
-    protected abstract boolean hasItemReferences(InternalVersionItem item)
+    protected abstract boolean hasItemReferences(NodeId id)
+            throws RepositoryException;
+
+    /**
+     * Returns the node with the given persistent id. Subclass responsibility.
+     * <p/>
+     * Please note, that the overridden method must acquire the readlock before
+     * reading the state manager.
+     *
+     * @param id the id of the node
+     * @throws RepositoryException if an error occurs while reading from the
+     *                             repository.
+     */
+    protected abstract NodeStateEx getNodeStateEx(NodeId id)
             throws RepositoryException;
 
     /**

Modified: jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java?rev=778680&r1=778679&r2=778680&view=diff
==============================================================================
--- jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java (original)
+++ jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java Tue May 26 12:47:17 2009
@@ -375,7 +375,7 @@
             throw new VersionException(msg);
         }
         // check if any references (from outside the version storage) exist on this version
-        if (vMgr.hasItemReferences(v)) {
+        if (vMgr.hasItemReferences(v.getId())) {
             throw new ReferentialIntegrityException("Unable to remove version. At least once referenced.");
         }
 
@@ -396,8 +396,25 @@
         nameCache.remove(versionName);
         vMgr.versionDestroyed(v);
 
-        // store changes
-        node.store();
+        // Check if this was the last version in addition to the root version
+        if (!vMgr.hasItemReferences(node.getNodeId())) {
+            log.debug("Current version history has no references");
+            NodeStateEx[] childNodes = node.getChildNodes();
+
+            // Check if there is only root version and version labels nodes
+            if (childNodes.length == 2) {
+                log.debug("Removing orphan version history as it contains only two children");
+                NodeStateEx parentNode = vMgr.getNodeStateEx(node.getParentId());
+                // Remove version history node
+                parentNode.removeNode(node.getName());
+                // store changes for this node and his children
+                parentNode.store();
+            }
+        } else {
+            log.debug("Current version history has at least one reference");
+            // store changes
+            node.store();
+        }
 
         // now also remove from labelCache
         for (int i = 0; i < labels.length; i++) {

Modified: jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java?rev=778680&r1=778679&r2=778680&view=diff
==============================================================================
--- jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (original)
+++ jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java Tue May 26 12:47:17 2009
@@ -411,14 +411,19 @@
     /**
      * {@inheritDoc}
      */
-    protected boolean hasItemReferences(InternalVersionItem item)
+    protected boolean hasItemReferences(NodeId id)
+            throws RepositoryException {
+        return stateMgr.hasNodeReferences(new NodeReferencesId(id));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected NodeStateEx getNodeStateEx(NodeId parentNodeId)
             throws RepositoryException {
         try {
-            NodeReferences refs = stateMgr.getNodeReferences(
-                    new NodeReferencesId(item.getId()));
-            return refs.hasReferences();
-        } catch (NoSuchItemStateException e) {
-            return false;
+            NodeState state = (NodeState) stateMgr.getItemState(parentNodeId);
+            return new NodeStateEx(stateMgr, ntReg, state, null);
         } catch (ItemStateException e) {
             throw new RepositoryException(e);
         }

Modified: jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java?rev=778680&r1=778679&r2=778680&view=diff
==============================================================================
--- jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java (original)
+++ jackrabbit/branches/1.x/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java Tue May 26 12:47:17 2009
@@ -370,9 +370,22 @@
     /**
      * {@inheritDoc}
      */
-    protected boolean hasItemReferences(InternalVersionItem item)
+    protected boolean hasItemReferences(NodeId id)
             throws RepositoryException {
-        return session.getNodeById(item.getId()).getReferences().hasNext();
+        return session.getNodeById(id).getReferences().hasNext();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected NodeStateEx getNodeStateEx(NodeId parentNodeId)
+            throws RepositoryException {
+        try {
+            NodeState state = (NodeState) stateMgr.getItemState(parentNodeId);
+            return new NodeStateEx(stateMgr, ntReg, state, null);
+        } catch (ItemStateException e) {
+            throw new RepositoryException(e);
+        }
     }
 
     /**