You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2011/12/13 15:23:07 UTC
svn commit: r1213707 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/version/
test/java/org/apache/jackrabbit/core/version/
Author: reschke
Date: Tue Dec 13 14:23:07 2011
New Revision: 1213707
URL: http://svn.apache.org/viewvc?rev=1213707&view=rev
Log:
JCR-2930: same named child nodes disappear on restore
fix restore logic to take SNS into account
Added:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/TestAll.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java?rev=1213707&r1=1213706&r2=1213707&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java Tue Dec 13 14:23:07 2011
@@ -16,11 +16,7 @@
*/
package org.apache.jackrabbit.core.version;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import javax.jcr.ItemExistsException;
import javax.jcr.PropertyType;
@@ -473,6 +469,19 @@ abstract public class VersionManagerImpl
// need to sync with state manager
state.store();
+ // create a map that contains a int->NodeStateEx mapping for each child name
+ Map<Name, Map<Integer, NodeStateEx>> entryToNodeStateExMapping = new HashMap<Name, Map<Integer, NodeStateEx>>();
+ for (ChildNodeEntry entry : state.getState().getChildNodeEntries()) {
+ Map<Integer, NodeStateEx> id2stateMap = entryToNodeStateExMapping
+ .get(entry.getName());
+ if (id2stateMap == null) {
+ id2stateMap = new HashMap<Integer, NodeStateEx>();
+ }
+ id2stateMap.put(entry.getIndex(),
+ state.getNode(entry.getName(), entry.getIndex()));
+ entryToNodeStateExMapping.put(entry.getName(), id2stateMap);
+ }
+
// For each child node C present on F:
// - F will never have a child node with an OPV of IGNORE, INITIALIZE,
// COMPUTE or ABORT (see 15.2 Check-In: Creating a Version).
@@ -494,7 +503,12 @@ abstract public class VersionManagerImpl
InternalFrozenNode f = (InternalFrozenNode) child;
// if node is present, remove it
- state.removeNode(entry.getName(), entry.getIndex());
+ Map<Integer, NodeStateEx> id2stateMap = entryToNodeStateExMapping
+ .get(entry.getName());
+ if (id2stateMap != null
+ && id2stateMap.containsKey(entry.getIndex())) {
+ state.removeNode(id2stateMap.get(entry.getIndex()));
+ }
// check for existing
if (f.getFrozenId() != null) {
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java?rev=1213707&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java Tue Dec 13 14:23:07 2011
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.version;
+
+import javax.jcr.Node;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
+
+import org.apache.jackrabbit.test.AbstractJCRTest;
+
+/**
+ * Test case for JCR-2930
+ */
+public class RestoreNodeWithSNSTest extends AbstractJCRTest {
+
+ public void testRestoreWithSNS() throws Exception {
+
+ int childCount = 5;
+
+ // create a test node with /childCount/ children with the same name
+ Node n = testRootNode.addNode(nodeName1);
+ n.addMixin(mixVersionable);
+ for (int i = 0; i < childCount; i++) {
+ Node child = n.addNode(nodeName2);
+ child.setProperty("name", nodeName2 + i);
+ }
+ testRootNode.getSession().save();
+
+ // check the number of children
+ assertEquals(childCount, n.getNodes().getSize());
+
+ VersionManager vm = testRootNode.getSession().getWorkspace()
+ .getVersionManager();
+ vm.checkin(n.getPath());
+
+ // modify one child
+ vm.checkout(n.getPath());
+ n.getNode(nodeName2).setProperty("name", "modified");
+ testRootNode.getSession().save();
+
+ // check the number of children again
+ assertEquals(childCount, n.getNodes().getSize());
+
+ // restore base versiob
+ Version baseVersion = vm.getBaseVersion(n.getPath());
+ vm.restore(baseVersion, true);
+
+ n.getSession().refresh(false);
+
+ // check the number of children again
+ assertEquals(childCount, n.getNodes().getSize());
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RestoreNodeWithSNSTest.java
------------------------------------------------------------------------------
svn:executable = *
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/TestAll.java?rev=1213707&r1=1213706&r2=1213707&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/TestAll.java Tue Dec 13 14:23:07 2011
@@ -36,6 +36,7 @@ public class TestAll extends TestCase {
suite.addTestSuite(InternalVersionHistoryImplTest.class);
suite.addTestSuite(RemoveVersionLabelTest.class);
suite.addTestSuite(RestoreTest.class);
+ suite.addTestSuite(RestoreNodeWithSNSTest.class);
suite.addTestSuite(VersionIteratorImplTest.class);
return suite;
}