You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:49:09 UTC
[sling-org-apache-sling-jcr-repoinit] 26/43: SLING-5449 - Implement
CreatePath in oak-jcr module
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.jcr.repoinit-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-repoinit.git
commit 7af1acb9c89e2197abb7a146675663666945fc0c
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Tue May 17 15:35:15 2016 +0000
SLING-5449 - Implement CreatePath in oak-jcr module
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/repoinit/oak-jcr@1744286 13f79535-47bb-0310-9956-ffa450edef68
---
pom.xml | 6 ++
.../sling/repoinit/jcr/JcrRepoInitOpVisitor.java | 23 ++++++-
.../apache/sling/repoinit/jcr/CreatePathsTest.java | 77 ++++++++++++++++++++++
.../org/apache/sling/repoinit/jcr/TestUtil.java | 23 +++++++
4 files changed, 128 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index e093443..90ce530 100644
--- a/pom.xml
+++ b/pom.xml
@@ -132,5 +132,11 @@
<version>1.0.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.testing</artifactId>
+ <version>2.0.18</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
diff --git a/src/main/java/org/apache/sling/repoinit/jcr/JcrRepoInitOpVisitor.java b/src/main/java/org/apache/sling/repoinit/jcr/JcrRepoInitOpVisitor.java
index 1b991af..e3680bb 100644
--- a/src/main/java/org/apache/sling/repoinit/jcr/JcrRepoInitOpVisitor.java
+++ b/src/main/java/org/apache/sling/repoinit/jcr/JcrRepoInitOpVisitor.java
@@ -22,6 +22,7 @@ import static org.apache.sling.repoinit.parser.operations.AclLine.PROP_PRIVILEGE
import java.util.List;
+import javax.jcr.Node;
import javax.jcr.Session;
import org.apache.sling.repoinit.jcr.impl.AclUtil;
@@ -31,6 +32,7 @@ import org.apache.sling.repoinit.parser.operations.CreatePath;
import org.apache.sling.repoinit.parser.operations.CreateServiceUser;
import org.apache.sling.repoinit.parser.operations.DeleteServiceUser;
import org.apache.sling.repoinit.parser.operations.OperationVisitor;
+import org.apache.sling.repoinit.parser.operations.PathSegmentDefinition;
import org.apache.sling.repoinit.parser.operations.SetAclPaths;
import org.apache.sling.repoinit.parser.operations.SetAclPrincipals;
import org.slf4j.Logger;
@@ -117,6 +119,25 @@ public class JcrRepoInitOpVisitor implements OperationVisitor {
@Override
public void visitCreatePath(CreatePath cp) {
- throw new UnsupportedOperationException("visitCreatePath is not implemented yet");
+ String parentPath = "";
+ for(PathSegmentDefinition psd : cp.getDefinitions()) {
+ final String fullPath = parentPath + "/" + psd.getSegment();
+ try {
+ if(session.itemExists(fullPath)) {
+ // TODO warn if primary type is not correct
+ } else {
+ final Node n = parentPath.equals("") ? session.getRootNode() : session.getNode(parentPath);
+ n.addNode(psd.getSegment(), psd.getPrimaryType());
+ }
+ } catch(Exception e) {
+ throw new RuntimeException("CreatePath execution failed at " + psd + ": " + e, e);
+ }
+ parentPath += "/" + psd.getSegment();
+ }
+ try {
+ session.save();
+ } catch(Exception e) {
+ throw new RuntimeException("Session.save failed: "+ e, e);
+ }
}
}
diff --git a/src/test/java/org/apache/sling/repoinit/jcr/CreatePathsTest.java b/src/test/java/org/apache/sling/repoinit/jcr/CreatePathsTest.java
new file mode 100644
index 0000000..faf5cf2
--- /dev/null
+++ b/src/test/java/org/apache/sling/repoinit/jcr/CreatePathsTest.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.repoinit.jcr;
+
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.sling.commons.testing.jcr.RepositoryUtil;
+import org.apache.sling.testing.mock.sling.ResourceResolverType;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+/** Test the creation of paths with specific node types */
+public class CreatePathsTest {
+
+ @Rule
+ public final SlingContext context = new SlingContext(ResourceResolverType.JCR_OAK);
+
+ private TestUtil U;
+
+ @Before
+ public void setup() throws RepositoryException, IOException {
+ U = new TestUtil(context);
+ RepositoryUtil.registerSlingNodeTypes(U.adminSession);
+ }
+
+ @Test
+ public void createSimplePath() throws Exception {
+ final String path = "/one/two/three";
+ U.parseAndExecute("create path " + path);
+ U.assertNodeExists(path);
+ }
+
+ @Test
+ public void createPathWithTypes() throws Exception {
+ final String path = "/four/five(sling:Folder)/six(nt:folder)";
+ U.parseAndExecute("create path " + path);
+ U.assertNodeExists("/four", "nt:unstructured");
+ U.assertNodeExists("/four/five", "sling:Folder");
+ U.assertNodeExists("/four/five/six", "nt:folder");
+ }
+
+ @Test
+ public void createPathWithSpecificDefaultType() throws Exception {
+ final String path = "/seven/eight(nt:unstructured)/nine";
+ U.parseAndExecute("create path (sling:Folder) " + path);
+ U.assertNodeExists("/seven", "sling:Folder");
+ U.assertNodeExists("/seven/eight", "nt:unstructured");
+ U.assertNodeExists("/seven/eight/nine", "sling:Folder");
+ }
+
+ @Test
+ public void createPathWithJcrDefaultType() throws Exception {
+ final String path = "/ten/eleven(sling:Folder)/twelve";
+ U.parseAndExecute("create path " + path);
+ U.assertNodeExists("/ten", "nt:unstructured");
+ U.assertNodeExists("/ten/eleven", "sling:Folder");
+ U.assertNodeExists("/ten/eleven/twelve", "sling:Folder");
+ }
+}
diff --git a/src/test/java/org/apache/sling/repoinit/jcr/TestUtil.java b/src/test/java/org/apache/sling/repoinit/jcr/TestUtil.java
index e1d2383..7d72df8 100644
--- a/src/test/java/org/apache/sling/repoinit/jcr/TestUtil.java
+++ b/src/test/java/org/apache/sling/repoinit/jcr/TestUtil.java
@@ -18,12 +18,14 @@ package org.apache.sling.repoinit.jcr;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
import java.util.UUID;
+import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
@@ -40,6 +42,7 @@ import org.apache.sling.testing.mock.sling.junit.SlingContext;
/** Test utilities */
class TestUtil {
+ public static final String JCR_PRIMARY_TYPE = "jcr:primaryType";
final Session adminSession;
final String id;
final String username;
@@ -70,6 +73,26 @@ class TestUtil {
}
}
+ void assertNodeExists(String path) throws RepositoryException {
+ assertNodeExists(path, null);
+ }
+
+ void assertNodeExists(String path, String primaryType) throws RepositoryException {
+ if(!adminSession.nodeExists(path)) {
+ fail("Node does not exist:" + path);
+ }
+ if(primaryType != null) {
+ final Node n = adminSession.getNode(path);
+ if(!n.hasProperty(JCR_PRIMARY_TYPE)) {
+ fail("No " + JCR_PRIMARY_TYPE + " property at " + path);
+ }
+ final String actual = n.getProperty(JCR_PRIMARY_TYPE).getString();
+ if(!primaryType.equals(actual)) {
+ fail("Primary type mismatch for " + path + ", expected " + primaryType + " but got " + actual);
+ }
+ }
+ }
+
void parseAndExecute(String input) throws RepositoryException, RepoInitParsingException {
final JcrRepoInitOpVisitor v = new JcrRepoInitOpVisitor(adminSession);
for(Operation o : parse(input)) {
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.