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