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


Reply via email to