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 ju...@apache.org on 2013/11/12 21:52:30 UTC

svn commit: r1541230 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/ oak-jcr/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/j...

Author: jukka
Date: Tue Nov 12 20:52:30 2013
New Revision: 1541230

URL: http://svn.apache.org/r1541230
Log:
OAK-901: Test root node type is not reported correctly

Track the declaring node type in the pre-compiled lists of named and
residual item definitions, so we can filter them per type. This fixes
the problem where NodeTypeImpl.getDeclared*Definitions() would return
also inherited definitions, not just those declared in that node type.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd
    jackrabbit/oak/trunk/oak-jcr/pom.xml
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeDefinitionTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java Tue Nov 12 20:52:30 2013
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.nodetype;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Lists.newArrayList;
 import static javax.jcr.PropertyType.UNDEFINED;
 import static org.apache.jackrabbit.JcrConstants.NT_BASE;
 
@@ -43,6 +44,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 /**
@@ -225,15 +227,12 @@ public class EffectiveNodeType {
      */
     @Nonnull
     public Iterable<PropertyDefinition> getNamedPropertyDefinitions(
-            final String oakName) {
-        return Iterables.concat(Iterables.transform(
-                nodeTypes.values(),
-                new Function<NodeTypeImpl, Iterable<PropertyDefinition>>() {
-                    @Override
-                    public Iterable<PropertyDefinition> apply(NodeTypeImpl input) {
-                        return input.getDeclaredNamedPropertyDefinitions(oakName);
-                    }
-                }));
+            String oakName) {
+        List<PropertyDefinition> definitions = newArrayList();
+        for (NodeTypeImpl type : nodeTypes.values()) {
+            definitions.addAll(type.getDeclaredNamedPropertyDefinitions(oakName));
+        }
+        return definitions;
     }
 
     /**
@@ -243,14 +242,11 @@ public class EffectiveNodeType {
      */
     @Nonnull
     public Iterable<NodeDefinition> getResidualNodeDefinitions() {
-        return Iterables.concat(Iterables.transform(
-                nodeTypes.values(),
-                new Function<NodeTypeImpl, Iterable<NodeDefinition>>() {
-                    @Override
-                    public Iterable<NodeDefinition> apply(NodeTypeImpl input) {
-                        return input.getDeclaredResidualNodeDefinitions();
-                    }
-                }));
+        List<NodeDefinition> definitions = newArrayList();
+        for (NodeTypeImpl type : nodeTypes.values()) {
+            definitions.addAll(type.getDeclaredResidualNodeDefinitions());
+        }
+        return definitions;
     }
 
     /**
@@ -260,14 +256,11 @@ public class EffectiveNodeType {
      */
     @Nonnull
     public Iterable<PropertyDefinition> getResidualPropertyDefinitions() {
-        return Iterables.concat(Iterables.transform(
-                nodeTypes.values(),
-                new Function<NodeTypeImpl, Iterable<PropertyDefinition>>() {
-                    @Override
-                    public Iterable<PropertyDefinition> apply(NodeTypeImpl input) {
-                        return input.getDeclaredResidualPropertyDefinitions();
-                    }
-                }));
+        List<PropertyDefinition> definitions = newArrayList();
+        for (NodeTypeImpl type : nodeTypes.values()) {
+            definitions.addAll(type.getDeclaredResidualPropertyDefinitions());
+        }
+        return definitions;
     }
 
     public void checkSetProperty(PropertyState property) throws RepositoryException {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java Tue Nov 12 20:52:30 2013
@@ -55,7 +55,7 @@ public interface NodeTypeConstants exten
 
     String RESIDUAL_NAME = "*";
 
-    // Precompiled Oak type information fields
+    // Pre-compiled Oak type information fields
     String OAK_SUPERTYPES = "oak:supertypes";
     String OAK_PRIMARY_SUBTYPES = "oak:primarySubtypes";
     String OAK_MIXIN_SUBTYPES = "oak:mixinSubtypes";
@@ -63,21 +63,20 @@ public interface NodeTypeConstants exten
     String OAK_MANDATORY_CHILD_NODES = "oak:mandatoryChildNodes";
     String OAK_PROTECTED_PROPERTIES = "oak:protectedProperties";
     String OAK_PROTECTED_CHILD_NODES = "oak:protectedChildNodes";
-    String OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES =
-            "oak:hasProtectedResidualProperties";
-    String OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES =
-            "oak:hasProtectedResidualChildNodes";
-    String OAK_NAMED_SINGLE_VALUED_PROPERTIES =
-            "oak:namedSingleValuedProperties";
-    String OAK_RESIDUAL_CHILD_NODE_DEFINITIONS =
-            "oak:residualChildNodeDefinitions";
-    String OAK_NAMED_CHILD_NODE_DEFINITIONS =
-            "oak:namedChildNodeDefinitions";
-    String OAK_RESIDUAL_PROPERTY_DEFINITIONS =
-            "oak:residualPropertyDefinitions";
-    String OAK_NAMED_PROPERTY_DEFINITIONS =
-            "oak:namedPropertyDefinitions";
+    String OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES = "oak:hasProtectedResidualProperties";
+    String OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES = "oak:hasProtectedResidualChildNodes";
+    String OAK_NAMED_SINGLE_VALUED_PROPERTIES = "oak:namedSingleValuedProperties";
+    String OAK_RESIDUAL_CHILD_NODE_DEFINITIONS = "oak:residualChildNodeDefinitions";
+    String OAK_NAMED_CHILD_NODE_DEFINITIONS = "oak:namedChildNodeDefinitions";
+    String OAK_RESIDUAL_PROPERTY_DEFINITIONS = "oak:residualPropertyDefinitions";
+    String OAK_NAMED_PROPERTY_DEFINITIONS = "oak:namedPropertyDefinitions";
     String OAK_PROPERTY_DEFINITIONS = "oak:propertyDefinitions";
+    String OAK_PROPERTY_DEFINITION = "oak:propertyDefinition";
     String OAK_CHILD_NODE_DEFINITIONS = "oak:childNodeDefinitions";
+    String OAK_CHILD_NODE_DEFINITION = "oak:childNodeDefinition";
+    String OAK_DECLARING_NODE_TYPE = "oak:declaringNodeType";
+    String OAK_PRIMARY_TYPE = "oak:primaryType";
+    String OAK_MIXIN_TYPES = "oak:mixinTypes";
+    String OAK_UUID = "oak:uuid";
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java Tue Nov 12 20:52:30 2013
@@ -23,7 +23,6 @@ import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -50,16 +49,17 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
 import org.apache.jackrabbit.oak.plugins.nodetype.constraint.Constraints;
+import org.apache.jackrabbit.oak.util.TreeUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Lists.newArrayList;
+import static java.util.Collections.emptyList;
 import static org.apache.jackrabbit.JcrConstants.JCR_CHILDNODEDEFINITION;
 import static org.apache.jackrabbit.JcrConstants.JCR_HASORDERABLECHILDNODES;
 import static org.apache.jackrabbit.JcrConstants.JCR_ISMIXIN;
@@ -72,6 +72,14 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_IS_ABSTRACT;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_IS_QUERYABLE;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_DECLARING_NODE_TYPE;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_TYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_CHILD_NODE_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_PROPERTY_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_TYPE;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_CHILD_NODE_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_PROPERTY_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_UUID;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.RESIDUAL_NAME;
 
 /**
@@ -507,70 +515,68 @@ class NodeTypeImpl extends AbstractTypeD
         return definitions;
     }
 
-    Iterable<PropertyDefinition> getDeclaredNamedPropertyDefinitions(String oakName) {
-        Tree named = definition.getChild("oak:namedPropertyDefinitions");
-        if (named.exists()) {
-            String escapedName;
-            if (JCR_PRIMARYTYPE.equals(oakName)) {
-                escapedName = "oak:primaryType";
-            } else if (JCR_MIXINTYPES.equals(oakName)) {
-                escapedName = "oak:mixinTypes";
-            } else if (JCR_UUID.equals(oakName)) {
-                escapedName = "oak:uuid";
-            } else {
-                escapedName = oakName;
-            }
-            Tree definitions = named.getChild(escapedName);
-            return Iterables.transform(
-                    definitions.getChildren(),
-                    new Function<Tree, PropertyDefinition>() {
-                        @Override
-                        public PropertyDefinition apply(Tree input) {
-                            return new PropertyDefinitionImpl(
-                                    input, NodeTypeImpl.this, mapper);
-                        }
-                    });
-        }
-        return Collections.emptyList();
-    }
-
-    Iterable<PropertyDefinition> getDeclaredResidualPropertyDefinitions() {
-        Tree definitions = definition.getChild("oak:residualPropertyDefinitions");
-        return Iterables.transform(
-                definitions.getChildren(),
-                new Function<Tree, PropertyDefinition>() {
-                    @Override
-                    public PropertyDefinition apply(Tree input) {
-                        return new PropertyDefinitionImpl(
-                                input, NodeTypeImpl.this, mapper);
-                    }
-                });
-    }
-
-    Iterable<NodeDefinition> getDeclaredNamedNodeDefinitions(String oakName) {
-        Tree definitions = definition.getChild("oak:namedChildNodeDefinitions").getChild(oakName);
-        return Iterables.transform(
-                definitions.getChildren(),
-                new Function<Tree, NodeDefinition>() {
-                    @Override
-                    public NodeDefinition apply(Tree input) {
-                        return new NodeDefinitionImpl(
-                                input, NodeTypeImpl.this, mapper);
-                    }
-                });
+    List<PropertyDefinition> getDeclaredNamedPropertyDefinitions(String oakName) {
+        String escapedName = oakName;
+        if (JCR_PRIMARYTYPE.equals(oakName)) {
+            escapedName = OAK_PRIMARY_TYPE;
+        } else if (JCR_MIXINTYPES.equals(oakName)) {
+            escapedName = OAK_MIXIN_TYPES;
+        } else if (JCR_UUID.equals(oakName)) {
+            escapedName = OAK_UUID;
+        }
+        return getDeclaredPropertyDefs(definition
+                .getChild(OAK_NAMED_PROPERTY_DEFINITIONS)
+                .getChild(escapedName));
+    }
+
+    List<PropertyDefinition> getDeclaredResidualPropertyDefinitions() {
+        return getDeclaredPropertyDefs(definition
+                .getChild(OAK_RESIDUAL_PROPERTY_DEFINITIONS));
+    }
+
+    List<NodeDefinition> getDeclaredNamedNodeDefinitions(String oakName) {
+        return getDeclaredNodeDefs(definition
+                .getChild(OAK_NAMED_CHILD_NODE_DEFINITIONS)
+                .getChild(oakName));
+    }
+
+    List<NodeDefinition> getDeclaredResidualNodeDefinitions() {
+        return getDeclaredNodeDefs(definition
+                .getChild(OAK_RESIDUAL_CHILD_NODE_DEFINITIONS));
+    }
+
+    private List<PropertyDefinition> getDeclaredPropertyDefs(Tree definitions) {
+        if (definitions.exists()) {
+            List<PropertyDefinition> list = newArrayList();
+            String typeName = getOakName();
+            for (Tree def : definitions.getChildren()) {
+                String declaringTypeName =
+                        TreeUtil.getName(def, OAK_DECLARING_NODE_TYPE);
+                if (typeName.equals(declaringTypeName)) {
+                    list.add(new PropertyDefinitionImpl(def, this, mapper));
+                }
+            }
+            return list;
+        } else {
+            return emptyList();
+        }
     }
 
-    Iterable<NodeDefinition> getDeclaredResidualNodeDefinitions() {
-        Tree definitions = definition.getChild("oak:residualChildNodeDefinitions");
-        return Iterables.transform(
-                definitions.getChildren(),
-                new Function<Tree, NodeDefinition>() {
-                    @Override
-                    public NodeDefinition apply(Tree input) {
-                        return new NodeDefinitionImpl(
-                                input, NodeTypeImpl.this, mapper);
-                    }
-                });
+    private List<NodeDefinition> getDeclaredNodeDefs(Tree defs) {
+        if (defs.exists()) {
+            List<NodeDefinition> list = newArrayList();
+            String typeName = getOakName();
+            for (Tree def : defs.getChildren()) {
+                String declaringTypeName =
+                        TreeUtil.getName(def, OAK_DECLARING_NODE_TYPE);
+                if (typeName.equals(declaringTypeName)) {
+                    list.add(new NodeDefinitionImpl(def, this, mapper));
+                }
+            }
+            return list;
+        } else {
+            return emptyList();
+        }
     }
 
     //--------------------------------------------------------------------------

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java Tue Nov 12 20:52:30 2013
@@ -44,15 +44,20 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
 import static org.apache.jackrabbit.oak.api.Type.STRING;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_CHILD_NODE_DEFINITION;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_CHILD_NODE_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_DECLARING_NODE_TYPE;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MANDATORY_CHILD_NODES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MANDATORY_PROPERTIES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_SUBTYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_TYPES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_CHILD_NODE_DEFINITIONS;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_SINGLE_VALUED_PROPERTIES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_PROPERTY_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_TYPE;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROPERTY_DEFINITION;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROPERTY_DEFINITIONS;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_CHILD_NODES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_PROPERTIES;
@@ -60,6 +65,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_PROPERTY_DEFINITIONS;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_SUBTYPES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_SUPERTYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_UUID;
 
 import java.util.Collections;
 import java.util.LinkedHashSet;
@@ -254,9 +260,9 @@ class RegistrationEditor extends Default
         for (String childNodeName : type.getChildNodeNames()) {
             NodeState definition = type.child(childNodeName).getNodeState();
             if (childNodeName.startsWith(JCR_PROPERTYDEFINITION)) {
-                validateAndCompilePropertyDefinition(type, definition);
+                validateAndCompilePropertyDefinition(type, name, definition);
             } else if (childNodeName.startsWith(JCR_CHILDNODEDEFINITION)) {
-                validateAndCompileChildNodeDefinition(types, type, definition);
+                validateAndCompileChildNodeDefinition(types, type, name, definition);
             }
         }
     }
@@ -271,7 +277,7 @@ class RegistrationEditor extends Default
     }
 
     private void validateAndCompilePropertyDefinition(
-            NodeBuilder type, NodeState definition)
+            NodeBuilder type, String typeName, NodeState definition)
             throws CommitFailedException {
         // - jcr:name (NAME) protected 
         PropertyState name = definition.getProperty(JCR_NAME);
@@ -281,11 +287,11 @@ class RegistrationEditor extends Default
             propertyName = name.getValue(NAME);
             String escapedName = propertyName;
             if (JCR_PRIMARYTYPE.equals(escapedName)) {
-                escapedName = "oak:primaryType";
+                escapedName = OAK_PRIMARY_TYPE;
             } else if (JCR_MIXINTYPES.equals(escapedName)) {
-                escapedName = "oak:mixinTypes";
+                escapedName = OAK_MIXIN_TYPES;
             } else if (JCR_UUID.equals(escapedName)) {
-                escapedName = "oak:uuid";
+                escapedName = OAK_UUID;
             }
             definitions = type.child(OAK_NAMED_PROPERTY_DEFINITIONS);
             definitions.setProperty(
@@ -332,12 +338,14 @@ class RegistrationEditor extends Default
             addNameToList(type, OAK_NAMED_SINGLE_VALUED_PROPERTIES, propertyName);
         }
 
-        definitions.setChildNode(key, definition);
+        definitions.setChildNode(key, definition)
+            .setProperty(JCR_PRIMARYTYPE, OAK_PROPERTY_DEFINITION, NAME)
+            .setProperty(OAK_DECLARING_NODE_TYPE, typeName, NAME);
     }
 
     private void validateAndCompileChildNodeDefinition(
-            NodeBuilder types, NodeBuilder type, NodeState definition)
-            throws CommitFailedException {
+            NodeBuilder types, NodeBuilder type, String typeName,
+            NodeState definition) throws CommitFailedException {
         // - jcr:name (NAME) protected 
         PropertyState name = definition.getProperty(JCR_NAME);
         NodeBuilder definitions;
@@ -378,7 +386,9 @@ class RegistrationEditor extends Default
                             "Constraint", 33,
                             "Unknown required primary type " + key);
                 } else if (!definitions.hasChildNode(key)) {
-                    definitions.setChildNode(key, definition);
+                    definitions.setChildNode(key, definition)
+                        .setProperty(JCR_PRIMARYTYPE, OAK_CHILD_NODE_DEFINITION, NAME)
+                        .setProperty(OAK_DECLARING_NODE_TYPE, typeName, NAME);
                 }
             }
         }

Modified: jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd Tue Nov 12 20:52:30 2013
@@ -444,26 +444,23 @@
   + oak:namedChildNodeDefinitions (oak:namedChildNodeDefinitions) = oak:namedChildNodeDefinitions protected mandatory
   + oak:residualChildNodeDefinitions (oak:childNodeDefinitions) = oak:childNodeDefinitions protected mandatory
 
-/**
- * @since oak 1.0
- */
 [oak:namedPropertyDefinitions]
   + * (oak:propertyDefinitions) = oak:propertyDefinitions protected
 
-/**
- * @since oak 1.0
- */
 [oak:propertyDefinitions]
-  + * (nt:propertyDefinition) = nt:propertyDefinition protected
+  + * (oak:propertyDefinition) = oak:propertyDefinition protected
+
+[oak:propertyDefinition] > nt:propertyDefinition
+  - oak:declaringNodeType (NAME) protected mandatory
 
 [oak:namedChildNodeDefinitions]
   + * (oak:childNodeDefinitions) = oak:childNodeDefinitions protected
 
-/**
- * @since oak 1.0
- */
 [oak:childNodeDefinitions]
-  + * (nt:childNodeDefinition) = nt:childNodeDefinition protected
+  + * (oak:childNodeDefinition) = oak:childNodeDefinition protected
+
+[oak:childNodeDefinition] > nt:childNodeDefinition
+  - oak:declaringNodeType (NAME) protected mandatory
 
 /**
  * This node type used to store a property definition within a node type definition,

Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Nov 12 20:52:30 2013
@@ -75,6 +75,10 @@
 
       <!-- Observation -->
       org.apache.jackrabbit.test.api.observation.GetIdentifierTest#testNodeMoved  <!-- Move in 2nd session not reflected in nodes of 1st session -->
+      org.apache.jackrabbit.test.api.observation.NodeReorderTest#testNodeReorderAddRemove          <!-- Uses SNS -->
+      org.apache.jackrabbit.test.api.observation.NodeReorderTest#testNodeReorderSameName           <!-- Uses SNS -->
+      org.apache.jackrabbit.test.api.observation.NodeReorderTest#testNodeReorderSameNameWithRemove <!-- Uses SNS -->
+      org.apache.jackrabbit.core.observation.ReorderTest                                           <!-- Uses SNS -->
 
       <!-- Versioning -->
       org.apache.jackrabbit.test.api.version.VersionTest#testUpdate
@@ -170,7 +174,6 @@
       org.apache.jackrabbit.core.query.SQL2OrderByTest#testOrderByScore                              <!-- JCR-3677 -->
 
       <!-- Node Types -->
-      org.apache.jackrabbit.oak.jcr.nodetype.NodeDefinitionTest#testRootType                         <!-- OAK-901 -->
       org.apache.jackrabbit.oak.jcr.nodetype.MixinTest#testRemoveAddMixVersionable1                  <!-- OAK-1118 -->
 
     </known.issues>

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeDefinitionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeDefinitionTest.java?rev=1541230&r1=1541229&r2=1541230&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeDefinitionTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeDefinitionTest.java Tue Nov 12 20:52:30 2013
@@ -30,7 +30,6 @@ import javax.jcr.nodetype.PropertyDefini
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class NodeDefinitionTest extends AbstractJCRTest {
@@ -102,9 +101,9 @@ public class NodeDefinitionTest extends 
     }
 
     @Test
-    @Ignore("OAK-901")
     public void testRootType() throws RepositoryException {
         assertEquals(testNodeTypeTestRoot, testRootNode.getDefinition()
                 .getDeclaringNodeType().getName());
     }
+
 }
\ No newline at end of file