You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2018/03/06 09:08:00 UTC

[jira] [Commented] (SLING-7511) Add importContent to SlingClient

    [ https://issues.apache.org/jira/browse/SLING-7511?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16387487#comment-16387487 ] 

ASF GitHub Bot commented on SLING-7511:
---------------------------------------

rombert closed pull request #6: SLING-7511: Add importContent to SlingClient
URL: https://github.com/apache/sling-org-apache-sling-testing-clients/pull/6
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/pom.xml b/pom.xml
index 2eac034..10cc54f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -208,5 +208,11 @@
             <version>5.0.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/testing/clients/SlingClient.java b/src/main/java/org/apache/sling/testing/clients/SlingClient.java
index 8359bf2..7c4873d 100644
--- a/src/main/java/org/apache/sling/testing/clients/SlingClient.java
+++ b/src/main/java/org/apache/sling/testing/clients/SlingClient.java
@@ -474,6 +474,69 @@ public SlingHttpResponse createFolder(String folderName, String folderTitle, Str
         return this.doPost(folderPath, feb, HttpUtils.getExpectedStatus(SC_CREATED, expectedStatus));
     }
 
+    /**
+     * <p>Create a tree structure under {@code parentPath} by providing a {@code content} in one
+     * of the supported formats: xml, jcr.xml, json, jar, zip.</p>
+     *
+     * <p>This is the implementation of {@code :operation import}, as documented in
+     * <a href="http://sling.apache.org/documentation/bundles/manipulating-content-the-slingpostservlet-servlets-post.html#importing-content-structures">importing-content-structures</a></p>
+     *
+     * @param parentPath path where the tree is created
+     * @param contentType format of the content
+     * @param content string expressing the structure to be created, in the specified format
+     * @param expectedStatus list of expected HTTP Status to be returned, if not set, 201 is assumed
+     * @return the response
+     * @throws ClientException if something fails during the request/response cycle
+     */
+    public SlingHttpResponse importContent(String parentPath, String contentType, String content, int... expectedStatus)
+            throws ClientException {
+        HttpEntity entity = FormEntityBuilder.create()
+                .addParameter(":operation", "import")
+                .addParameter(":contentType", contentType)
+                .addParameter(":content", content)
+                .build();
+        // execute request and return the sling response
+        return this.doPost(parentPath, entity, HttpUtils.getExpectedStatus(SC_CREATED, expectedStatus));
+    }
+
+    /**
+     * <p>Create a tree structure under {@code parentPath} by providing a {@code contentFile} in one
+     * of the supported formats: xml, jcr.xml, json, jar, zip.</p>
+     *
+     * <p>This is the implementation of {@code :operation import}, as documented in
+     * <a href="http://sling.apache.org/documentation/bundles/manipulating-content-the-slingpostservlet-servlets-post.html#importing-content-structures">importing-content-structures</a></p>
+     *
+     * @param parentPath path where the tree is created
+     * @param contentType format of the content
+     * @param contentFile file containing the structure to be created, in the specified format
+     * @param expectedStatus list of expected HTTP Status to be returned, if not set, 200 is assumed
+     * @return the response
+     * @throws ClientException if something fails during the request/response cycle
+     */
+    public SlingHttpResponse importContent(String parentPath, String contentType, File contentFile, int... expectedStatus)
+            throws ClientException {
+        HttpEntity entity = MultipartEntityBuilder.create()
+                .addTextBody(":operation", "import")
+                .addTextBody(":contentType", contentType)
+                .addBinaryBody(":contentFile", contentFile)
+                .build();
+        // execute request and return the sling response
+        return this.doPost(parentPath, entity, HttpUtils.getExpectedStatus(SC_CREATED, expectedStatus));
+    }
+
+    /**
+     * Wrapper method over {@link #importContent(String, String, String, int...)} for directly importing a json node
+     * @param parentPath path where the tree is created
+     * @param json json node with the desired structure
+     * @param expectedStatus list of expected HTTP Status to be returned, if not set, 201 is assumed
+     * @return the response
+     * @throws ClientException if something fails during the request/response cycle
+     */
+    public SlingHttpResponse importJson(String parentPath, JsonNode json, int... expectedStatus)
+            throws ClientException {
+        return importContent(parentPath, "json", json.toString(), expectedStatus);
+    }
+
     /**
      * Get the UUID of a repository path
      *
diff --git a/src/main/java/org/apache/sling/testing/clients/email/package-info.java b/src/main/java/org/apache/sling/testing/clients/email/package-info.java
index 1789e2c..906392d 100644
--- a/src/main/java/org/apache/sling/testing/clients/email/package-info.java
+++ b/src/main/java/org/apache/sling/testing/clients/email/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.1.0")
+@Version("1.2.0")
 package org.apache.sling.testing.clients.email;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/testing/clients/html/package-info.java b/src/main/java/org/apache/sling/testing/clients/html/package-info.java
index cd55c59..7c795ae 100644
--- a/src/main/java/org/apache/sling/testing/clients/html/package-info.java
+++ b/src/main/java/org/apache/sling/testing/clients/html/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("2.2.0")
+@Version("2.3.0")
 package org.apache.sling.testing.clients.html;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/testing/clients/package-info.java b/src/main/java/org/apache/sling/testing/clients/package-info.java
index 9970e37..c3e99df 100644
--- a/src/main/java/org/apache/sling/testing/clients/package-info.java
+++ b/src/main/java/org/apache/sling/testing/clients/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.4.0")
+@Version("1.5.0")
 package org.apache.sling.testing.clients;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/test/java/org/apache/sling/testing/clients/SlingClientImportContentTest.java b/src/test/java/org/apache/sling/testing/clients/SlingClientImportContentTest.java
new file mode 100644
index 0000000..7ad5938
--- /dev/null
+++ b/src/test/java/org/apache/sling/testing/clients/SlingClientImportContentTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.testing.clients;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.*;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.codehaus.jackson.node.JsonNodeFactory;
+import org.codehaus.jackson.node.ObjectNode;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
+import static org.apache.http.HttpStatus.SC_CREATED;
+
+public class SlingClientImportContentTest {
+    private static final Logger LOG = LoggerFactory.getLogger(SlingClientImportContentTest.class);
+
+    private static final String IMPORT_PATH = "/test/import/parent";
+    private static final String IMPORT_FILE_PATH = "/content/importfile";
+
+    private static final String IMPORT_FILE_CONTENT = "{\"nodefromfile\":{\"prop1\":\"val1\"}}";
+
+    @ClassRule
+    public static HttpServerRule httpServer = new HttpServerRule() {
+        @Override
+        protected void registerHandlers() throws IOException {
+            serverBootstrap.registerHandler(IMPORT_PATH, new HttpRequestHandler() {
+                @Override
+                public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
+                    List<NameValuePair> params = extractParameters(request);
+                    String operation = getParameter(":operation", params);
+                    String content = getParameter(":content", params);
+
+                    if (!"import".equals(operation)) {
+                        response.setStatusCode(SC_BAD_REQUEST);
+                        response.setEntity(new StringEntity("Unexpected operation: " + operation));
+                        return;
+                    }
+
+                    if (!"{\"something\":{\"prop1\":\"val1\"}}".equals(content)) {
+                        response.setStatusCode(SC_BAD_REQUEST);
+                        response.setEntity(new StringEntity("Unexpected content: " + content));
+                        return;
+                    }
+
+                    response.setStatusCode(SC_CREATED);
+                }
+            });
+
+            serverBootstrap.registerHandler(IMPORT_FILE_PATH, new HttpRequestHandler() {
+                @Override
+                public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
+                    LOG.debug("received: {}", request);
+                    if (request instanceof HttpEntityEnclosingRequest) {
+                        HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+                        String content = IOUtils.toString(entity.getContent(), UTF_8);
+                        LOG.debug("content: {}", content);
+
+                        if (!content.contains(":operation") || !content.contains("import")) {
+                            response.setStatusCode(SC_BAD_REQUEST);
+                            response.setEntity(new StringEntity("Operation not found"));
+                            return;
+                        } else if (!content.contains(IMPORT_FILE_CONTENT)) {
+                            response.setStatusCode(SC_BAD_REQUEST);
+                            response.setEntity(new StringEntity("File content not found"));
+                            return;
+                        }
+
+                        response.setStatusCode(SC_CREATED);
+                    } else {
+                        response.setStatusCode(SC_BAD_REQUEST);
+                        response.setEntity(new StringEntity("Request doesn't contain an entity"));
+                    }
+                }
+            });
+        }
+
+        private List<NameValuePair> extractParameters(HttpRequest request) {
+            if (request instanceof HttpEntityEnclosingRequest) {
+                HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+                try {
+                    return URLEncodedUtils.parse(entity);
+                } catch (IOException e) {
+                    LOG.error("Failed to parse entity", e);
+                }
+            }
+
+            return new ArrayList<>();
+        }
+
+        private String getParameter(String parameterName, List<NameValuePair> parameters) {
+            for (NameValuePair parameter : parameters) {
+                if (parameter.getName().equals(parameterName)) {
+                    return parameter.getValue();
+                }
+            }
+
+            return null;
+        }
+    };
+
+
+
+    private SlingClient client;
+
+    public SlingClientImportContentTest() throws ClientException {
+        client = new SlingClient(httpServer.getURI(), "user", "pass");
+        // to use with an already running instance
+        // client = new SlingClient(java.net.URI.create("http://localhost:8080"), "admin", "admin");
+    }
+
+    @Test
+    public void testImportContent() throws Exception {
+        client.importContent(IMPORT_PATH, "json", "{\"something\":{\"prop1\":\"val1\"}}");
+    }
+
+    @Test
+    public void testImportJson() throws Exception {
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        ObjectNode props = JsonNodeFactory.instance.objectNode();
+        props.put("prop1", "val1");
+
+        node.put("something", props);
+        client.importJson(IMPORT_PATH, node);
+    }
+    @Test
+    public void testImportContentFile() throws Exception {
+        File tmp = File.createTempFile("import-json", null);
+        LOG.debug("created: " + tmp);
+        PrintWriter pw = new PrintWriter(tmp);
+        pw.write(IMPORT_FILE_CONTENT);
+        pw.close();
+
+        client.importContent(IMPORT_FILE_PATH, "json", tmp);
+    }
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> Add importContent to SlingClient
> --------------------------------
>
>                 Key: SLING-7511
>                 URL: https://issues.apache.org/jira/browse/SLING-7511
>             Project: Sling
>          Issue Type: Improvement
>          Components: Apache Sling Testing Clients
>            Reporter: Valentin Olteanu
>            Priority: Major
>             Fix For: Testing Clients 1.1.6
>
>
> Add operations specific to [http://sling.apache.org/documentation/bundles/manipulating-content-the-slingpostservlet-servlets-post.html#importing-content-structures]
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)