You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2016/05/19 08:00:06 UTC

svn commit: r1744527 - in /jackrabbit/oak/branches/1.2: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/ oak-jcr/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/ oak-jcr/src/test/resources/org/apache/jackrabbit/oak...

Author: tomekr
Date: Thu May 19 08:00:06 2016
New Revision: 1744527

URL: http://svn.apache.org/viewvc?rev=1744527&view=rev
Log:
OAK-4085: Malformed node type definition when reregistered after upgrade

Merge revision 1733875 from trunk

Added:
    jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/UpgradeTest.java
    jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/
    jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/test-repo-1.0.zip
Modified:
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
    jackrabbit/oak/branches/1.2/oak-jcr/pom.xml

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java?rev=1744527&r1=1744526&r2=1744527&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java Thu May 19 08:00:06 2016
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.nodetype.write;
 
+import static com.google.common.collect.Iterables.filter;
 import static org.apache.jackrabbit.JcrConstants.JCR_CHILDNODEDEFINITION;
 import static org.apache.jackrabbit.JcrConstants.JCR_HASORDERABLECHILDNODES;
 import static org.apache.jackrabbit.JcrConstants.JCR_ISMIXIN;
@@ -46,6 +47,7 @@ import javax.jcr.nodetype.NodeTypeTempla
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.nodetype.PropertyDefinitionTemplate;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 
 import org.apache.jackrabbit.oak.api.Tree;
@@ -176,12 +178,16 @@ class NodeTypeTemplateImpl extends Named
 
     private static void writeItemDefinitions(@Nonnull Tree nodeTypeTree, @CheckForNull List<? extends ItemDefinitionTemplate> itemDefTemplates,
                                              @Nonnull String nodeName, @Nonnull String primaryTypeName) throws RepositoryException {
-        Tree tree;
+        // first remove existing
+        for (Tree t : filter(nodeTypeTree.getChildren(), new SameNamePredicate(nodeName))) {
+            t.remove();
+        }
+        // now write definitions
         int index = 1;
         if (itemDefTemplates != null) {
             for (ItemDefinitionTemplate template : itemDefTemplates) {
-                String name = (index == 1) ? nodeName : nodeName + '[' + index + ']';
-                tree = nodeTypeTree.getChild(name);
+                String name = nodeName(nodeName, index);
+                Tree tree = nodeTypeTree.getChild(name);
                 if (!tree.exists()) {
                     tree = nodeTypeTree.addChild(name);
                     tree.setProperty(
@@ -191,10 +197,24 @@ class NodeTypeTemplateImpl extends Named
                 index++;
             }
         }
-        tree = nodeTypeTree.getChild(nodeName + '[' + index++ + ']');
-        while (tree.exists()) {
-            tree.remove();
-            tree = nodeTypeTree.getChild(nodeName + '[' + index++ + ']');
+    }
+
+    private static String nodeName(String name, int index) {
+        return (index == 1) ? name : name + '[' + index + ']';
+    }
+
+    private static final class SameNamePredicate implements Predicate<Tree> {
+
+        private final String name;
+
+        private SameNamePredicate(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public boolean apply(Tree t) {
+            String s = t.getName();
+            return s.equals(name) || s.startsWith(name + "[");
         }
     }
 
@@ -306,4 +326,4 @@ class NodeTypeTemplateImpl extends Named
         return String.format("NodeTypeTemplate(%s)", getOakName());
     }
 
-}
\ No newline at end of file
+}

Modified: jackrabbit/oak/branches/1.2/oak-jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-jcr/pom.xml?rev=1744527&r1=1744526&r2=1744527&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/branches/1.2/oak-jcr/pom.xml Thu May 19 08:00:06 2016
@@ -356,5 +356,16 @@
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
     </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>net.lingala.zip4j</groupId>
+      <artifactId>zip4j</artifactId>
+      <version>1.3.2</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>

Added: jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/UpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/UpgradeTest.java?rev=1744527&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/UpgradeTest.java (added)
+++ jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/UpgradeTest.java Thu May 19 08:00:06 2016
@@ -0,0 +1,119 @@
+/*
+ * 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.oak.jcr.nodetype;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.StringReader;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.nodetype.PropertyDefinition;
+
+import com.google.common.collect.Iterators;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentStore;
+import org.junit.Test;
+
+import net.lingala.zip4j.core.ZipFile;
+
+import static org.apache.jackrabbit.oak.plugins.segment.file.FileStore.newFileStore;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class UpgradeTest {
+
+    @Test
+    public void upgradeFrom10() throws Exception {
+        File testFolder = new File(new File("target"), UpgradeTest.class.getSimpleName());
+        File repoHome = new File(testFolder, "test-repo-1.0");
+        repoHome.delete();
+        File tmpZip = File.createTempFile("test-repo", null);
+        IOUtils.copy(NodeTypeTest.class.getResourceAsStream("test-repo-1.0.zip"),
+                new FileOutputStream(tmpZip));
+        ZipFile repoZip = new ZipFile(tmpZip);
+        repoZip.extractAll(testFolder.getPath());
+        tmpZip.delete();
+
+        SegmentStore store = newFileStore(repoHome).create();
+        Repository repo = new Jcr(new SegmentNodeStore(store)).createRepository();
+        Session s = repo.login(new SimpleCredentials("admin", "admin".toCharArray()));
+
+        Node myType = s.getNode("/jcr:system/jcr:nodeTypes/test:MyType");
+        assertEquals(2, Iterators.size(myType.getNodes("jcr:propertyDefinition")));
+
+        NodeTypeManager ntMgr = s.getWorkspace().getNodeTypeManager();
+        assertTrue(ntMgr.hasNodeType("test:MyType"));
+        NodeType nt = ntMgr.getNodeType("test:MyType");
+        PropertyDefinition[] pDefs = nt.getDeclaredPropertyDefinitions();
+        assertEquals(2, pDefs.length);
+        for (PropertyDefinition pd : pDefs) {
+            String name = pd.getName();
+            if (name.equals("test:mandatory")) {
+                assertTrue(pd.isMandatory());
+            } else if (name.equals("test:optional")) {
+                assertFalse(pd.isMandatory());
+            } else {
+                fail("Unexpected property definition: " + name);
+            }
+        }
+
+        // flip mandatory flag for test:mandatory
+        String cnd = "<'test'='http://www.apache.org/jackrabbit/test'>\n" +
+                "[test:MyType] > nt:unstructured\n" +
+                " - test:mandatory (string)\n" +
+                " - test:optional (string)";
+
+        CndImporter.registerNodeTypes(new StringReader(cnd), s, true);
+
+        myType = s.getNode("/jcr:system/jcr:nodeTypes/test:MyType");
+        assertEquals(2, Iterators.size(myType.getNodes("jcr:propertyDefinition")));
+
+        nt = ntMgr.getNodeType("test:MyType");
+        pDefs = nt.getDeclaredPropertyDefinitions();
+        assertEquals(2, pDefs.length);
+        for (PropertyDefinition pd : pDefs) {
+            String name = pd.getName();
+            if (name.equals("test:mandatory")) {
+                assertFalse(pd.isMandatory());
+            } else if (name.equals("test:optional")) {
+                assertFalse(pd.isMandatory());
+            } else {
+                fail("Unexpected property definition: " + name);
+            }
+        }
+
+        s.logout();
+        if (repo instanceof JackrabbitRepository) {
+            ((JackrabbitRepository) repo).shutdown();
+        }
+        store.close();
+    }
+}

Added: jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/test-repo-1.0.zip
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/test-repo-1.0.zip?rev=1744527&view=auto
==============================================================================
Binary files jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/test-repo-1.0.zip (added) and jackrabbit/oak/branches/1.2/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/nodetype/test-repo-1.0.zip Thu May 19 08:00:06 2016 differ