diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java index 58e7d593bf..ba63553b14 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -2914,6 +2914,7 @@ public class NodesImpl implements Nodes String versionComment = null; String relativePath = null; String renditionNames = null; + String versioningState = null; Map qnameStrProps = new HashMap<>(); Map properties = null; @@ -2971,6 +2972,10 @@ public class NodesImpl implements Nodes renditionNames = getStringOrNull(field.getValue()); break; + case "versionstate": + versioningState = getStringOrNull(field.getValue()); + break; + default: { final String propName = field.getName(); @@ -3042,13 +3047,29 @@ public class NodesImpl implements Nodes throw new ConstraintViolatedException(fileName + " already exists."); } } - + // Note: pending REPO-159, we currently auto-enable versioning on new upload (but not when creating empty file) if (versionMajor == null) { versionMajor = true; } + // MNT-22036 add versioningState property for newly created nodes. + if (null != versioningState) + { + switch (versioningState) + { + case "none": + versionMajor = null; + break; + case "major": + versionMajor = true; + break; + default: + versionMajor = false; + } + } + // Create a new file. NodeRef nodeRef = createNewFile(parentNodeRef, fileName, nodeTypeQName, content, properties, assocTypeQName, parameters, versionMajor, versionComment); diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java index a6c34a1a96..9e541d77db 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -5612,6 +5612,124 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertTrue(((ArrayList) (propUpdateResponse.get("custom:locations"))).size() == 1); } + @Test + public void versioningStatePropetyMultipartUploadTest() throws Exception + { + setRequestContext(user1); + String myNodeId = getMyNodeId(); + + // Scenario 1 majorVersion and versionState multipart values are not set. + String fileName = "myfile" + UUID.randomUUID() + ".txt"; + File file = getResourceFile("quick-2.pdf"); + MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + + MultiPartRequest reqBody = multiPartBuilder.build(); + HttpResponse response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + Document documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + // Default behaviour, expect to be MAJOR Version 1.0 + Map documentProperties = documentResponse.getProperties(); + assertEquals(2, documentProperties.size()); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + + // Scenario 2 majorVersion is not set versionState is set to none. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setVersioningState("none"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + // Scenario 3 majorVersion is set to true and versionState is set to none. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setMajorVersion(true); + multiPartBuilder.setVersioningState("none"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + // Scenario 4 majorVersion is set to false and versionState is set to none. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setMajorVersion(false); + multiPartBuilder.setVersioningState("none"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + // Scenario 5 majorVersion is not set versionState is set to minor. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setVersioningState("minor"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals(2, documentProperties.size()); + assertEquals("MINOR", documentProperties.get("cm:versionType")); + assertEquals("0.1", documentProperties.get("cm:versionLabel")); + + // Scenario 6 majorVersion is set to true and versionState is set to minor. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setMajorVersion(true); + multiPartBuilder.setVersioningState("minor"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals(2, documentProperties.size()); + assertEquals("MINOR", documentProperties.get("cm:versionType")); + assertEquals("0.1", documentProperties.get("cm:versionLabel")); + + // Scenario 7 majorVersion is not set versionState is set to major. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setVersioningState("major"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals(2, documentProperties.size()); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + + // Scenario 8 majorVersion is set to false and versionState is set to major. + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setMajorVersion(false); + multiPartBuilder.setVersioningState("major"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals(2, documentProperties.size()); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + } + @Test public void testAuditableProperties() throws Exception { setRequestContext(user1); diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/util/MultiPartBuilder.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/util/MultiPartBuilder.java index 527d5fa3d9..b76da9a594 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/util/MultiPartBuilder.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/util/MultiPartBuilder.java @@ -43,7 +43,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; /** * multipart/form-data builder. @@ -57,6 +56,7 @@ public class MultiPartBuilder private String updateNodeRef; private String description; private String contentTypeQNameStr; + private String versioningState; private List aspects = Collections.emptyList(); private Boolean majorVersion; private Boolean overwrite; @@ -76,6 +76,7 @@ public class MultiPartBuilder this.updateNodeRef = that.updateNodeRef; this.description = that.description; this.contentTypeQNameStr = that.contentTypeQNameStr; + this.versioningState = that.versioningState; this.aspects = new ArrayList<>(that.aspects); this.majorVersion = that.majorVersion; this.overwrite = that.overwrite; @@ -125,6 +126,12 @@ public class MultiPartBuilder return this; } + public MultiPartBuilder setVersioningState(String versioningState) + { + this.versioningState = versioningState; + return this; + } + public MultiPartBuilder setAspects(List aspects) { this.aspects = aspects; @@ -278,6 +285,7 @@ public class MultiPartBuilder addPartIfNotNull(parts, "updatenoderef", updateNodeRef); addPartIfNotNull(parts, "description", description); addPartIfNotNull(parts, "contenttype", contentTypeQNameStr); + addPartIfNotNull(parts, "versioningstate", versioningState); addPartIfNotNull(parts, "aspects", getCommaSeparated(aspects)); addPartIfNotNull(parts, "majorversion", majorVersion); addPartIfNotNull(parts, "overwrite", overwrite);