[MNT-24127] Added Endpoint to Calculate Size of the folder with Integration Test Cases [ags][tas]

This commit is contained in:
mohit-singh4
2024-07-02 14:15:24 +05:30
parent 3f8be2bcd3
commit 6040b138ef
4 changed files with 68 additions and 93 deletions

View File

@@ -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);

View File

@@ -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>

View File

@@ -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);
}