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 an...@apache.org on 2015/12/16 09:37:22 UTC

svn commit: r1720300 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ oa...

Author: angela
Date: Wed Dec 16 08:37:21 2015
New Revision: 1720300

URL: http://svn.apache.org/viewvc?rev=1720300&view=rev
Log:
OAK-3775 :  Inconsistency between Node.getPrimaryType and Node.isNodeType

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/package-info.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/package-info.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeProvider.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeProvider.java Wed Dec 16 08:37:21 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.nodetype;
 
+import java.util.Iterator;
+import javax.annotation.Nonnull;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -44,6 +46,21 @@ public interface EffectiveNodeTypeProvid
 
     /**
      * Returns {@code true} if {@code typeName} is of the specified primary node
+     * type or mixin type, or a subtype thereof. Returns {@code false} otherwise.
+     *
+     * @param primaryTypeName  the internal oak name of the node to test
+     * @param mixinTypes the internal oak names of the node to test.
+     * @param nodeTypeName The internal oak name of the node type to be tested.
+     * @return {@code true} if the specified node type is of the given node type.
+     * @throws NoSuchNodeTypeException If the specified node type name doesn't
+     * refer to an existing node type.
+     * @throws RepositoryException If the given node type name is invalid or if
+     * some other error occurs.
+     */
+    boolean isNodeType(@Nonnull String primaryTypeName, @Nonnull Iterator<String> mixinTypes, @Nonnull String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException;
+
+    /**
+     * Returns {@code true} if {@code typeName} is of the specified primary node
      * type or mixin type, or a subtype thereof. Returns {@code false} otherwise.
      *
      * @param typeName  the internal oak name of the node type to test

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java Wed Dec 16 08:37:21 2015
@@ -25,6 +25,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.REP_SUPERTYPES;
 
+import java.util.Iterator;
 import java.util.List;
 
 import javax.annotation.CheckForNull;
@@ -54,6 +55,9 @@ import org.apache.jackrabbit.oak.api.Typ
 import org.apache.jackrabbit.oak.namepath.NameMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
+import org.apache.jackrabbit.oak.plugins.tree.TreeFactory;
+import org.apache.jackrabbit.oak.util.TreeUtil;
 
 /**
  * Base implementation of a {@link NodeTypeManager} with support for reading
@@ -278,6 +282,25 @@ public abstract class ReadOnlyNodeTypeMa
         return false;
     }
 
+    @Override
+    public boolean isNodeType(@CheckForNull String primaryTypeName, @Nonnull Iterator<String> mixinTypes,
+                              @Nonnull String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException {
+        // shortcut
+        if (JcrConstants.NT_BASE.equals(nodeTypeName)) {
+            return true;
+        }
+        Tree types = getTypes();
+        if (primaryTypeName != null && isa(types, primaryTypeName, nodeTypeName)) {
+            return true;
+        }
+        while (mixinTypes.hasNext()) {
+            if (isa(types, mixinTypes.next(), nodeTypeName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private static boolean isa(Tree types, String typeName, String superName) {
         if (typeName.equals(superName)) {
             return true;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/package-info.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/package-info.java Wed Dec 16 08:37:21 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.1.0")
+@Version("2.0.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.nodetype;
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/package-info.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/package-info.java Wed Dec 16 08:37:21 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0")
+@Version("1.1.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.nodetype.write;
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java Wed Dec 16 08:37:21 2015
@@ -874,16 +874,7 @@ public class NodeImpl<T extends NodeDele
             @Override
             public NodeType perform() throws RepositoryException {
                 Tree tree = node.getTree();
-
-                String primaryTypeName = null;
-                if (tree.hasProperty(JcrConstants.JCR_PRIMARYTYPE)) {
-                    primaryTypeName = TreeUtil.getPrimaryTypeName(tree);
-                } else if (tree.getStatus() != Status.NEW) {
-                    // OAK-2441: for backwards compatibility with Jackrabbit 2.x try to
-                    // read the primary type from the underlying node state.
-                    primaryTypeName = TreeUtil.getPrimaryTypeName(RootFactory.createReadOnlyRoot(sessionDelegate.getRoot()).getTree(tree.getPath()));
-                }
-
+                String primaryTypeName = getPrimaryTypeName(tree);
                 if (primaryTypeName != null) {
                     return getNodeTypeManager().getNodeType(sessionContext.getJcrName(primaryTypeName));
                 } else {
@@ -905,17 +896,7 @@ public class NodeImpl<T extends NodeDele
             public NodeType[] perform() throws RepositoryException {
                 Tree tree = node.getTree();
 
-                Iterator<String> mixinNames = Iterators.emptyIterator();
-                if (tree.hasProperty(JcrConstants.JCR_MIXINTYPES) || canReadProperty(tree, JcrConstants.JCR_MIXINTYPES)) {
-                    mixinNames = TreeUtil.getNames(tree, JcrConstants.JCR_MIXINTYPES).iterator();
-                } else if (tree.getStatus() != Status.NEW) {
-                    // OAK-2441: for backwards compatibility with Jackrabbit 2.x try to
-                    // read the primary type from the underlying node state.
-                    mixinNames = TreeUtil.getNames(
-                            RootFactory.createReadOnlyRoot(sessionDelegate.getRoot()).getTree(tree.getPath()),
-                            JcrConstants.JCR_MIXINTYPES).iterator();
-                }
-
+                Iterator<String> mixinNames = getMixinTypeNames(tree);
                 if (mixinNames.hasNext()) {
                     NodeTypeManager ntMgr = getNodeTypeManager();
                     List<NodeType> mixinTypes = Lists.newArrayList();
@@ -937,7 +918,8 @@ public class NodeImpl<T extends NodeDele
             @Nonnull
             @Override
             public Boolean perform() throws RepositoryException {
-                return getNodeTypeManager().isNodeType(node.getTree(), oakName);
+                Tree tree = node.getTree();
+                return getNodeTypeManager().isNodeType(getPrimaryTypeName(tree), getMixinTypeNames(tree), oakName);
             }
         });
     }
@@ -1281,6 +1263,34 @@ public class NodeImpl<T extends NodeDele
     }
 
     //------------------------------------------------------------< internal >---
+    @CheckForNull
+    private String getPrimaryTypeName(@Nonnull Tree tree) {
+        String primaryTypeName = null;
+        if (tree.hasProperty(JcrConstants.JCR_PRIMARYTYPE)) {
+            primaryTypeName = TreeUtil.getPrimaryTypeName(tree);
+        } else if (tree.getStatus() != Status.NEW) {
+            // OAK-2441: for backwards compatibility with Jackrabbit 2.x try to
+            // read the primary type from the underlying node state.
+            primaryTypeName = TreeUtil.getPrimaryTypeName(RootFactory.createReadOnlyRoot(sessionDelegate.getRoot()).getTree(tree.getPath()));
+        }
+        return primaryTypeName;
+    }
+
+    @Nonnull
+    private Iterator<String> getMixinTypeNames(@Nonnull Tree tree) throws RepositoryException {
+        Iterator<String> mixinNames = Iterators.emptyIterator();
+        if (tree.hasProperty(JcrConstants.JCR_MIXINTYPES) || canReadProperty(tree, JcrConstants.JCR_MIXINTYPES)) {
+            mixinNames = TreeUtil.getNames(tree, JcrConstants.JCR_MIXINTYPES).iterator();
+        } else if (tree.getStatus() != Status.NEW) {
+            // OAK-2441: for backwards compatibility with Jackrabbit 2.x try to
+            // read the primary type from the underlying node state.
+            mixinNames = TreeUtil.getNames(
+                    RootFactory.createReadOnlyRoot(sessionDelegate.getRoot()).getTree(tree.getPath()),
+                    JcrConstants.JCR_MIXINTYPES).iterator();
+        }
+        return mixinNames;
+    }
+
     private boolean canReadProperty(@Nonnull Tree tree, @Nonnull String propName) throws RepositoryException {
         String propPath = PathUtils.concat(tree.getPath(), propName);
         String permName = Permissions.PERMISSION_NAMES.get(Permissions.READ_PROPERTY);

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java?rev=1720300&r1=1720299&r2=1720300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java Wed Dec 16 08:37:21 2015
@@ -21,6 +21,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.test.api.util.Text;
 
@@ -113,4 +114,71 @@ public class ReadNodeTypeTest extends Ab
         NodeType[] mixins = newNode.getMixinNodeTypes();
         assertEquals(0, mixins.length);
     }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-3775">OAK-3775</a>
+     */
+    public void testIsNodeType() throws Exception {
+        superuser.getNode(path).addMixin(JcrConstants.MIX_LOCKABLE);
+        superuser.save();
+
+        deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+        Node n = testSession.getNode(path);
+        assertFalse(n.hasProperty(JcrConstants.JCR_PRIMARYTYPE));
+
+        assertTrue(n.isNodeType(superuser.getNode(path).getPrimaryNodeType().getName()));
+        assertTrue(n.isNodeType(JcrConstants.MIX_LOCKABLE));
+    }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-3775">OAK-3775</a>
+     */
+    public void testIsNodeTypeNewNode() throws Exception {
+        superuser.getNode(path).addMixin(JcrConstants.MIX_LOCKABLE);
+        superuser.save();
+        deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+        testSession.getNode(path).remove();
+        Node newNode = testSession.getNode(testRoot).addNode(Text.getName(path));
+
+        assertTrue(newNode.isNodeType(superuser.getNode(path).getPrimaryNodeType().getName()));
+        assertTrue(newNode.isNodeType(testNodeType));
+        assertFalse(newNode.isNodeType(JcrConstants.MIX_LOCKABLE));
+    }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-3775">OAK-3775</a>
+     */
+    public void testIsNodeTypeAddNewNode() throws Exception {
+        allow(path, privilegesFromName(PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT));
+        deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+        Node newNode = testSession.getNode(path).addNode("child", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        assertTrue(newNode.isNodeType(NodeTypeConstants.NT_OAK_UNSTRUCTURED));
+    }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-3775">OAK-3775</a>
+     */
+    public void testIsReferenceable()  throws Exception {
+        superuser.getNode(path).addMixin(JcrConstants.MIX_REFERENCEABLE);
+        superuser.save();
+        deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+        Node n = testSession.getNode(path);
+        assertTrue(n.isNodeType(JcrConstants.MIX_REFERENCEABLE));
+    }
+
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/OAK-3775">OAK-3775</a>
+     */
+    public void testIsVersionable()  throws Exception {
+        superuser.getNode(path).addMixin(JcrConstants.MIX_VERSIONABLE);
+        superuser.save();
+        deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+        Node n = testSession.getNode(path);
+        assertTrue(n.isNodeType(JcrConstants.MIX_VERSIONABLE));
+    }
 }
\ No newline at end of file