[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.core.exceptions.InvalidNodeTypeException;
import org.alfresco.rest.framework.resource.RelationshipResource; 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;
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.rest.framework.resource.parameters.Parameters;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionService; 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.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
@@ -54,6 +59,7 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@@ -62,7 +68,7 @@ import java.util.Map;
*/ */
@RelationshipResource(name = "calculateSize", entityResource = NodesEntityResource.class, title = "Calculate size") @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 Nodes nodes;
private SearchService searchService; private SearchService searchService;
@@ -70,6 +76,8 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
private PermissionService permissionService; private PermissionService permissionService;
private NodeService nodeService; private NodeService nodeService;
private ActionService actionService; 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]"; 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); ParameterCheck.mandatory("nodes", this.nodes);
} }
public void setActionTrackingService(ActionTrackingService actionTrackingService)
{
this.actionTrackingService = actionTrackingService;
}
/** /**
* Folder Size - returns size of a folder. * 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. * GET/calculateSize endpoint to check if the action's status has been completed, comprising the size of the node in bytes.
* <p> * <p>
* If NodeId does not exist, EntityNotFoundException (status 404). * 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 @Override
@WebApiDescription(title = "Calculating Folder Size", description = "Calculating size of a folder", successStatus = Status.STATUS_ACCEPTED) @WebApiDescription(title = "Calculating Folder Size", description = "Calculating size of a folder", successStatus = Status.STATUS_ACCEPTED)
public Map<String, Object> createById(String nodeId, Parameters params) public Map<String, Object> createById(String nodeId, Parameters params)
{ {
NodeRef nodeRef = nodes.validateNode(nodeId); NodeRef nodeRef = nodes.validateNode(nodeId);
Map<String, Object> resetFolderOutput = new HashMap<>(); int maxItems = Math.min(params.getPaging().getMaxItems(), 1000);
int maxItems = params.getPaging().getMaxItems();
QName qName = nodeService.getType(nodeRef); QName qName = nodeService.getType(nodeRef);
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
resetFolderOutput.put("status","IN-PROGRESS");
nodeService.setProperty(nodeRef, FolderSizeModel.PROP_OUTPUT, (Serializable) resetFolderOutput);
validatePermissions(nodeRef, nodeId); validatePermissions(nodeRef, nodeId);
@@ -145,13 +155,16 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
try try
{ {
Action folderSizeAction = actionService.createAction(NodeSizeActionExecuter.NAME); folderSizeAction = actionService.createAction(NodeSizeActionExecuter.NAME);
folderSizeAction.setTrackStatus(true); folderSizeAction.setTrackStatus(true);
folderSizeAction.setExecuteAsynchronously(true); folderSizeAction.setExecuteAsynchronously(true);
folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems); folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems);
folderSizeAction.setParameterValue(NodeSizeActionExecuter.RESULT, "IN-PROGRESS");
actionService.executeAction(folderSizeAction, nodeRef, false, true); actionService.executeAction(folderSizeAction, nodeRef, false, true);
LOG.info(" Executing ActionExecutor in NodeFolderSizeRelation:createById "); 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; return result;
} }
catch (Exception ex) catch (Exception ex)
@@ -167,25 +180,45 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
public Map<String, Object> readById(String nodeId, String id, Parameters parameters) public Map<String, Object> readById(String nodeId, String id, Parameters parameters)
{ {
NodeRef nodeRef = nodes.validateNode(nodeId); NodeRef nodeRef = nodes.validateNode(nodeId);
Object resultAction;
Map<String, Object> result = new HashMap<>();
validatePermissions(nodeRef, nodeId); validatePermissions(nodeRef, nodeId);
validateNodeType(nodeRef); validateNodeType(nodeRef);
try try
{ {
LOG.info("Retrieving OUTPUT from ActionExecutor in NodeFolderSizeRelation:readById"); LOG.info("Retrieving OUTPUT from ActionExecutor in NodeFolderSizeRelation:readById");
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef); if(folderSizeAction!=null)
{
resultAction = folderSizeAction.getParameterValue(NodeSizeActionExecuter.RESULT);
result = getResult(resultAction);
}
else
{
result.put("status", "NOT-INITIATED");
}
return result;
}
catch (Exception ex)
{
LOG.error("Exception occurred in NodeFolderSizeRelation:readById {}", ex.getMessage());
throw ex; // Rethrow with original stack trace
}
}
private Map<String, Object> getResult(Object resultAction)
{
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
if (properties == null || !properties.containsKey(FolderSizeModel.PROP_OUTPUT)) if (resultAction == null)
{ {
result.put("status", "NOT-INITIATED"); result.put("status", "NOT-INITIATED");
} }
else else
{ {
Map<String, Object> mapResult = (Map<String, Object>) properties.get(FolderSizeModel.PROP_OUTPUT); Map<String, Object> mapResult = (Map<String, Object>) resultAction;
Object status = mapResult.get("status");
if (status != null && status.toString().contains("IN-PROGRESS")) if(!mapResult.containsKey("size"))
{ {
result.put("status", "IN-PROGRESS"); result.put("status", "IN-PROGRESS");
} }
@@ -197,12 +230,6 @@ public class NodeFolderSizeRelation implements RelationshipResourceAction.Calcul
} }
return result; return result;
} }
catch (Exception ex)
{
LOG.error("Exception occurred in NodeFolderSizeRelation:readById {}", ex.getMessage());
throw ex; // Rethrow with original stack trace
}
}
private void validatePermissions(NodeRef nodeRef, String nodeId) private void validatePermissions(NodeRef nodeRef, String nodeId)
{ {

View File

@@ -1776,5 +1776,6 @@
<property name="serviceRegistry" ref="ServiceRegistry"/> <property name="serviceRegistry" ref="ServiceRegistry"/>
<property name="nodeService" ref="nodeService" /> <property name="nodeService" ref="nodeService" />
<property name="actionService" ref="ActionService"/> <property name="actionService" ref="ActionService"/>
<property name="actionTrackingService" ref="actionTrackingService" />
</bean> </bean>
</beans> </beans>

View File

@@ -25,24 +25,16 @@
*/ */
package org.alfresco.rest.api.tests; package org.alfresco.rest.api.tests;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil; 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.NodeTarget;
import org.alfresco.rest.api.model.Site; import org.alfresco.rest.api.model.Site;
import org.alfresco.rest.api.tests.client.HttpResponse; 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.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.MimetypeService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; 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.security.PermissionService;
import org.alfresco.service.cmr.site.SiteVisibility; 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.After;
import org.junit.Before; import org.junit.Before;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
@@ -52,15 +44,13 @@ import org.junit.runners.JUnit4;
import org.junit.runners.MethodSorters; import org.junit.runners.MethodSorters;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull; import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/** /**
* V1 REST API tests for Folder size * 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); assertNotNull("Content node ID should not be null", contentNodeId);
} }
/** /**
* Test case for GET/calculateSize, to retrieve FolderSize. * Test case for GET/calculateSize, to retrieve FolderSize.
* <p>GET:</p> * <p>GET:</p>
@@ -168,6 +157,8 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
String jsonResponse = String.valueOf(response.getJsonResponse()); String jsonResponse = String.valueOf(response.getJsonResponse());
assertNotNull("JSON response should not be null", jsonResponse); 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. // Parse the JSON response.
Object document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Object.class); Object document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Object.class);
assertNotNull("Parsed document should not be null", document); 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); 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. * Test case for others HTTP status codes.
*/ */
@@ -243,6 +181,15 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest
NodeTarget tgt = new NodeTarget(); NodeTarget tgt = new NodeTarget();
tgt.setTargetParentId(folderId); tgt.setTargetParentId(folderId);
HttpResponse response = post(getFolderSizeUrl(UUID.randomUUID().toString()), toJsonAsStringNonNull(tgt), null, 404); 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); assertNotNull(response);
} }

View File

@@ -62,6 +62,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase
*/ */
public static final String NAME = "folder-size"; public static final String NAME = "folder-size";
public static final String PAGE_SIZE = "page-size"; public static final String PAGE_SIZE = "page-size";
public static final String RESULT = "size-result";
/** /**
* The node service * The node service
@@ -189,8 +190,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase
if(isCalculationCompleted) if(isCalculationCompleted)
{ {
nodeService.setProperty(nodeRef, FolderSizeModel.PROP_OUTPUT, (Serializable) response); ruleAction.setParameterValue(NodeSizeActionExecuter.RESULT, (Serializable) response);
nodeService.setProperty(nodeRef, FolderSizeModel.PROP_ERROR,null);
} }
} }