Author: angela
Date: Mon Feb 9 16:29:11 2015
New Revision: 1658450
URL: http://svn.apache.org/r1658450
Log:
OAK-2488 : Node.getMixinNodeTypes can revive deleted node mixins
Modified:
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/CRUDTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadNodeTypeTest.java
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=1658450&r1=1658449&r2=1658450&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
Mon Feb 9 16:29:11 2015
@@ -852,12 +852,16 @@ public class NodeImpl<T extends NodeDele
@Override
public NodeType perform() throws RepositoryException {
Tree tree = node.getTree();
- String primaryTypeName = TreeUtil.getPrimaryTypeName(tree);
- if (primaryTypeName == null) {
+
+ 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()));
}
+
if (primaryTypeName != null) {
return
getNodeTypeManager().getNodeType(sessionContext.getJcrName(primaryTypeName));
} else {
@@ -877,10 +881,11 @@ public class NodeImpl<T extends NodeDele
@Override
public NodeType[] perform() throws RepositoryException {
Tree tree = node.getTree();
- Iterator<String> mixinNames;
- if (tree.hasProperty(JcrConstants.JCR_MIXINTYPES)) {
+
+ 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 {
+ } 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(
@@ -1254,6 +1259,11 @@ public class NodeImpl<T extends NodeDele
}
//------------------------------------------------------------< internal
>---
+ 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);
+ return sessionContext.getAccessManager().hasPermissions(propPath,
permName);
+ }
private EffectiveNodeType getEffectiveNodeType() throws
RepositoryException {
return getNodeTypeManager().getEffectiveNodeType(dlg.getTree());
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java?rev=1658450&r1=1658449&r2=1658450&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java
Mon Feb 9 16:29:11 2015
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.jcr;
+import java.util.Arrays;
import java.util.Calendar;
import java.util.TimeZone;
@@ -26,6 +27,7 @@ import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.NodeType;
import org.junit.Test;
@@ -40,6 +42,28 @@ public class CRUDTest extends AbstractRe
super(fixture);
}
+ /**
+ * @see <a
href="https://issues.apache.org/jira/browse/OAK-2488">OAK-2488</a>
+ */
+ @Test
+ public void testMixins() throws Exception {
+ Session session = getAdminSession();
+ String nodename = "mixintest";
+ Node mixinTest = session.getRootNode().addNode(nodename, "nt:folder");
+ NodeType[] types;
+ types = mixinTest.getMixinNodeTypes();
+ assertEquals(Arrays.toString(types), 0, types.length);
+ mixinTest.addMixin("mix:versionable");
+ types = mixinTest.getMixinNodeTypes();
+ assertEquals(Arrays.toString(types), 1, types.length);
+ session.save();
+ mixinTest = session.getRootNode().getNode(nodename);
+ mixinTest.remove();
+ mixinTest = session.getRootNode().addNode(nodename, "nt:folder");
+ types = mixinTest.getMixinNodeTypes();
+ assertEquals(Arrays.toString(types), 0, types.length);
+ }
+
@Test
public void testCRUD() throws RepositoryException {
Session session = getAdminSession();
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=1658450&r1=1658449&r2=1658450&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
Mon Feb 9 16:29:11 2015
@@ -17,10 +17,12 @@
package org.apache.jackrabbit.oak.jcr.security.authorization;
import javax.jcr.Node;
+import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.apache.jackrabbit.test.api.util.Text;
public class ReadNodeTypeTest extends AbstractEvaluationTest {
@@ -72,4 +74,43 @@ public class ReadNodeTypeTest extends Ab
NodeType[] mixins = node.getMixinNodeTypes();
assertEquals(noMixins+1, mixins.length);
}
+
+ /**
+ * @see <a
href="https://issues.apache.org/jira/browse/OAK-2488">OAK-2488</a>
+ */
+ public void testGetPrimaryTypeFromNewNode() throws Exception {
+ deny(path, privilegesFromName(PrivilegeConstants.REP_READ_PROPERTIES));
+
+ testSession.getNode(path).remove();
+ Node newNode =
testSession.getNode(testRoot).addNode(Text.getName(path));
+
+ if (newNode.hasProperty(JcrConstants.JCR_PRIMARYTYPE)) {
+ NodeType primaryType = newNode.getPrimaryNodeType();
+
assertEquals(newNode.getProperty(JcrConstants.JCR_PRIMARYTYPE).getString(),
primaryType.getName());
+ } else {
+ try {
+ newNode.getPrimaryNodeType();
+ fail("Cannot read primary type from transient new node if
access to property is not readable.");
+ } catch (RepositoryException e) {
+ assertTrue(e.getMessage().startsWith("Unable to retrieve
primary type for Node"));
+ }
+ }
+ }
+
+ /**
+ * @see <a
href="https://issues.apache.org/jira/browse/OAK-2488">OAK-2488</a>
+ */
+ public void testGetMixinFromNewNode() 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));
+
+ assertFalse(newNode.hasProperty(JcrConstants.JCR_MIXINTYPES));
+ NodeType[] mixins = newNode.getMixinNodeTypes();
+ assertEquals(0, mixins.length);
+ }
}
\ No newline at end of file