From 88d10f2f4f68fd40d0b1af49f1d1e8dc14ce426e Mon Sep 17 00:00:00 2001 From: mohit-singh4 Date: Mon, 22 Jul 2024 09:15:19 +0530 Subject: [PATCH] [feature/MNT-24127] EndpointToCalculateFolderSize --- remote-api/pom.xml | 6 ++ .../api/nodes/NodeFolderSizeRelation.java | 74 +++++++++---------- .../framework/core/ResourceInspector.java | 1 + .../alfresco/public-rest-context.xml | 1 + .../framework/tests/core/InspectorTests.java | 10 --- .../executer/NodeSizeActionExecuter.java | 21 ++++-- .../main/resources/alfresco/cache-context.xml | 6 ++ .../main/resources/alfresco/caches.properties | 11 ++- 8 files changed, 72 insertions(+), 58 deletions(-) diff --git a/remote-api/pom.xml b/remote-api/pom.xml index 68d15be3ff..a551b5bd31 100644 --- a/remote-api/pom.xml +++ b/remote-api/pom.xml @@ -60,6 +60,12 @@ test + + org.projectlombok + lombok + provided + + junit 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 7f94332b20..390407815e 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 @@ -27,8 +27,10 @@ package org.alfresco.rest.api.nodes; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.action.executer.NodeSizeActionExecuter; +import org.alfresco.repo.cache.SimpleCache; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.rest.api.Nodes; +import org.alfresco.rest.api.impl.FolderSizeImpl; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.api.model.NodePermissions; import org.alfresco.rest.framework.WebApiDescription; @@ -42,9 +44,8 @@ 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.ActionStatus; 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; @@ -56,8 +57,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; /** @@ -76,7 +78,11 @@ public class NodeFolderSizeRelation implements CalculateSize private ActionService actionService; private ActionTrackingService actionTrackingService; private Action folderSizeAction; + private FolderSizeImpl folderSizeImpl; + private NodeRef nodeRef; private String exceptionMessage = "Invalid parameter: value of nodeId is invalid"; + /** the shared cache that will hold action data */ + private static SimpleCache sharedCache; /** * The logger @@ -124,6 +130,11 @@ public class NodeFolderSizeRelation implements CalculateSize this.actionTrackingService = actionTrackingService; } + public void setSharedCache(SimpleCache sharedCache) + { + this.sharedCache = sharedCache; + } + /** * Folder Size - returns size of a folder. * @@ -139,7 +150,7 @@ public class NodeFolderSizeRelation implements CalculateSize @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); + nodeRef = nodes.validateNode(nodeId); int maxItems = Math.min(params.getPaging().getMaxItems(), 1000); QName qName = nodeService.getType(nodeRef); Map result = new HashMap<>(); @@ -153,49 +164,33 @@ public class NodeFolderSizeRelation implements CalculateSize try { - 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 "); - List executionSummaryList = actionTrackingService.getExecutingActions(NodeSizeActionExecuter.NAME); - ExecutionDetails executionDetails = actionTrackingService.getExecutionDetails(executionSummaryList.get(0)); - result.put("executionId", executionDetails.getActionId()); - return result; + this.folderSizeImpl = new FolderSizeImpl(actionService, actionTrackingService, nodeService); + return this.folderSizeImpl.executingAsynchronousFolderAction(maxItems, nodeRef, result, sharedCache); } catch (Exception ex) { LOG.error("Exception occurred in NodeFolderSizeRelation:createById {}", ex.getMessage()); - throw ex; // This rethrows with the original stack trace preserved. + throw new AlfrescoRuntimeException("Exception occurred in NodeFolderSizeRelation:createById"); } } @Override @WebApiDescription(title = "Returns Folder Node Size", description = "Returning a Folder Node Size") - @WebApiParameters({@WebApiParam(name = "nodeId", title = "The unique id of the Node being addressed", description = "A single node id")}) - public Map readById(String nodeId, String id, Parameters parameters) + @WebApiParameters({@WebApiParam(name = "executionId", title = "The unique id of Execution Job", description = "A single execution id")}) + public Map readById(String executionId, String id, Parameters parameters) { - NodeRef nodeRef = nodes.validateNode(nodeId); - // Check node type. - QName qName = nodeService.getType(nodeRef); Map result = new HashMap<>(); - validatePermissions(nodeRef, nodeId); - validateAction(); - - if(!"folder".equals(qName.getLocalName())) - { - throw new InvalidNodeTypeException(exceptionMessage); - } try { - LOG.info("Retrieving OUTPUT from ActionExecutor in NodeFolderSizeRelation:readById"); - if(folderSizeAction!=null) + LOG.info("Retrieving OUTPUT from NodeSizeActionExecutor - NodeFolderSizeRelation:readById"); + if(nodeRef!=null) { - Object resultAction = folderSizeAction.getParameterValue(NodeSizeActionExecuter.RESULT); - result = getResult(resultAction, nodeId); + //Action extractedResult = this.folderSizeImpl.extractingActionsResult(nodeRef, executionId); + Action actionData = (Action) sharedCache.get(executionId); + Action extractedResult = this.folderSizeImpl.getAction(nodeRef, executionId); + result = getResult(extractedResult); + } else { @@ -210,7 +205,7 @@ public class NodeFolderSizeRelation implements CalculateSize } } - private Map getResult(Object resultAction, String nodeId) + private Map getResult(Action resultAction) { Map result = new HashMap<>(); @@ -220,20 +215,17 @@ public class NodeFolderSizeRelation implements CalculateSize } else { - Map mapResult = (Map) resultAction; + ActionStatus actionStatus = resultAction.getExecutionStatus(); - if (!mapResult.containsKey("size")) + if(ActionStatus.Pending.name().equals(actionStatus.name())) { result.put("status", "IN-PROGRESS"); } - else if (mapResult.get("id").equals(nodeId)) - { - mapResult.put("status", "COMPLETED"); - result = mapResult; - } else { - result.put("status", "NOT-INITIATED"); + Map mapResult = (Map) resultAction.getParameterValue(NodeSizeActionExecuter.RESULT); + mapResult.put("status","COMPLETED"); + result = mapResult; } } return result; diff --git a/remote-api/src/main/java/org/alfresco/rest/framework/core/ResourceInspector.java b/remote-api/src/main/java/org/alfresco/rest/framework/core/ResourceInspector.java index c1f961240f..5388722b5b 100644 --- a/remote-api/src/main/java/org/alfresco/rest/framework/core/ResourceInspector.java +++ b/remote-api/src/main/java/org/alfresco/rest/framework/core/ResourceInspector.java @@ -294,6 +294,7 @@ public class ResourceInspector findOperation(MultiPartRelationshipResourceAction.Create.class, POST, helper); findOperation(RelationshipResourceAction.CalculateSize.class, POST, helper); + findOperation(RelationshipResourceAction.CalculateSize.class, GET, helper); boolean noAuth = resource.isAnnotationPresent(WebApiNoAuth.class); if (noAuth) 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 c6375177b1..3238de75fd 100644 --- a/remote-api/src/main/resources/alfresco/public-rest-context.xml +++ b/remote-api/src/main/resources/alfresco/public-rest-context.xml @@ -1777,5 +1777,6 @@ + diff --git a/remote-api/src/test/java/org/alfresco/rest/framework/tests/core/InspectorTests.java b/remote-api/src/test/java/org/alfresco/rest/framework/tests/core/InspectorTests.java index 376e552624..85aa8b1f77 100644 --- a/remote-api/src/test/java/org/alfresco/rest/framework/tests/core/InspectorTests.java +++ b/remote-api/src/test/java/org/alfresco/rest/framework/tests/core/InspectorTests.java @@ -644,14 +644,4 @@ public class InspectorTests assertEquals(Status.STATUS_NOT_MODIFIED,ResourceInspector.validSuccessCode(HttpMethod.DELETE, Status.STATUS_NOT_MODIFIED)); } - @Test - public void testCalculateSizeRelation() - { - List metainfo = ResourceInspector.inspect(NodeFolderSizeRelation.class); - assertTrue("Must be one ResourceMetadata",!metainfo.isEmpty()); - ResourceMetadata metaData = metainfo.get(0); - assertNotNull(metaData); - ResourceOperation op = metaData.getOperation(HttpMethod.POST); - assertNotNull("NodeFolderSizeRelation supports POST", op); - } } 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 ba47298b38..60f075164e 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 @@ -27,6 +27,7 @@ package org.alfresco.repo.action.executer; import org.alfresco.model.ContentModel; import org.alfresco.repo.action.ParameterizedItemAbstractBase; +import org.alfresco.repo.cache.SimpleCache; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.repository.ContentData; @@ -44,6 +45,7 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -63,6 +65,8 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase public static final String PAGE_SIZE = "page-size"; public static final String RESULT = "size-result"; public static final String ERROR = "exception"; + public static final String CACHE_REF = "sharedCache"; + public static final Map actionsRecords = new HashMap<>(); /** * The node service @@ -99,9 +103,10 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase * @see ActionExecuter#execute(Action, NodeRef) */ @Override - public void executeImpl(Action ruleAction, NodeRef actionedUponNodeRef) + public void executeImpl(Action nodeAction, NodeRef actionedUponNodeRef) { - Serializable serializable = ruleAction.getParameterValue(PAGE_SIZE); + Serializable serializable = nodeAction.getParameterValue(PAGE_SIZE); + Serializable serializedCache = nodeAction.getParameterValue(CACHE_REF); int maxItems; Map response = new HashMap<>(); @@ -112,7 +117,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase catch (NumberFormatException e) { LOG.error("Exception occurred while parsing String to INT: {}", e.getMessage()); - ruleAction.setParameterValue(ERROR, e.getMessage()); + nodeAction.setParameterValue(ERROR, e.getMessage()); throw e; } @@ -129,6 +134,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase searchParameters.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); searchParameters.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO); searchParameters.setQuery(query); + //searchParameters.addFacetQuery(); try { @@ -175,7 +181,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase catch (RuntimeException ex) { LOG.error("Exception occurred in NodeSizeActionExecutor:results {}", ex.getMessage()); - ruleAction.setParameterValue(ERROR, ex.getMessage()); + nodeAction.setParameterValue(ERROR, ex.getMessage()); throw ex; } @@ -185,12 +191,15 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase String formattedTimestamp = eventTimestamp.format(formatter); response.put("id", nodeRef.getId()); response.put("size", totalSize); - response.put("calculatedAtTime", formattedTimestamp); + response.put("calculatedAt", formattedTimestamp); response.put("numberOfFiles", results != null ? results.getNodeRefs().size() : 0); if(isCalculationCompleted) { - ruleAction.setParameterValue(RESULT, (Serializable) response); + nodeAction.setParameterValue(RESULT, (Serializable) response); + actionsRecords.put(nodeAction.getId(),nodeAction); + SimpleCache simpleCache = (SimpleCache) serializedCache; + simpleCache.put(nodeAction.getId(),nodeAction); } } diff --git a/repository/src/main/resources/alfresco/cache-context.xml b/repository/src/main/resources/alfresco/cache-context.xml index 6cb3c7e1dc..8bd336aed3 100644 --- a/repository/src/main/resources/alfresco/cache-context.xml +++ b/repository/src/main/resources/alfresco/cache-context.xml @@ -514,4 +514,10 @@ + + + + + + diff --git a/repository/src/main/resources/alfresco/caches.properties b/repository/src/main/resources/alfresco/caches.properties index ad12d905ff..0bcf8f5b12 100644 --- a/repository/src/main/resources/alfresco/caches.properties +++ b/repository/src/main/resources/alfresco/caches.properties @@ -709,4 +709,13 @@ cache.ldapInitialDirContextCache.cluster.type=fully-distributed cache.ldapInitialDirContextCache.backup-count=1 cache.ldapInitialDirContextCache.eviction-policy=NONE cache.ldapInitialDirContextCache.merge-policy=com.hazelcast.spi.merge.LatestUpdateMergePolicy -cache.ldapInitialDirContextCache.readBackupData=false \ No newline at end of file +cache.ldapInitialDirContextCache.readBackupData=false + +cache.folderSizeSharedCache.maxItems=1000 +cache.folderSizeSharedCache.timeToLiveSeconds=0 +cache.folderSizeSharedCache.maxIdleSeconds=0 +cache.folderSizeSharedCache.cluster.type=fully-distributed +cache.folderSizeSharedCache.backup-count=1 +cache.folderSizeSharedCache.eviction-policy=NONE +cache.folderSizeSharedCache.merge-policy=com.hazelcast.spi.merge.LatestUpdateMergePolicy +cache.folderSizeSharedCache.readBackupData=false \ No newline at end of file