diff --git a/config/alfresco/public-rest-context.xml b/config/alfresco/public-rest-context.xml
index 49847bd0b1..b3dff65439 100644
--- a/config/alfresco/public-rest-context.xml
+++ b/config/alfresco/public-rest-context.xml
@@ -153,6 +153,7 @@
+
diff --git a/source/java/org/alfresco/rest/api/impl/NodesImpl.java b/source/java/org/alfresco/rest/api/impl/NodesImpl.java
index ac544155cd..528754e642 100644
--- a/source/java/org/alfresco/rest/api/impl/NodesImpl.java
+++ b/source/java/org/alfresco/rest/api/impl/NodesImpl.java
@@ -2254,7 +2254,17 @@ public class NodesImpl implements Nodes
}
String versionComment = parameters.getParameter(PARAM_VERSION_COMMENT);
- final String fileName = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
+ String fileName = parameters.getParameter(PARAM_NAME);
+ if (fileName != null)
+ {
+ // optionally rename, before updating the content
+ nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, fileName);
+ }
+ else
+ {
+ fileName = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
+ }
+
return updateExistingFile(null, nodeRef, fileName, contentInfo, stream, parameters, versionMajor, versionComment);
}
diff --git a/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java b/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java
index 077f3e55fc..f9e9f751a3 100644
--- a/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java
+++ b/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java
@@ -87,6 +87,14 @@ public class NodesEntityResource implements
return nodes.getFolderOrDocument(nodeId, parameters);
}
+ /**
+ * Download content
+ *
+ * @param fileNodeId
+ * @param parameters {@link Parameters}
+ * @return
+ * @throws EntityNotFoundException
+ */
@Override
@WebApiDescription(title = "Download content", description = "Download content")
@BinaryProperties({"content"})
@@ -95,6 +103,19 @@ public class NodesEntityResource implements
return nodes.getContent(fileNodeId, parameters, true);
}
+ /**
+ * Upload new version of content
+ *
+ * This allow binary content update of an existing file/content node.
+ *
+ * Note: alternatively, can upload via POST (multipart/form-data) with existing file name and form "overwrite=true".
+ *
+ * @param fileNodeId
+ * @param contentInfo Basic information about the content stream
+ * @param stream An inputstream
+ * @param parameters
+ * @return
+ */
@Override
@WebApiDescription(title = "Upload content", description = "Upload content")
@BinaryProperties({"content"})
diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java
index 8f6fa2b619..845bd8f3ca 100644
--- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java
+++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java
@@ -2962,15 +2962,12 @@ public class NodeApiTest extends AbstractBaseApiTest
String myNodeId = getMyNodeId(user1);
- Folder f1 = new Folder();
- f1.setName("F1");
- f1.setNodeType(TYPE_CM_FOLDER);
-
- HttpResponse response = post(getNodeChildrenUrl(myNodeId), user1, toJsonAsStringNonNull(f1), 201);
- Folder folderResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Folder.class);
- assertEquals(f1.getName(), folderResp.getName());
- final String f1_nodeId = folderResp.getId();
- assertNotNull(f1_nodeId);
+ String folderName = "f1 "+System.currentTimeMillis();
+ Folder folderResp = createFolder(user1, myNodeId, folderName);
+ String f1_nodeId = folderResp.getId();
+
+ String anoNodeName = "another";
+ createFolder(user1, f1_nodeId, anoNodeName);
Document doc = new Document();
final String docName = "testdoc.txt";
@@ -2981,7 +2978,7 @@ public class NodeApiTest extends AbstractBaseApiTest
doc.setContent(contentInfo);
// create an empty file within F1 folder
- response = post(getNodeChildrenUrl(f1_nodeId), user1, toJsonAsStringNonNull(doc), 201);
+ HttpResponse response = post(getNodeChildrenUrl(f1_nodeId), user1, toJsonAsStringNonNull(doc), 201);
Document docResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
assertEquals(docName, docResp.getName());
@@ -3056,11 +3053,40 @@ public class NodeApiTest extends AbstractBaseApiTest
assertNotNull(pathElements);
assertTrue(pathElements.size() > 0);
// check the last element is F1
- assertEquals(f1.getName(), pathElements.get(pathElements.size() - 1).getName());
+ assertEquals(folderResp.getName(), pathElements.get(pathElements.size() - 1).getName());
// Download the file
response = getSingle(url, user1, null, 200);
- assertNotNull(content, response.getResponse());
+ assertEquals(content, response.getResponse());
+
+ // Update the node's content again. Also rename the file !
+ content = "The quick brown fox jumps over the lazy dog updated again !";
+ inputStream = new ByteArrayInputStream(content.getBytes());
+ txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt");
+ payload = new BinaryPayload(txtFile);
+
+ String docName2 = "hello-world.txt";
+ Map params = new HashMap<>();
+ params.put(Nodes.PARAM_NAME, docName2);
+ response = putBinary(url, user1, payload, null, params, 200);
+ docResp = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class);
+ assertEquals(docName2, docResp.getName());
+
+ // Download the file
+ response = getSingle(url, user1, null, 200);
+ assertEquals(content, response.getResponse());
+
+ // -ve - optional "name" is invalid
+ params = new HashMap<>();
+ params.put(Nodes.PARAM_NAME, "hello/world.txt");
+ payload = new BinaryPayload(txtFile);
+ putBinary(url, user1, payload, null, params, 422);
+
+ // -ve - optional "name" already exists ...
+ params = new HashMap<>();
+ params.put(Nodes.PARAM_NAME, anoNodeName);
+ payload = new BinaryPayload(txtFile);
+ putBinary(url, user1, payload, null, params, 409);
// -ve - try to update content using multi-part form data
payload = new BinaryPayload(txtFile, "multipart/form-data", null);