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 md...@apache.org on 2014/11/24 11:04:55 UTC

svn commit: r1641346 - in /jackrabbit/oak/trunk/oak-jcr/src: main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java

Author: mduerig
Date: Mon Nov 24 10:04:55 2014
New Revision: 1641346

URL: http://svn.apache.org/r1641346
Log:
OAK-2238: Session.getItem violates JCR Spec
Applying patch. Credits to Will McGauley

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1641346&r1=1641345&r2=1641346&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java Mon Nov 24 10:04:55 2014
@@ -426,12 +426,12 @@ public class SessionDelegate {
             return getRootNode();
         } else {
             Tree parent = root.getTree(PathUtils.getParentPath(path));
-            if (parent.hasProperty(name)) {
-                return new PropertyDelegate(this, parent, name);
-            }
+
             Tree child = parent.getChild(name);
             if (child.exists()) {
                 return new NodeDelegate(this, child);
+            } else if (parent.hasProperty(name)) {
+                return new PropertyDelegate(this, parent, name);
             } else {
                 return null;
             }

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1641346&r1=1641345&r2=1641346&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Mon Nov 24 10:04:55 2014
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.jcr;
 
 import static java.util.Arrays.asList;
 import static javax.jcr.ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW;
+import static javax.jcr.Repository.OPTION_NODE_AND_PROPERTY_WITH_SAME_NAME_SUPPORTED;
 import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
 import static org.apache.jackrabbit.commons.JcrUtils.getChildNodes;
 import static org.junit.Assert.assertEquals;
@@ -649,6 +650,29 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    public void testGetItemReturnsNodeBeforeProperty() throws RepositoryException {
+        String snnpSupported = getRepository().getDescriptor(OPTION_NODE_AND_PROPERTY_WITH_SAME_NAME_SUPPORTED);
+        assumeTrue(Boolean.valueOf(snnpSupported));
+
+        String newNodeName = "getItemTest";
+        String nodeAndPropertyName = "subnode";
+
+        Session session = getAdminSession();
+        Node root = session.getRootNode();
+        assertFalse(root.hasNode(newNodeName));
+        Node newNode = root.addNode(newNodeName, NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+
+        newNode.setProperty(nodeAndPropertyName, "prop value");
+        newNode.addNode(nodeAndPropertyName);
+        session.save();
+
+        Item item = session.getItem("/" + newNodeName + "/" + nodeAndPropertyName);
+
+        assertTrue("should retrieve Node before property", item.isNode());
+    }
+
+
+    @Test
     public void addMultiValuedString() throws RepositoryException {
         Node parentNode = getNode(TEST_PATH);
         Value[] values = new Value[2];