From 575183a5ac2fe8c93e14f0b4286aae4a88ec75e8 Mon Sep 17 00:00:00 2001 From: Alexandru Epure Date: Tue, 9 Aug 2016 14:13:29 +0000 Subject: [PATCH] Merged 5.2.N (5.2.1) to HEAD (5.2) 129173 mmuller: Merged RETURN-OF-THE-API (5.2.0) to 5.2.N (5.2.1) 128583 jvonka: V1 REST API: Node Version History - tweak "delete version" operation - cannot delete last version for now (return 422) REPO-835 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@129347 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/rest/api/impl/NodesImpl.java | 32 +++++-- .../rest/api/nodes/NodeVersionsRelation.java | 8 +- .../alfresco/rest/api/tests/NodeApiTest.java | 3 +- .../rest/api/tests/NodeVersionsApiTest.java | 86 ++++++++++++++++--- 4 files changed, 112 insertions(+), 17 deletions(-) diff --git a/source/java/org/alfresco/rest/api/impl/NodesImpl.java b/source/java/org/alfresco/rest/api/impl/NodesImpl.java index 2ca0c118e9..cedc047078 100644 --- a/source/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/source/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -1956,6 +1956,31 @@ public class NodesImpl implements Nodes @Override public Node updateNode(String nodeId, Node nodeInfo, Parameters parameters) + { + retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + NodeRef nodeRef = updateNodeImpl(nodeId, nodeInfo, parameters); + ActivityInfo activityInfo = getActivityInfo(getParentNodeRef(nodeRef), nodeRef); + postActivity(Activity_Type.UPDATED, activityInfo, false); + + return null; + } + }, false, true); + + return retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Node execute() throws Throwable + { + return getFolderOrDocument(nodeId, parameters); + } + }, false, false); + } + + protected NodeRef updateNodeImpl(String nodeId, Node nodeInfo, Parameters parameters) { final NodeRef nodeRef = validateNode(nodeId); @@ -2097,11 +2122,8 @@ public class NodesImpl implements Nodes throw new ConstraintViolatedException(dcne.getMessage()); } } - - ActivityInfo activityInfo = getActivityInfo(getParentNodeRef(nodeRef), nodeRef); - postActivity(Activity_Type.UPDATED, activityInfo, false); - - return getFolderOrDocument(nodeRef.getId(), parameters); + + return nodeRef; } @Override diff --git a/source/java/org/alfresco/rest/api/nodes/NodeVersionsRelation.java b/source/java/org/alfresco/rest/api/nodes/NodeVersionsRelation.java index 5afa2097eb..fcd0a55275 100644 --- a/source/java/org/alfresco/rest/api/nodes/NodeVersionsRelation.java +++ b/source/java/org/alfresco/rest/api/nodes/NodeVersionsRelation.java @@ -26,6 +26,7 @@ package org.alfresco.rest.api.nodes; import org.alfresco.model.ContentModel; +import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.version.Version2Model; @@ -254,7 +255,11 @@ public class NodeVersionsRelation extends AbstractNodeRelation implements Map props = sr.getNodeService().getProperties(nodeRef); if (props.get(ContentModel.PROP_VERSION_LABEL) == null) { - // last version was deleted + // attempt to delete last version - we do not yet support this (see REPO-835 & REPO-834) + // note: alternatively, the client can remove the "cm:versionable" aspect (if permissions allow) to clear the version history and disable versioning + throw new IntegrityException("Cannot delete last version (did you mean to disable versioning instead ?) ["+nodeId+","+versionId+"]", null); + + /* if (props.get(ContentModel.PROP_VERSION_TYPE) != null) { // minor fix up to versionable aspect - ie. remove versionType @@ -270,6 +275,7 @@ public class NodeVersionsRelation extends AbstractNodeRelation implements behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_VERSIONABLE); } } + */ } } 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 b7d038c2c9..592b9b0571 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -2713,7 +2713,8 @@ public class NodeApiTest extends AbstractBaseApiTest response = put(URL_NODES, user1, dId, toJsonAsStringNonNull(dUpdate), null, 200); documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); - //d1.getProperties().put("cm:versionLabel","1.0"); // TODO ... fix api ?! + d1.getProperties().put("cm:versionLabel","1.0"); + d1.getProperties().put("cm:versionType","MAJOR"); d1.setAspectNames(Arrays.asList("cm:auditable","cm:titled","cm:versionable")); d1.expected(documentResp); diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeVersionsApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeVersionsApiTest.java index de2aad6649..55a2fc12df 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeVersionsApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeVersionsApiTest.java @@ -41,6 +41,7 @@ import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.File; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -338,12 +339,10 @@ public class NodeVersionsApiTest extends AbstractBaseApiTest nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); assertEquals("1.2", nodeResp.getProperties().get("cm:versionLabel")); - delete(getNodeVersionsUrl(docId), user1, "1.2", null, 204); - - response = getAll(getNodeVersionsUrl(docId), user1, null, null, 200); - nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); - assertEquals(0, nodes.size()); + // -ve test - cannot delete last version (via delete version api call) (see REPO-835 & REPO-834) + delete(getNodeVersionsUrl(docId), user1, "1.2", null, 422); + /* note: currently we cannot delete last version so this is not applicable // check live node - removing last version does not (currently) remove versionable aspect response = getSingle(URL_NODES, user1, docId, 200); nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); @@ -354,9 +353,15 @@ public class NodeVersionsApiTest extends AbstractBaseApiTest assertNull(props.get("cm:versionLabel")); assertNull(props.get("cm:versionType")); // note: see special fix in delete version API (at least for now) } + */ + + response = getAll(getNodeVersionsUrl(docId), user1, null, null, 200); + nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); + assertEquals(1, nodes.size()); + assertEquals("1.2", nodes.get(0).getId()); // Update again .. - String textContent = "more changes 1"; + String textContent = "more changes 0"; ByteArrayInputStream inputStream = new ByteArrayInputStream(textContent.getBytes()); File txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt"); PublicApiHttpClient.BinaryPayload payload = new PublicApiHttpClient.BinaryPayload(txtFile); @@ -364,9 +369,65 @@ public class NodeVersionsApiTest extends AbstractBaseApiTest response = putBinary(getNodeContentUrl(docId), user1, payload, null, null, 200); nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); assertTrue(nodeResp.getAspectNames().contains("cm:versionable")); - assertEquals("1.0", nodeResp.getProperties().get("cm:versionLabel")); - assertEquals("MAJOR", nodeResp.getProperties().get("cm:versionType")); + assertEquals("1.3", nodeResp.getProperties().get("cm:versionLabel")); + assertEquals("MINOR", nodeResp.getProperties().get("cm:versionType")); + + // remove versionable aspect (this will clear the history and disable versioning) + response = getSingle(URL_NODES, user1, docId, 200); + nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); + List aspectNamesToKeep = new ArrayList<>(); + aspectNamesToKeep.addAll(nodeResp.getAspectNames()); + aspectNamesToKeep.remove("cm:versionable"); + + Node nUpdate = new Node(); + nUpdate.setAspectNames(aspectNamesToKeep); + + response = put(URL_NODES, user1, docId, toJsonAsStringNonNull(nUpdate), null, 200); + nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); + assertFalse(nodeResp.getAspectNames().contains("cm:versionable")); + Map props = nodeResp.getProperties(); + if (props != null) + { + assertNull(props.get("cm:versionLabel")); + assertNull(props.get("cm:versionType")); + } + + response = getAll(getNodeVersionsUrl(docId), user1, null, null, 200); + nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); + assertEquals(0, nodes.size()); + + // Update again .. + textContent = "more changes 1"; + inputStream = new ByteArrayInputStream(textContent.getBytes()); + txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt"); + payload = new PublicApiHttpClient.BinaryPayload(txtFile); + response = putBinary(getNodeContentUrl(docId), user1, payload, null, null, 200); + nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); + assertFalse(nodeResp.getAspectNames().contains("cm:versionable")); + + // re-enable versioning (default model properties should cause initial version to be created as 1.0) + response = getSingle(URL_NODES, user1, docId, 200); + nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); + aspectNamesToKeep = new ArrayList<>(); + aspectNamesToKeep.addAll(nodeResp.getAspectNames()); + aspectNamesToKeep.add("cm:versionable"); + + nUpdate = new Node(); + nUpdate.setAspectNames(aspectNamesToKeep); + + response = put(URL_NODES, user1, docId, toJsonAsStringNonNull(nUpdate), null, 200); + nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); + assertTrue(nodeResp.getAspectNames().contains("cm:versionable")); + props = nodeResp.getProperties(); + assertEquals("1.0", props.get("cm:versionLabel")); + assertEquals("MAJOR", props.get("cm:versionType")); + + // double-check content + response = getSingle(getNodeVersionsUrl(docId), user1, "1.0/content", null, 200); + assertEquals(textContent, response.getResponse()); + + // Update again .. textContent = "more changes 2"; inputStream = new ByteArrayInputStream(textContent.getBytes()); txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt"); @@ -375,8 +436,13 @@ public class NodeVersionsApiTest extends AbstractBaseApiTest response = putBinary(getNodeContentUrl(docId), user1, payload, null, null, 200); nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); assertTrue(nodeResp.getAspectNames().contains("cm:versionable")); - assertEquals("1.1", nodeResp.getProperties().get("cm:versionLabel")); - assertEquals("MINOR", nodeResp.getProperties().get("cm:versionType")); + props = nodeResp.getProperties(); + assertEquals("1.1", props.get("cm:versionLabel")); + assertEquals("MINOR", props.get("cm:versionType")); + + // double-check content + response = getSingle(getNodeVersionsUrl(docId), user1, "1.1/content", null, 200); + assertEquals(textContent, response.getResponse()); } finally {