diff --git a/remote-api/src/main/java/org/alfresco/rest/api/nodes/NodeFolderSizeRelation.java b/remote-api/src/main/java/org/alfresco/rest/api/nodes/NodeFolderSizeRelation.java index 2897bb05e9..c7a82c5159 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/nodes/NodeFolderSizeRelation.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/nodes/NodeFolderSizeRelation.java @@ -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>,RelationshipResourceAction.ReadById>, InitializingBean +public class NodeFolderSizeRelation implements CalculateSize>, ReadById>, 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. *

* 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 createById(String nodeId, Parameters params) { NodeRef nodeRef = nodes.validateNode(nodeId); - Map resetFolderOutput = new HashMap<>(); - int maxItems = params.getPaging().getMaxItems(); + int maxItems = Math.min(params.getPaging().getMaxItems(), 1000); QName qName = nodeService.getType(nodeRef); Map 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 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 readById(String nodeId, String id, Parameters parameters) { NodeRef nodeRef = nodes.validateNode(nodeId); + Object resultAction; + Map result = new HashMap<>(); validatePermissions(nodeRef, nodeId); validateNodeType(nodeRef); try { LOG.info("Retrieving OUTPUT from ActionExecutor in NodeFolderSizeRelation:readById"); - Map properties = nodeService.getProperties(nodeRef); - Map 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 mapResult = (Map) 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 getResult(Object resultAction) + { + Map result = new HashMap<>(); + + if (resultAction == null) + { + result.put("status", "NOT-INITIATED"); + } + else + { + Map mapResult = (Map) 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); diff --git a/remote-api/src/main/resources/alfresco/public-rest-context.xml b/remote-api/src/main/resources/alfresco/public-rest-context.xml index b1c39daa82..c6375177b1 100644 --- a/remote-api/src/main/resources/alfresco/public-rest-context.xml +++ b/remote-api/src/main/resources/alfresco/public-rest-context.xml @@ -1776,5 +1776,6 @@ + diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeFolderSizeApiTest.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeFolderSizeApiTest.java index 29e97febb2..a10093d5f3 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeFolderSizeApiTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeFolderSizeApiTest.java @@ -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. *

GET:

@@ -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 :/alfresco/api//public/alfresco/versions/1/nodes//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 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); } diff --git a/repository/src/main/java/org/alfresco/repo/action/executer/NodeSizeActionExecuter.java b/repository/src/main/java/org/alfresco/repo/action/executer/NodeSizeActionExecuter.java index 8b16eff3b1..685bf13357 100644 --- a/repository/src/main/java/org/alfresco/repo/action/executer/NodeSizeActionExecuter.java +++ b/repository/src/main/java/org/alfresco/repo/action/executer/NodeSizeActionExecuter.java @@ -62,6 +62,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase */ public static final String NAME = "folder-size"; public static final String PAGE_SIZE = "page-size"; + public static final String RESULT = "size-result"; /** * The node service @@ -189,8 +190,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase if(isCalculationCompleted) { - nodeService.setProperty(nodeRef, FolderSizeModel.PROP_OUTPUT, (Serializable) response); - nodeService.setProperty(nodeRef, FolderSizeModel.PROP_ERROR,null); + ruleAction.setParameterValue(NodeSizeActionExecuter.RESULT, (Serializable) response); } }