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);