diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java
index 1d2feb9848..ca03bc9143 100644
--- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java
+++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java
@@ -80,6 +80,7 @@ public abstract class BaseAPI
protected static final String RM_ACTIONS_API = "{0}rma/actions/ExecutionQueue";
protected static final String RM_SITE_ID = "rm";
protected static final String SHARE_ACTION_API = "{0}internal/shared/share/workspace/SpacesStore/{1}";
+ private static final String SLINGSHOT_PREFIX = "alfresco/s/slingshot/";
@Autowired
private AlfrescoHttpClientFactory alfrescoHttpClientFactory;
@@ -352,12 +353,50 @@ public abstract class BaseAPI
String... urlTemplateParams)
{
AlfrescoHttpClient client = alfrescoHttpClientFactory.getObject();
- String requestUrl = MessageFormat.format(
- urlTemplate,
- client.getApiUrl(),
- urlTemplateParams);
- client.close();
+ return doPostJsonRequest(adminUser, adminPassword, client.getApiUrl(), requestParams, urlTemplate, urlTemplateParams);
+ }
+ /**
+ * Helper method for POST requests to slingshot.
+ *
+ * @param adminUser user with administrative privileges
+ * @param adminPassword password for adminUser
+ * @param requestParams zero or more endpoint specific request parameters
+ * @param urlTemplate request URL template
+ * @param urlTemplateParams zero or more parameters used with urlTemplate
+ */
+ protected boolean doSlingshotPostJsonRequest(String adminUser,
+ String adminPassword,
+ JSONObject requestParams,
+ String urlTemplate,
+ String... urlTemplateParams)
+ {
+ AlfrescoHttpClient client = alfrescoHttpClientFactory.getObject();
+ return doPostJsonRequest(adminUser, adminPassword, client.getAlfrescoUrl() + SLINGSHOT_PREFIX, requestParams, urlTemplate, urlTemplateParams);
+ }
+
+ /**
+ * Helper method for POST requests
+ *
+ * @param adminUser user with administrative privileges
+ * @param adminPassword password for adminUser
+ * @param urlStart the start of the URL (for example "alfresco/s/slingshot").
+ * @param requestParams zero or more endpoint specific request parameters
+ * @param urlTemplate request URL template
+ * @param urlTemplateParams zero or more parameters used with urlTemplate
+ */
+ private boolean doPostJsonRequest(String adminUser,
+ String adminPassword,
+ String urlStart,
+ JSONObject requestParams,
+ String urlTemplate,
+ String... urlTemplateParams)
+ {
+ // Ensure the host is part of the request URL.
+ String requestUrl = MessageFormat.format(
+ urlTemplate,
+ urlStart,
+ urlTemplateParams);
try
{
return doRequestJson(HttpPost.class, requestUrl, adminUser, adminPassword, requestParams);
@@ -482,7 +521,11 @@ public abstract class BaseAPI
((HttpEntityEnclosingRequestBase) request).setEntity(new StringEntity(requestParams.toString()));
}
- return client.execute(adminUser, adminPassword, request).getStatusLine().getStatusCode() == HttpStatus.SC_OK;
+ LOGGER.info("Sending {} request to {}", requestType.getSimpleName(), requestUrl);
+ LOGGER.info("Request body: {}", requestParams);
+ HttpResponse httpResponse = client.execute(adminUser, adminPassword, request);
+ LOGGER.info("Response: {}", httpResponse.getStatusLine());
+ return httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK;
}
catch (UnsupportedEncodingException | URISyntaxException error1)
{
diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/CopyToAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/CopyToAPI.java
new file mode 100644
index 0000000000..0ec3c49579
--- /dev/null
+++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/CopyToAPI.java
@@ -0,0 +1,81 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2017 Alfresco Software Limited
+ * %%
+ * This file is part of the Alfresco software.
+ * -
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ * -
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * -
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ * -
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ * #L%
+ */
+package org.alfresco.rest.v0;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.alfresco.rest.core.v0.BaseAPI;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * The v0 REST API for copy-to (which supports multi-item copy).
+ *
+ * @author Tom Page
+ * @since 2.6
+ */
+@Component
+public class CopyToAPI extends BaseAPI
+{
+ /** Logger for the class. */
+ private static final Logger LOGGER = LoggerFactory.getLogger(CopyToAPI.class);
+ /** The URI for the copy-to API. */
+ private static final String COPY_TO_API = "{0}doclib/action/copy-to/node/{1}";
+
+ /**
+ * Copy a list of nodes to the target container.
+ *
+ * @param user The username of the user to use.
+ * @param password The password of the user.
+ * @param targetContainerPath The destination to copy the nodes to. This should be in the format
+ * "{site}/{container}/{path}", "{site}/{container}", "{store_type}/{store_id}/{id}/{path}",
+ * "{store_type}/{store_id}/{id}" or "{store_type}/{store_id}".
+ * @param nodeRefs The list of nodes to copy.
+ * @return true if the request was successful.
+ */
+ public boolean copyTo(String user, String password, String targetContainerPath, List nodeRefs)
+ {
+ try
+ {
+ JSONObject requestParams = new JSONObject();
+ requestParams.put("nodeRefs", new JSONArray(nodeRefs));
+
+ return doSlingshotPostJsonRequest(user, password, requestParams,
+ MessageFormat.format(COPY_TO_API, "{0}", targetContainerPath));
+ }
+ catch (JSONException error)
+ {
+ LOGGER.error("Unable to extract response parameter", error);
+ }
+ return false;
+ }
+}