mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-01 14:41:46 +00:00
[MNT-24127] Added Endpoint to Calculate Size of the folder with Integration Test Cases [ags][tas]
This commit is contained in:
@@ -37,10 +37,15 @@ import org.alfresco.rest.framework.WebApiParameters;
|
||||
import org.alfresco.rest.framework.core.exceptions.InvalidNodeTypeException;
|
||||
import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction.CalculateSize;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction.ReadById;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
import org.alfresco.service.cmr.action.Action;
|
||||
import org.alfresco.service.cmr.action.ActionService;
|
||||
import org.alfresco.service.cmr.action.ActionTrackingService;
|
||||
import org.alfresco.service.cmr.action.ExecutionDetails;
|
||||
import org.alfresco.service.cmr.action.ExecutionSummary;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
@@ -54,6 +59,7 @@ import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.extensions.webscripts.Status;
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -62,7 +68,7 @@ import java.util.Map;
|
||||
*/
|
||||
|
||||
@RelationshipResource(name = "calculateSize", entityResource = NodesEntityResource.class, title = "Calculate size")
|
||||
public class NodeFolderSizeRelation implements RelationshipResourceAction.CalculateSize<Map<String, Object>>,RelationshipResourceAction.ReadById<Map<String, Object>>, InitializingBean
|
||||
public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>>, ReadById<Map<String, Object>>, InitializingBean
|
||||
{
|
||||
private Nodes nodes;
|
||||
private SearchService searchService;
|
||||
@@ -70,6 +76,8 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
private PermissionService permissionService;
|
||||
private NodeService nodeService;
|
||||
private ActionService actionService;
|
||||
private ActionTrackingService actionTrackingService;
|
||||
private Action folderSizeAction;
|
||||
private static final String NOT_A_VALID_NODEID = "Node Id does not refer to a valid type [should be of folder type]";
|
||||
|
||||
/**
|
||||
@@ -113,6 +121,11 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
ParameterCheck.mandatory("nodes", this.nodes);
|
||||
}
|
||||
|
||||
public void setActionTrackingService(ActionTrackingService actionTrackingService)
|
||||
{
|
||||
this.actionTrackingService = actionTrackingService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Folder Size - returns size of a folder.
|
||||
*
|
||||
@@ -122,19 +135,16 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
* GET/calculateSize endpoint to check if the action's status has been completed, comprising the size of the node in bytes.
|
||||
* <p>
|
||||
* If NodeId does not exist, EntityNotFoundException (status 404).
|
||||
* If nodeId does not represent a folder, InvalidNodeTypeException (status 400).
|
||||
* If nodeId does not represent a folder, InvalidNodeTypeException (status 422).
|
||||
*/
|
||||
@Override
|
||||
@WebApiDescription(title = "Calculating Folder Size", description = "Calculating size of a folder", successStatus = Status.STATUS_ACCEPTED)
|
||||
public Map<String, Object> createById(String nodeId, Parameters params)
|
||||
{
|
||||
NodeRef nodeRef = nodes.validateNode(nodeId);
|
||||
Map<String, Object> resetFolderOutput = new HashMap<>();
|
||||
int maxItems = params.getPaging().getMaxItems();
|
||||
int maxItems = Math.min(params.getPaging().getMaxItems(), 1000);
|
||||
QName qName = nodeService.getType(nodeRef);
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
resetFolderOutput.put("status","IN-PROGRESS");
|
||||
nodeService.setProperty(nodeRef, FolderSizeModel.PROP_OUTPUT, (Serializable) resetFolderOutput);
|
||||
|
||||
validatePermissions(nodeRef, nodeId);
|
||||
|
||||
@@ -145,13 +155,16 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
|
||||
try
|
||||
{
|
||||
Action folderSizeAction = actionService.createAction(NodeSizeActionExecuter.NAME);
|
||||
folderSizeAction = actionService.createAction(NodeSizeActionExecuter.NAME);
|
||||
folderSizeAction.setTrackStatus(true);
|
||||
folderSizeAction.setExecuteAsynchronously(true);
|
||||
folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems);
|
||||
folderSizeAction.setParameterValue(NodeSizeActionExecuter.RESULT, "IN-PROGRESS");
|
||||
actionService.executeAction(folderSizeAction, nodeRef, false, true);
|
||||
LOG.info(" Executing ActionExecutor in NodeFolderSizeRelation:createById ");
|
||||
result.put("nodeId", nodeId);
|
||||
List<ExecutionSummary> executionSummaryList = actionTrackingService.getExecutingActions(NodeSizeActionExecuter.NAME);
|
||||
ExecutionDetails executionDetails = actionTrackingService.getExecutionDetails(executionSummaryList.get(0));
|
||||
result.put("executionId", executionDetails.getActionId());
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -167,33 +180,22 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
public Map<String, Object> readById(String nodeId, String id, Parameters parameters)
|
||||
{
|
||||
NodeRef nodeRef = nodes.validateNode(nodeId);
|
||||
Object resultAction;
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
validatePermissions(nodeRef, nodeId);
|
||||
validateNodeType(nodeRef);
|
||||
|
||||
try
|
||||
{
|
||||
LOG.info("Retrieving OUTPUT from ActionExecutor in NodeFolderSizeRelation:readById");
|
||||
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
if (properties == null || !properties.containsKey(FolderSizeModel.PROP_OUTPUT))
|
||||
if(folderSizeAction!=null)
|
||||
{
|
||||
result.put("status", "NOT-INITIATED");
|
||||
resultAction = folderSizeAction.getParameterValue(NodeSizeActionExecuter.RESULT);
|
||||
result = getResult(resultAction);
|
||||
}
|
||||
else
|
||||
{
|
||||
Map<String, Object> mapResult = (Map<String, Object>) properties.get(FolderSizeModel.PROP_OUTPUT);
|
||||
Object status = mapResult.get("status");
|
||||
|
||||
if (status != null && status.toString().contains("IN-PROGRESS"))
|
||||
{
|
||||
result.put("status", "IN-PROGRESS");
|
||||
}
|
||||
else
|
||||
{
|
||||
mapResult.put("status", "COMPLETED");
|
||||
result = mapResult;
|
||||
}
|
||||
result.put("status", "NOT-INITIATED");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -204,6 +206,31 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> getResult(Object resultAction)
|
||||
{
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
if (resultAction == null)
|
||||
{
|
||||
result.put("status", "NOT-INITIATED");
|
||||
}
|
||||
else
|
||||
{
|
||||
Map<String, Object> mapResult = (Map<String, Object>) resultAction;
|
||||
|
||||
if(!mapResult.containsKey("size"))
|
||||
{
|
||||
result.put("status", "IN-PROGRESS");
|
||||
}
|
||||
else
|
||||
{
|
||||
mapResult.put("status", "COMPLETED");
|
||||
result = mapResult;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void validatePermissions(NodeRef nodeRef, String nodeId)
|
||||
{
|
||||
Node nodeInfo = nodes.getNode(nodeId);
|
||||
|
@@ -1776,5 +1776,6 @@
|
||||
<property name="serviceRegistry" ref="ServiceRegistry"/>
|
||||
<property name="nodeService" ref="nodeService" />
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
<property name="actionTrackingService" ref="actionTrackingService" />
|
||||
</bean>
|
||||
</beans>
|
||||
|
@@ -25,24 +25,16 @@
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.rest.api.model.ContentInfo;
|
||||
import org.alfresco.rest.api.model.Node;
|
||||
import org.alfresco.rest.api.model.NodeTarget;
|
||||
import org.alfresco.rest.api.model.Site;
|
||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.client.data.Folder;
|
||||
import org.alfresco.rest.api.tests.client.data.Node;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
import org.alfresco.service.cmr.repository.ContentData;
|
||||
import org.alfresco.service.cmr.repository.MimetypeService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.FixMethodOrder;
|
||||
@@ -52,15 +44,13 @@ import org.junit.runners.JUnit4;
|
||||
import org.junit.runners.MethodSorters;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* V1 REST API tests for Folder size
|
||||
@@ -150,7 +140,6 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
|
||||
assertNotNull("Content node ID should not be null", contentNodeId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test case for GET/calculateSize, to retrieve FolderSize.
|
||||
* <p>GET:</p>
|
||||
@@ -168,6 +157,8 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
|
||||
String jsonResponse = String.valueOf(response.getJsonResponse());
|
||||
assertNotNull("JSON response should not be null", jsonResponse);
|
||||
|
||||
assertTrue("We are not getting correct response",jsonResponse.contains("size") || jsonResponse.contains("status"));
|
||||
|
||||
// Parse the JSON response.
|
||||
Object document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Object.class);
|
||||
assertNotNull("Parsed document should not be null", document);
|
||||
@@ -177,59 +168,6 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
|
||||
assertNotNull("Content node ID should not be null", contentNodeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test case to trigger POST/calculateSize with >200 Children Nodes.
|
||||
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/calculateSize}
|
||||
*/
|
||||
@Test
|
||||
public void testPerformance() throws Exception
|
||||
{
|
||||
Node parentNodes;
|
||||
|
||||
// Logging initial time.
|
||||
LocalDateTime eventTimestamp = LocalDateTime.now();
|
||||
String formattedTimestamp = eventTimestamp.format(DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"));
|
||||
LOG.info(" ********** In NodeFolderSizeApiTest:testPerformance Initial Time :{}", formattedTimestamp);
|
||||
|
||||
// Create a folder within the site document's library.
|
||||
String folderName = "folder" + System.currentTimeMillis();
|
||||
String parentFolderId = addToDocumentLibrary(userOneN1Site, folderName, TYPE_CM_FOLDER);
|
||||
NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE,parentFolderId);
|
||||
QName qName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(nodeRef.getId()));
|
||||
|
||||
for(int i =0;i<300;i++)
|
||||
{
|
||||
Folder folder = createFolder(parentFolderId,"c1" + RUNID);
|
||||
ContentData contentData = new ContentData(null, MimetypeMap.MIMETYPE_TEXT_PLAIN, 10L, null);
|
||||
String mimeType = contentData.getMimetype();
|
||||
String mimeTypeName = mimeTypeService.getDisplaysByMimetype().get(mimeType);
|
||||
org.alfresco.rest.api.tests.client.data.ContentInfo contentInfo1 = new org.alfresco.rest.api.tests.client.data.ContentInfo();
|
||||
contentInfo1.setEncoding(contentData.getEncoding());
|
||||
contentInfo1.setSizeInBytes(contentData.getSize());
|
||||
contentInfo1.setMimeType(mimeType);
|
||||
contentInfo1.setMimeTypeName(mimeTypeName);
|
||||
folder.setContent(contentInfo1);
|
||||
String folderID = addToDocumentLibrary(userOneN1Site, folder.getName(), TYPE_CM_FOLDER);
|
||||
NodeRef folderNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE,folderID);
|
||||
QName assocChildQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(folder.getName()));
|
||||
nodeService.addChild(nodeRef, folderNodeRef , qName, assocChildQName);
|
||||
}
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("nodeId",parentFolderId);
|
||||
params.put("maxItems","100");
|
||||
|
||||
HttpResponse response = post(getFolderSizeUrl(parentFolderId), toJsonAsStringNonNull(params), 202);
|
||||
Object document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Object.class);
|
||||
String contentNodeId = document.toString();
|
||||
if(contentNodeId != null)
|
||||
{
|
||||
eventTimestamp = LocalDateTime.now();
|
||||
formattedTimestamp = eventTimestamp.format(DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"));
|
||||
LOG.info(" ********** In NodeFolderSizeApiTest:testPerformance Completed Time :{}", formattedTimestamp);
|
||||
}
|
||||
assertNotNull(contentNodeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test case for others HTTP status codes.
|
||||
*/
|
||||
@@ -243,6 +181,15 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
|
||||
NodeTarget tgt = new NodeTarget();
|
||||
tgt.setTargetParentId(folderId);
|
||||
HttpResponse response = post(getFolderSizeUrl(UUID.randomUUID().toString()), toJsonAsStringNonNull(tgt), null, 404);
|
||||
|
||||
assertNotNull(response);
|
||||
|
||||
// create node
|
||||
Node n = new Node();
|
||||
n.setName("temp1");
|
||||
n.setNodeType("");
|
||||
|
||||
response = post(getFolderSizeUrl(n.getName()), RestApiUtil.toJsonAsStringNonNull(n), 422);
|
||||
assertNotNull(response);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user