You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2015/05/26 11:43:47 UTC

svn commit: r1681728 - in /sling/trunk/contrib/extensions/bgservlets/engine/src: main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java

Author: bdelacretaz
Date: Tue May 26 09:43:47 2015
New Revision: 1681728

URL: http://svn.apache.org/r1681728
Log:
SLING-4748 - avoid stack overflow once root is reached

Modified:
    sling/trunk/contrib/extensions/bgservlets/engine/src/main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java
    sling/trunk/contrib/extensions/bgservlets/engine/src/test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java

Modified: sling/trunk/contrib/extensions/bgservlets/engine/src/main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/engine/src/main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java?rev=1681728&r1=1681727&r2=1681728&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/bgservlets/engine/src/main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java (original)
+++ sling/trunk/contrib/extensions/bgservlets/engine/src/main/java/org/apache/sling/bgservlets/impl/DeepNodeCreator.java Tue May 26 09:43:47 2015
@@ -47,11 +47,14 @@ public class DeepNodeCreator {
         } else {
             final int slashPos = path.lastIndexOf("/");
             String parentPath = path.substring(0, slashPos);
+            Node parent = null;
             if(parentPath.length() == 0) {
-                parentPath = "/";
+                // reached the root
+                parent = session.getRootNode();
+            } else {
+                parent = deepCreateNode(parentPath, session, nodeType);
             }
             final String childPath = path.substring(slashPos + 1);
-            final Node parent = deepCreateNode(parentPath, session, nodeType);
             result = parent.addNode(childPath, getNodeType(parent, childPath, nodeType));
             nodeCreated(result);
             session.save();

Modified: sling/trunk/contrib/extensions/bgservlets/engine/src/test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/engine/src/test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java?rev=1681728&r1=1681727&r2=1681728&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/bgservlets/engine/src/test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java (original)
+++ sling/trunk/contrib/extensions/bgservlets/engine/src/test/java/org/apache/sling/bgservlets/impl/DeepNodeCreatorTest.java Tue May 26 09:43:47 2015
@@ -18,9 +18,11 @@ package org.apache.sling.bgservlets.impl
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.jcr.ItemExistsException;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -29,9 +31,7 @@ import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
 
-/** Test the DeepNodeCreator class 
- * TOO replace with the version of JCR-2687 once that's released.
- * */
+/** Test the DeepNodeCreator class **/ 
 public class DeepNodeCreatorTest {
 
     @Test
@@ -57,6 +57,7 @@ public class DeepNodeCreatorTest {
         assertTrue("Expecting deepCreate to return existing node", result == n);
     }
     
+    @Test
     public void testCreateFromRoot() throws Exception {
         final Mockery mockery = new Mockery(); 
         final DeepNodeCreator c = new DeepNodeCreator();
@@ -91,13 +92,17 @@ public class DeepNodeCreatorTest {
             allowing(foo).addNode("bar", testNodeType);
             will(returnValue(bar));
             
+            allowing(s).getRootNode();
+            will(returnValue(root));
+            
             allowing(s).save();
         }});
         
         final Node result = c.deepCreateNode(barPath, s, testNodeType);
-        assertTrue("Expecting deepCreate to return create node", result == bar);
+        assertTrue("Expecting deepCreate to return created node", result == bar);
     }
     
+    @Test
     public void testCreateWithVariousTypes() throws Exception {
         final Mockery mockery = new Mockery();
         
@@ -137,6 +142,8 @@ public class DeepNodeCreatorTest {
             allowing(bar).addNode("wii", "NT_/foo/bar.wii");
             will(returnValue(wii));
             
+            allowing(s).getRootNode();
+            
             allowing(s).save();
         }});
         
@@ -158,4 +165,46 @@ public class DeepNodeCreatorTest {
         assertTrue("Expecting deepCreate to return created node", result == wii);
         assertEquals("Expecting correct count of nodeCreated calls", 2, counter.get());
     }
-}
+    
+    @Test
+    public void testCannotReadFoo() throws Exception {
+        final Mockery mockery = new Mockery();
+        final Session s = mockery.mock(Session.class);
+        final String fooPath = "/foo";
+        final Node foo = mockery.mock(Node.class, fooPath);
+        final String barPath = "/foo/bar";
+        final Node bar = mockery.mock(Node.class, barPath);
+        final Node root = mockery.mock(Node.class, "/");
+        
+        mockery.checking(new Expectations() {{
+            allowing(s).itemExists(with(any(String.class)));
+            will(returnValue(false));
+            
+            allowing(s).itemExists(barPath);
+            will(returnValue(true));
+            
+            allowing(s).getItem(fooPath);
+            will(returnValue(foo));
+            
+            allowing(s).getItem(barPath);
+            will(returnValue(bar));
+            
+            allowing(s).getRootNode();
+            will(returnValue(root));
+            
+            allowing(root).addNode(with(any(String.class)), with(any(String.class)));
+            will(throwException(new ItemExistsException("As if the child node was not readable")));
+            
+            allowing(s).save();
+       }});
+        
+        final DeepNodeCreator c = new DeepNodeCreator();
+        
+        try {
+            c.deepCreateNode("/foo/bar/something", s, "nt:unstructured");
+            fail("Expecting an exception as /foo is not accessible");
+        } catch(ItemExistsException asExpected) {
+            // all is good
+        }
+    }
+}
\ No newline at end of file