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 2006/05/26 11:31:01 UTC

svn commit: r409609 - in /jackrabbit/branches/1.0/jackrabbit/src: main/java/org/apache/jackrabbit/core/NodeImpl.java main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java

Author: jukka
Date: Fri May 26 02:31:01 2006
New Revision: 409609

URL: http://svn.apache.org/viewvc?rev=409609&view=rev
Log:
1.0: Merged revisions 398968 and 405417: JCR-423

Modified:
    jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java
    jackrabbit/branches/1.0/jackrabbit/src/test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java

Modified: jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=409609&r1=409608&r2=409609&view=diff
==============================================================================
--- jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri May 26 02:31:01 2006
@@ -3796,14 +3796,17 @@
             }
         }
 
-        // first delete all non frozen version histories (i.e. all OPV=Copy)
+        // first delete some of the version histories
         NodeIterator iter = getNodes();
         while (iter.hasNext()) {
             NodeImpl n = (NodeImpl) iter.nextNode();
-            if (!freeze.hasFrozenHistory(n.internalGetUUID())) {
-                if (n.getDefinition().getOnParentVersion() == OnParentVersionAction.COPY
-                        || n.getDefinition().getOnParentVersion() == OnParentVersionAction.VERSION) {
-                    // only remove OPV=Copy or OPV=Version nodes
+            if (n.getDefinition().getOnParentVersion() == OnParentVersionAction.COPY) {
+                // only remove OPV=Copy nodes
+                n.internalRemove(true);
+            } else if (n.getDefinition().getOnParentVersion() == OnParentVersionAction.VERSION) {
+                // only remove, if node to be restored does not contain child
+                UUID vhUUID = new UUID(n.getProperty(QName.JCR_VERSIONHISTORY).getString());
+                if (!freeze.hasFrozenHistory(vhUUID)) {
                     n.internalRemove(true);
                 }
             }
@@ -3843,18 +3846,18 @@
                 // check if representing versionable already exists somewhere
                 if (itemMgr.itemExists(nodeId)) {
                     NodeImpl n = session.getNodeById(nodeId);
-                    if (n.getParent().isSame(this)) {
-                        // so order at end
-                        // orderBefore(n.getName(), "");
-                    } else if (removeExisting) {
+                    if (removeExisting) {
                         session.move(n.getPath(), getPath() + "/" + n.getName());
+                    } else if (n.getParent().isSame(this)) {
+                        n.internalRemove(true);
                     } else {
                         // since we delete the OPV=Copy children beforehand, all
                         // found nodes must be outside of this tree
                         throw new ItemExistsException("Unable to restore node, item already exists outside of restored tree: "
                                 + n.safeGetJCRPath());
                     }
-                } else {
+                }
+                if (!itemMgr.itemExists(nodeId)) {
                     // get desired version from version selector
                     AbstractVersion v = (AbstractVersion) vsel.select(history);
                     NodeImpl node = addNode(child.getName(), v.getFrozenNode());

Modified: jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java?rev=409609&r1=409608&r2=409609&view=diff
==============================================================================
--- jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java (original)
+++ jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java Fri May 26 02:31:01 2006
@@ -70,6 +70,11 @@
     private PropertyState[] frozenProperties;
 
     /**
+     * the frozen child nodes
+     */
+    private InternalFreeze[] frozenNodes = null;
+
+    /**
      * the frozen uuid of the original node
      */
     private UUID frozenUUID = null;
@@ -160,21 +165,25 @@
     /**
      * {@inheritDoc}
      */
-    public InternalFreeze[] getFrozenChildNodes() throws VersionException {
-        try {
-            // maybe add iterator?
-            List entries = node.getState().getChildNodeEntries();
-            InternalFreeze[] freezes = new InternalFreeze[entries.size()];
-            Iterator iter = entries.iterator();
-            int i = 0;
-            while (iter.hasNext()) {
-                NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry) iter.next();
-                freezes[i++] = (InternalFreeze) vMgr.getItem(entry.getId());
+    public synchronized InternalFreeze[] getFrozenChildNodes()
+            throws VersionException {
+        if (frozenNodes == null) {
+            try {
+                // maybe add iterator?
+                List entries = node.getState().getChildNodeEntries();
+                frozenNodes = new InternalFreeze[entries.size()];
+                Iterator iter = entries.iterator();
+                int i = 0;
+                while (iter.hasNext()) {
+                    NodeState.ChildNodeEntry entry =
+                            (NodeState.ChildNodeEntry) iter.next();
+                    frozenNodes[i++] = (InternalFreeze) vMgr.getItem(entry.getId());
+                }
+            } catch (RepositoryException e) {
+                throw new VersionException("Unable to retrieve frozen child nodes", e);
             }
-            return freezes;
-        } catch (RepositoryException e) {
-            throw new VersionException("Unable to retrieve frozen child nodes", e);
         }
+        return frozenNodes;
     }
 
     /**
@@ -183,9 +192,13 @@
     public boolean hasFrozenHistory(UUID uuid) {
         try {
             NodeId id = new NodeId(uuid);
-            NodeState.ChildNodeEntry entry  = node.getState().getChildNodeEntry(id);
-            if (entry != null) {
-                return vMgr.getItem(id) instanceof InternalFrozenVersionHistory;
+            InternalFreeze[] frozen = getFrozenChildNodes();
+            for (int i=0; i<frozen.length; i++) {
+                if (frozen[i] instanceof InternalFrozenVersionHistory &&
+                    ((InternalFrozenVersionHistory) frozen[i])
+                            .getVersionHistoryId().equals(id)) {
+                    return true;
+                }
             }
         } catch (RepositoryException e) {
             // ignore

Modified: jackrabbit/branches/1.0/jackrabbit/src/test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.0/jackrabbit/src/test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java?rev=409609&r1=409608&r2=409609&view=diff
==============================================================================
--- jackrabbit/branches/1.0/jackrabbit/src/test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java (original)
+++ jackrabbit/branches/1.0/jackrabbit/src/test/java/org/apache/jackrabbit/test/api/version/RestoreTest.java Fri May 26 02:31:01 2006
@@ -277,4 +277,24 @@
             // success
         }
     }
+
+    public void testRestorChild1() throws RepositoryException {
+        versionableNode.addNode("child1");
+        versionableNode.save();
+        Version v1 = versionableNode.checkin();
+        versionableNode.checkout();
+        Version v2 = versionableNode.checkin();
+
+        versionableNode.restore(v1, true);
+        assertTrue("Node.restore('1.2') must not remove child node.", versionableNode.hasNode("child1"));
+
+        versionableNode.restore(version, true);
+        assertFalse("Node.restore('1.0') must remove child node.", versionableNode.hasNode("child1"));
+
+        try {
+            versionableNode.restore(v2, true);
+        } catch (RepositoryException e) {
+            fail("Node.restore('1.3') must fail.");
+        }
+    }
 }