Author: mreutegg
Date: Tue Mar  1 12:54:35 2016
New Revision: 1733061

URL: http://svn.apache.org/viewvc?rev=1733061&view=rev
Log:
OAK-4077: Reregister node type may not update definition correctly

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java?rev=1733061&r1=1733060&r2=1733061&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java
 Tue Mar  1 12:54:35 2016
@@ -182,7 +182,7 @@ class NodeTypeTemplateImpl extends Named
         int index = 1;
         if (itemDefTemplates != null) {
             for (ItemDefinitionTemplate template : itemDefTemplates) {
-                String name = (index == 1) ? nodeName : nodeName + '[' + index 
+ ']';
+                String name = nodeName(nodeName, index);
                 tree = nodeTypeTree.getChild(name);
                 if (!tree.exists()) {
                     tree = nodeTypeTree.addChild(name);
@@ -193,13 +193,17 @@ class NodeTypeTemplateImpl extends Named
                 index++;
             }
         }
-        tree = nodeTypeTree.getChild(nodeName + '[' + index++ + ']');
+        tree = nodeTypeTree.getChild(nodeName(nodeName, index++));
         while (tree.exists()) {
             tree.remove();
-            tree = nodeTypeTree.getChild(nodeName + '[' + index++ + ']');
+            tree = nodeTypeTree.getChild(nodeName(nodeName, index++));
         }
     }
 
+    private static String nodeName(String name, int index) {
+        return (index == 1) ? name : name + '[' + index + ']';
+    }
+
     //------------------------------------------------------------< public >--
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java?rev=1733061&r1=1733060&r2=1733061&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
 Tue Mar  1 12:54:35 2016
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.jcr.no
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertFalse;
 
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -40,7 +41,6 @@ import org.apache.jackrabbit.JcrConstant
 import org.apache.jackrabbit.commons.cnd.CndImporter;
 import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
 import org.apache.jackrabbit.oak.jcr.AbstractRepositoryTest;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class NodeTypeTest extends AbstractRepositoryTest {
@@ -244,7 +244,6 @@ public class NodeTypeTest extends Abstra
         session.save();
     }
 
-    @Ignore("OAK-4077")
     @Test
     public void removeMandatoryProperty() throws Exception {
         Session session = getAdminSession();
@@ -281,6 +280,47 @@ public class NodeTypeTest extends Abstra
 
         // now we should be able to remove the property
         n.getProperty("test:mandatory").remove();
+        session.save();
+    }
+
+    @Test
+    public void removeMandatoryPropertyFlag() throws Exception {
+        Session session = getAdminSession();
+        Node root = session.getRootNode();
+        NodeTypeManager manager = session.getWorkspace().getNodeTypeManager();
+
+        String cnd = "<'test'='http://www.apache.org/jackrabbit/test'>\n" +
+                "[test:MyType] > nt:unstructured\n" +
+                " - test:mandatory (string) mandatory";
+
+        CndImporter.registerNodeTypes(new StringReader(cnd), session);
+
+        Node n = root.addNode("test", "test:MyType");
+        n.setProperty("test:mandatory", "value");
+        session.save();
+
+        try {
+            n.getProperty("test:mandatory").remove();
+            session.save();
+            fail("Must fail with ConstraintViolationException");
+        } catch (ConstraintViolationException e) {
+            // expected
+            session.refresh(false);
+        }
+
+        // remove the mandatory property flag
+        cnd = "<'test'='http://www.apache.org/jackrabbit/test'>\n" +
+                "[test:MyType] > nt:unstructured\n" +
+                " - test:mandatory (string)";
+        CndImporter.registerNodeTypes(new StringReader(cnd), session, true);
+
+        // check node type
+        NodeTypeDefinition ntd = manager.getNodeType("test:MyType");
+        assertEquals(1, ntd.getDeclaredPropertyDefinitions().length);
+        assertFalse(ntd.getDeclaredPropertyDefinitions()[0].isMandatory());
+
+        // now we should be able to remove the property
+        n.getProperty("test:mandatory").remove();
         session.save();
     }
 }


Reply via email to