mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-21 18:09:20 +00:00
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/BRANCHES/DEV/5.2.N/root@129173 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1956,6 +1956,31 @@ public class NodesImpl implements Nodes
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Node updateNode(String nodeId, Node nodeInfo, Parameters parameters)
|
public Node updateNode(String nodeId, Node nodeInfo, Parameters parameters)
|
||||||
|
{
|
||||||
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
@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<Node>()
|
||||||
|
{
|
||||||
|
@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);
|
final NodeRef nodeRef = validateNode(nodeId);
|
||||||
|
|
||||||
@@ -2098,10 +2123,7 @@ public class NodesImpl implements Nodes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivityInfo activityInfo = getActivityInfo(getParentNodeRef(nodeRef), nodeRef);
|
return nodeRef;
|
||||||
postActivity(Activity_Type.UPDATED, activityInfo, false);
|
|
||||||
|
|
||||||
return getFolderOrDocument(nodeRef.getId(), parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
package org.alfresco.rest.api.nodes;
|
package org.alfresco.rest.api.nodes;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.node.integrity.IntegrityException;
|
||||||
import org.alfresco.repo.policy.BehaviourFilter;
|
import org.alfresco.repo.policy.BehaviourFilter;
|
||||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||||
import org.alfresco.repo.version.Version2Model;
|
import org.alfresco.repo.version.Version2Model;
|
||||||
@@ -254,7 +255,11 @@ public class NodeVersionsRelation extends AbstractNodeRelation implements
|
|||||||
Map<QName, Serializable> props = sr.getNodeService().getProperties(nodeRef);
|
Map<QName, Serializable> props = sr.getNodeService().getProperties(nodeRef);
|
||||||
if (props.get(ContentModel.PROP_VERSION_LABEL) == null)
|
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)
|
if (props.get(ContentModel.PROP_VERSION_TYPE) != null)
|
||||||
{
|
{
|
||||||
// minor fix up to versionable aspect - ie. remove versionType
|
// 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);
|
behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_VERSIONABLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2713,7 +2713,8 @@ public class NodeApiTest extends AbstractBaseApiTest
|
|||||||
response = put(URL_NODES, user1, dId, toJsonAsStringNonNull(dUpdate), null, 200);
|
response = put(URL_NODES, user1, dId, toJsonAsStringNonNull(dUpdate), null, 200);
|
||||||
documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
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.setAspectNames(Arrays.asList("cm:auditable","cm:titled","cm:versionable"));
|
||||||
d1.expected(documentResp);
|
d1.expected(documentResp);
|
||||||
|
|
||||||
|
@@ -41,6 +41,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -338,12 +339,10 @@ public class NodeVersionsApiTest extends AbstractBaseApiTest
|
|||||||
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
||||||
assertEquals("1.2", nodeResp.getProperties().get("cm:versionLabel"));
|
assertEquals("1.2", nodeResp.getProperties().get("cm:versionLabel"));
|
||||||
|
|
||||||
delete(getNodeVersionsUrl(docId), user1, "1.2", null, 204);
|
// -ve test - cannot delete last version (via delete version api call) (see REPO-835 & REPO-834)
|
||||||
|
delete(getNodeVersionsUrl(docId), user1, "1.2", null, 422);
|
||||||
response = getAll(getNodeVersionsUrl(docId), user1, null, null, 200);
|
|
||||||
nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class);
|
|
||||||
assertEquals(0, nodes.size());
|
|
||||||
|
|
||||||
|
/* note: currently we cannot delete last version so this is not applicable
|
||||||
// check live node - removing last version does not (currently) remove versionable aspect
|
// check live node - removing last version does not (currently) remove versionable aspect
|
||||||
response = getSingle(URL_NODES, user1, docId, 200);
|
response = getSingle(URL_NODES, user1, docId, 200);
|
||||||
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
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:versionLabel"));
|
||||||
assertNull(props.get("cm:versionType")); // note: see special fix in delete version API (at least for now)
|
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 ..
|
// Update again ..
|
||||||
String textContent = "more changes 1";
|
String textContent = "more changes 0";
|
||||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(textContent.getBytes());
|
ByteArrayInputStream inputStream = new ByteArrayInputStream(textContent.getBytes());
|
||||||
File txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt");
|
File txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt");
|
||||||
PublicApiHttpClient.BinaryPayload payload = new PublicApiHttpClient.BinaryPayload(txtFile);
|
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);
|
response = putBinary(getNodeContentUrl(docId), user1, payload, null, null, 200);
|
||||||
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
||||||
assertTrue(nodeResp.getAspectNames().contains("cm:versionable"));
|
assertTrue(nodeResp.getAspectNames().contains("cm:versionable"));
|
||||||
assertEquals("1.0", nodeResp.getProperties().get("cm:versionLabel"));
|
assertEquals("1.3", nodeResp.getProperties().get("cm:versionLabel"));
|
||||||
assertEquals("MAJOR", nodeResp.getProperties().get("cm:versionType"));
|
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<String> 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<String, Object> 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";
|
textContent = "more changes 2";
|
||||||
inputStream = new ByteArrayInputStream(textContent.getBytes());
|
inputStream = new ByteArrayInputStream(textContent.getBytes());
|
||||||
txtFile = TempFileProvider.createTempFile(inputStream, getClass().getSimpleName(), ".txt");
|
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);
|
response = putBinary(getNodeContentUrl(docId), user1, payload, null, null, 200);
|
||||||
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
|
||||||
assertTrue(nodeResp.getAspectNames().contains("cm:versionable"));
|
assertTrue(nodeResp.getAspectNames().contains("cm:versionable"));
|
||||||
assertEquals("1.1", nodeResp.getProperties().get("cm:versionLabel"));
|
props = nodeResp.getProperties();
|
||||||
assertEquals("MINOR", nodeResp.getProperties().get("cm:versionType"));
|
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
|
finally
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user