From fbb6f422cfad549124a26ff5de7fbbb6b8329b98 Mon Sep 17 00:00:00 2001 From: Epure Alexandru-Eusebiu Date: Thu, 12 Nov 2020 18:17:02 +0200 Subject: [PATCH 1/5] MNT-22036 : REST API always applies versioning Add versionState form-data property to POST nodes/{nodeId}/children multipart upload. Add versionState to MultiPartBuilder. Add tests for multipart upload --- .../org/alfresco/rest/api/impl/NodesImpl.java | 23 +++- .../alfresco/rest/api/tests/NodeApiTest.java | 118 ++++++++++++++++++ .../rest/api/tests/util/MultiPartBuilder.java | 10 +- 3 files changed, 149 insertions(+), 2 deletions(-) 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); From 12f645a71c938917d12c1469243938567d1ad540 Mon Sep 17 00:00:00 2001 From: Epure Alexandru-Eusebiu Date: Fri, 13 Nov 2020 08:37:12 +0200 Subject: [PATCH 2/5] Correct typo versionstate to versioningstate. --- .../src/main/java/org/alfresco/rest/api/impl/NodesImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ba63553b14..64a3d380ee 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 @@ -2972,7 +2972,7 @@ public class NodesImpl implements Nodes renditionNames = getStringOrNull(field.getValue()); break; - case "versionstate": + case "versioningstate": versioningState = getStringOrNull(field.getValue()); break; From 5017b305fbaa8e2ce3cf6dd4242a28519da7f25f Mon Sep 17 00:00:00 2001 From: Epure Alexandru-Eusebiu Date: Fri, 13 Nov 2020 17:02:28 +0200 Subject: [PATCH 3/5] MNT-22036 : REST API always applies versioning Changed property String versioningState to boolean versioningEnabled Add versioningEnabled to node creation using JSON Add unit tests for node creation using JSON. --- .../org/alfresco/rest/api/impl/NodesImpl.java | 41 +-- .../alfresco/rest/api/tests/NodeApiTest.java | 243 +++++++++++++++--- .../rest/api/tests/util/MultiPartBuilder.java | 10 +- 3 files changed, 228 insertions(+), 66 deletions(-) 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 64a3d380ee..0668015694 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 @@ -1848,6 +1848,19 @@ public class NodesImpl implements Nodes { versionMajor = Boolean.valueOf(str); } + String versioningEnabledStringValue = parameters.getParameter("versioningEnabled"); + if(null != versioningEnabledStringValue) + { + boolean versioningEnabled = Boolean.parseBoolean(versioningEnabledStringValue); + if(versioningEnabled) + { + versionMajor = (null != versionMajor) ? versionMajor : true; + } + else + { + versionMajor = null; + } + } String versionComment = parameters.getParameter(PARAM_VERSION_COMMENT); // Create the node @@ -2914,7 +2927,7 @@ public class NodesImpl implements Nodes String versionComment = null; String relativePath = null; String renditionNames = null; - String versioningState = null; + boolean versioningEnabled = true; Map qnameStrProps = new HashMap<>(); Map properties = null; @@ -2972,8 +2985,12 @@ public class NodesImpl implements Nodes renditionNames = getStringOrNull(field.getValue()); break; - case "versioningstate": - versioningState = getStringOrNull(field.getValue()); + case "versioningenabled": + String versioningEnabledStringValue = getStringOrNull(field.getValue()); + if(null != versioningEnabledStringValue) + { + versioningEnabled = !versioningEnabledStringValue.equalsIgnoreCase("false"); + } break; default: @@ -3053,22 +3070,8 @@ public class NodesImpl implements Nodes { 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; - } - } + // MNT-22036 add versioningEnabled property for newly created nodes. + versionMajor = versioningEnabled ? versionMajor : null; // 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 9e541d77db..4201fcce2c 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 @@ -5613,12 +5613,22 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest } @Test - public void versioningStatePropetyMultipartUploadTest() throws Exception + public void versioningEnabledMultipartNodeCreationTest() throws Exception { setRequestContext(user1); String myNodeId = getMyNodeId(); + // Test Scenarios: + // 1: majorVersion not set - versioningEnabled not set Expect: MAJOR version + // 2: majorVersion not set - versioningEnabled false Expect: versioning disabled + // 3: majorVersion true - versioningEnabled false Expect: versioning disabled + // 4: majorVersion false - versioningEnabled false Expect: versioning disabled + // 5: majorVersion not set - versioningEnabled true Expect: MAJOR version + // 6: majorVersion true - versioningEnabled true Expect: MAJOR version + // 7: majorVersion false - versioningEnabled true Expect: Minor version + // 8: majorVersion not set - versioningEnabled False Expect: versioning disabled + // 9: majorVersion not set - versioningEnabled False1 Expect: MAJOR version - // Scenario 1 majorVersion and versionState multipart values are not set. + // Scenario 1: String fileName = "myfile" + UUID.randomUUID() + ".txt"; File file = getResourceFile("quick-2.pdf"); MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); @@ -5633,10 +5643,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertEquals("MAJOR", documentProperties.get("cm:versionType")); assertEquals("1.0", documentProperties.get("cm:versionLabel")); - // Scenario 2 majorVersion is not set versionState is set to none. + // Scenario 2: fileName = "myfile" + UUID.randomUUID() + ".txt"; multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); - multiPartBuilder.setVersioningState("none"); + multiPartBuilder.setVersioningEnabled("false"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5645,11 +5655,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest documentProperties = documentResponse.getProperties(); assertNull(documentProperties); - // Scenario 3 majorVersion is set to true and versionState is set to none. + // Scenario 3: fileName = "myfile" + UUID.randomUUID() + ".txt"; multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); multiPartBuilder.setMajorVersion(true); - multiPartBuilder.setVersioningState("none"); + multiPartBuilder.setVersioningEnabled("false"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5658,11 +5668,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest documentProperties = documentResponse.getProperties(); assertNull(documentProperties); - // Scenario 4 majorVersion is set to false and versionState is set to none. + // Scenario 4: fileName = "myfile" + UUID.randomUUID() + ".txt"; multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); multiPartBuilder.setMajorVersion(false); - multiPartBuilder.setVersioningState("none"); + multiPartBuilder.setVersioningEnabled("false"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5671,39 +5681,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest documentProperties = documentResponse.getProperties(); assertNull(documentProperties); - // Scenario 5 majorVersion is not set versionState is set to minor. + // Scenario 5: 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"); + multiPartBuilder.setVersioningEnabled("true"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5714,11 +5695,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest 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. + // Scenario 6: fileName = "myfile" + UUID.randomUUID() + ".txt"; multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); - multiPartBuilder.setMajorVersion(false); - multiPartBuilder.setVersioningState("major"); + multiPartBuilder.setMajorVersion(true); + multiPartBuilder.setVersioningEnabled("true"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5728,6 +5709,184 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertEquals(2, documentProperties.size()); assertEquals("MAJOR", documentProperties.get("cm:versionType")); assertEquals("1.0", documentProperties.get("cm:versionLabel")); + + // Scenario 7: + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setMajorVersion(false); + multiPartBuilder.setVersioningEnabled("true"); + + 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 8: + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setVersioningEnabled("False"); + + 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 9: + fileName = "myfile" + UUID.randomUUID() + ".txt"; + multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); + multiPartBuilder.setVersioningEnabled("False1"); + + reqBody = multiPartBuilder.build(); + response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + } + + @Test + public void versioningEnabledJSONNodeCreationTest() throws Exception + { + setRequestContext(user1); + String myNodeId = getMyNodeId(); + + // Test Scenarios: + // 1: majorVersion not set - versioningEnabled not set Expect: versioning disabled + // 2: majorVersion not set - versioningEnabled false Expect: versioning disabled + // 3: majorVersion true - versioningEnabled false Expect: versioning disabled + // 4: majorVersion false - versioningEnabled false Expect: versioning disabled + // 5: majorVersion not set - versioningEnabled true Expect: MAJOR version + // 6: majorVersion true - versioningEnabled true Expect: MAJOR version + // 7: majorVersion false - versioningEnabled true Expect: Minor version + // 8: majorVersion not set - versioningEnabled False Expect: versioning disabled + // 9: majorVersion not set - versioningEnabled False1 Expect: versioning disabled + // 10 majorVersion not set - versioningenabled true Expect: versioning disabled + + Document d1 = new Document(); + Map requestHeaders = new HashMap<>(); + + //Scenario 1: + d1.setName("testDoc" + UUID.randomUUID()); + d1.setNodeType(TYPE_CM_CONTENT); + + HttpResponse response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + Document documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + Map documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 2: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","false"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 3: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","false"); + requestHeaders.put("majorVersion","true"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 4: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","false"); + requestHeaders.put("majorVersion","false"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 5: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","true"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + + //Scenario 6: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","true"); + requestHeaders.put("majorVersion","true"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals("MAJOR", documentProperties.get("cm:versionType")); + assertEquals("1.0", documentProperties.get("cm:versionLabel")); + + //Scenario 7: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","true"); + requestHeaders.put("majorVersion","false"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertEquals("MINOR", documentProperties.get("cm:versionType")); + assertEquals("0.1", documentProperties.get("cm:versionLabel")); + + //Scenario 8: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","False"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 9: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningEnabled","False1"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); + + //Scenario 10: + d1.setName("testDoc" + UUID.randomUUID()); + requestHeaders = new HashMap<>(); + requestHeaders.put("versioningenabled","true"); + + response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); + documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + + documentProperties = documentResponse.getProperties(); + assertNull(documentProperties); } @Test public void testAuditableProperties() throws Exception 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 b76da9a594..433caeff30 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 @@ -56,7 +56,7 @@ public class MultiPartBuilder private String updateNodeRef; private String description; private String contentTypeQNameStr; - private String versioningState; + private String versioningEnabled; private List aspects = Collections.emptyList(); private Boolean majorVersion; private Boolean overwrite; @@ -76,7 +76,7 @@ public class MultiPartBuilder this.updateNodeRef = that.updateNodeRef; this.description = that.description; this.contentTypeQNameStr = that.contentTypeQNameStr; - this.versioningState = that.versioningState; + this.versioningEnabled = that.versioningEnabled; this.aspects = new ArrayList<>(that.aspects); this.majorVersion = that.majorVersion; this.overwrite = that.overwrite; @@ -126,9 +126,9 @@ public class MultiPartBuilder return this; } - public MultiPartBuilder setVersioningState(String versioningState) + public MultiPartBuilder setVersioningEnabled(String versioningEnabled) { - this.versioningState = versioningState; + this.versioningEnabled = versioningEnabled; return this; } @@ -285,7 +285,7 @@ public class MultiPartBuilder addPartIfNotNull(parts, "updatenoderef", updateNodeRef); addPartIfNotNull(parts, "description", description); addPartIfNotNull(parts, "contenttype", contentTypeQNameStr); - addPartIfNotNull(parts, "versioningstate", versioningState); + addPartIfNotNull(parts, "versioningenabled", versioningEnabled); addPartIfNotNull(parts, "aspects", getCommaSeparated(aspects)); addPartIfNotNull(parts, "majorversion", majorVersion); addPartIfNotNull(parts, "overwrite", overwrite); From 53e87b347e499940574f7b2cf573ad9ab19b3acb Mon Sep 17 00:00:00 2001 From: Epure Alexandru-Eusebiu Date: Fri, 13 Nov 2020 18:16:00 +0200 Subject: [PATCH 4/5] format code. --- .../main/java/org/alfresco/rest/api/impl/NodesImpl.java | 6 +++--- .../java/org/alfresco/rest/api/tests/NodeApiTest.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) 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 0668015694..bf51f67aec 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 @@ -1849,10 +1849,10 @@ public class NodesImpl implements Nodes versionMajor = Boolean.valueOf(str); } String versioningEnabledStringValue = parameters.getParameter("versioningEnabled"); - if(null != versioningEnabledStringValue) + if (null != versioningEnabledStringValue) { boolean versioningEnabled = Boolean.parseBoolean(versioningEnabledStringValue); - if(versioningEnabled) + if (versioningEnabled) { versionMajor = (null != versionMajor) ? versionMajor : true; } @@ -2987,7 +2987,7 @@ public class NodesImpl implements Nodes case "versioningenabled": String versioningEnabledStringValue = getStringOrNull(field.getValue()); - if(null != versioningEnabledStringValue) + if (null != versioningEnabledStringValue) { versioningEnabled = !versioningEnabledStringValue.equalsIgnoreCase("false"); } 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 4201fcce2c..73fa568c32 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 @@ -5626,7 +5626,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // 6: majorVersion true - versioningEnabled true Expect: MAJOR version // 7: majorVersion false - versioningEnabled true Expect: Minor version // 8: majorVersion not set - versioningEnabled False Expect: versioning disabled - // 9: majorVersion not set - versioningEnabled False1 Expect: MAJOR version + // 9: majorVersion not set - versioningEnabled invalid Expect: MAJOR version // Scenario 1: String fileName = "myfile" + UUID.randomUUID() + ".txt"; @@ -5740,7 +5740,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Scenario 9: fileName = "myfile" + UUID.randomUUID() + ".txt"; multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)); - multiPartBuilder.setVersioningEnabled("False1"); + multiPartBuilder.setVersioningEnabled("invalid"); reqBody = multiPartBuilder.build(); response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201); @@ -5766,7 +5766,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // 6: majorVersion true - versioningEnabled true Expect: MAJOR version // 7: majorVersion false - versioningEnabled true Expect: Minor version // 8: majorVersion not set - versioningEnabled False Expect: versioning disabled - // 9: majorVersion not set - versioningEnabled False1 Expect: versioning disabled + // 9: majorVersion not set - versioningEnabled invalid Expect: versioning disabled // 10 majorVersion not set - versioningenabled true Expect: versioning disabled Document d1 = new Document(); @@ -5869,7 +5869,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest //Scenario 9: d1.setName("testDoc" + UUID.randomUUID()); requestHeaders = new HashMap<>(); - requestHeaders.put("versioningEnabled","False1"); + requestHeaders.put("versioningEnabled","invalid"); response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1),requestHeaders, null, null, 201); documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); From 1804f7943b11cd61484cb44a57a0adc75c8dcfd7 Mon Sep 17 00:00:00 2001 From: Epure Alexandru-Eusebiu Date: Mon, 16 Nov 2020 12:00:11 +0200 Subject: [PATCH 5/5] MNT-22036 Add comment for versioningEnabled property updating mechanism. --- .../main/java/org/alfresco/rest/api/impl/NodesImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 bf51f67aec..ec093897e2 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 @@ -2984,11 +2984,16 @@ public class NodesImpl implements Nodes case "renditions": renditionNames = getStringOrNull(field.getValue()); break; - - case "versioningenabled": + case "versioningenabled": String versioningEnabledStringValue = getStringOrNull(field.getValue()); if (null != versioningEnabledStringValue) { + // MNT-22036 versioningenabled parameter was added to disable versioning of newly created nodes. + // The default API mechanism should not be changed/affected. + // Versioning is enabled by default when creating a node using form-data. + // To preserve this, versioningEnabled value must be 'true' for any given value typo/valuesNotSupported (except case-insensitive 'false') + // .equalsIgnoreCase("false") will return true only when the input value is 'false' + // !.equalsIgnoreCase("false") will return false only when the input value is 'false' versioningEnabled = !versioningEnabledStringValue.equalsIgnoreCase("false"); } break;