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