diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/FolderSizeImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/FolderSizeImpl.java index 5e2b4c091b..7834f92f5b 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/FolderSizeImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/FolderSizeImpl.java @@ -45,6 +45,18 @@ public class FolderSizeImpl { private static final String IN_PROGRESS = "IN-PROGRESS"; public Map executingAsynchronousFolderAction(final NodeRef nodeRef, final int maxItems, final Map result, final SimpleCache simpleCache) + { + if(simpleCache.get(nodeRef.getId()) == null) + { + executeAction(nodeRef, maxItems, simpleCache); + } + LOG.debug("Executing NodeSizeActionExecuter from executingAsynchronousFolderAction method"); + + result.putIfAbsent("nodeId",nodeRef.getId()); + return result; + } + + protected void executeAction(NodeRef nodeRef, int maxItems, SimpleCache simpleCache) { Action folderSizeAction = actionService.createAction(NodeSizeActionExecuter.NAME); folderSizeAction.setTrackStatus(true); @@ -52,10 +64,5 @@ public class FolderSizeImpl { folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems); simpleCache.put(nodeRef.getId(),IN_PROGRESS); actionService.executeAction(folderSizeAction, nodeRef, false, true); - - LOG.debug("Executing NodeSizeActionExecuter from executingAsynchronousFolderAction method"); - - result.putIfAbsent("executionId",folderSizeAction.getId()); - return result; } } \ No newline at end of file diff --git a/remote-api/src/main/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java b/remote-api/src/main/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java index 7cf611dc2e..0eb5a3b6cf 100644 --- a/remote-api/src/main/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java +++ b/remote-api/src/main/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java @@ -282,7 +282,7 @@ public class ResourceWebScriptGet extends AbstractResourceWebScript implements P if (StringUtils.isNotBlank(params.getEntityId())) { if (EntityResourceAction.RetrieveFolderSize.class.isAssignableFrom(resource.getResource().getClass()) - && (GET_FOLDERSIZE.equals(resource.getMetaData().getUniqueId()) || params.getBinaryProperty().equals("get-folder-size"))) + && (GET_FOLDERSIZE.equals(resource.getMetaData().getUniqueId()))) { if (resource.getMetaData().isDeleted(EntityResourceAction.RetrieveFolderSize.class)) { 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 383c1c8a29..55e874a627 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 @@ -100,9 +100,9 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest } /** - * Test case for POST/calculateSize, which calculates Folder Size. + * Test case for POST/calculate-folder-size, which calculates Folder Size. *

POST:

- * {@literal :/alfresco/api//public/alfresco/versions/1/nodes//calculateSize} + * {@literal :/alfresco/api//public/alfresco/versions/1/nodes//calculate-folder-size} */ @Test public void testAPostCalculateFolderSize() throws Exception { @@ -129,9 +129,9 @@ public class NodeFolderSizeApiTest extends AbstractBaseApiTest } /** - * Test case for GET/calculateSize, to retrieve FolderSize. + * Test case for GET/get-folder-size, to retrieve FolderSize. *

GET:

- * {@literal :/alfresco/api//public/alfresco/versions/1/nodes//calculateSize} + * {@literal :/alfresco/api/-default-/public/alfresco/versions/1/nodes//get-folder-size} */ @Test public void testBGetCalculateFolderSize() throws Exception diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/client/PublicApiHttpClient.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/client/PublicApiHttpClient.java index 74c7f01e0a..6c2de9dd27 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/client/PublicApiHttpClient.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/client/PublicApiHttpClient.java @@ -305,6 +305,7 @@ public class PublicApiHttpClient { RestApiEndpoint endpoint = new RestApiEndpoint(c, rq.getNetworkId(), entityId, relationshipEntityId, params); String url = endpoint.getUrl(); + System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&& "+url+" :: "+entityId); GetMethod req = new GetMethod(url); return submitRequest(req, rq); @@ -762,6 +763,7 @@ public class PublicApiHttpClient } addParams(sb, params); + System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&& 2 "+sb.toString()); this.url = sb.toString(); } 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 0e88650283..f096e8dda9 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 @@ -25,14 +25,11 @@ */ 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; 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.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; @@ -49,7 +46,6 @@ import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; /** * NodeSizeActionExecuter @@ -58,34 +54,20 @@ import java.util.concurrent.atomic.AtomicLong; public class NodeSizeActionExecuter extends ActionExecuterAbstractBase { + + private static final Logger LOG = LoggerFactory.getLogger(NodeSizeActionExecuter.class); + /** * Action constants */ public static final String NAME = "folder-size"; 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 FIELD_FACET = "content.size"; - private NodeService nodeService; private SearchService searchService; private SimpleCache simpleCache; - /** - * The logger - */ - private static final Logger LOG = LoggerFactory.getLogger(NodeSizeActionExecuter.class); - - /** - * Set the node service - * - * @param nodeService the node service - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - /** * Set the search service * @@ -128,11 +110,39 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase } NodeRef nodeRef = actionedUponNodeRef; - long totalSize = 0; long totalSizeFromFacet; ResultSet results; - boolean isCalculationCompleted = false; + try + { + // executing Alfresco FTS facet query. + results = facetQuery(nodeRef); + List> fieldData = results.getFieldFacet(FIELD_FACET); + totalSizeFromFacet = fieldData.stream() + .filter(pairData -> pairData.getSecond() > 0) + .mapToLong(pairData -> Long.valueOf(pairData.getFirst()) * pairData.getSecond()) + .sum(); + } + catch (RuntimeException ex) + { + LOG.error("Exception occurred in NodeSizeActionExecutor:results {}", ex.getMessage()); + nodeAction.setParameterValue(ERROR, ex.getMessage()); + throw ex; + } + + LOG.debug(" Calculating size of Folder Node - NodeSizeActionExecutor:executeImpl "); + final LocalDateTime eventTimestamp = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); + String formattedTimestamp = eventTimestamp.format(formatter); + response.put("nodeId", nodeRef.getId()); + response.put("size", totalSizeFromFacet); + response.put("calculatedAt", formattedTimestamp); + response.put("numberOfFiles", results != null ? results.getNodeRefs().size() : 0); + simpleCache.put(nodeRef.getId(),response); + } + + protected ResultSet facetQuery(NodeRef nodeRef) + { StringBuilder aftsQuery = new StringBuilder(); aftsQuery.append("ANCESTOR:\"").append(nodeRef).append("\" AND TYPE:content"); String query = aftsQuery.toString(); @@ -147,77 +157,7 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase searchParameters.addFacetQuery("content.size:[1048576 TO 16777216]\", \"label\": \"large\",\"group\":\"Size\""); final SearchParameters.FieldFacet ff = new SearchParameters.FieldFacet(FIELD_FACET); searchParameters.addFieldFacet(ff); - - try - { - // executing Alfresco FTS query. - results = searchService.query(searchParameters); - List> fieldData = results.getFieldFacet(FIELD_FACET); - totalSizeFromFacet = fieldData.stream() - .filter(pairData -> pairData.getSecond() > 0) - .mapToLong(pairData -> Long.valueOf(pairData.getFirst()) * pairData.getSecond()) - .sum(); - - int skipCount = 0; - int totalItems; - totalItems = Math.min(results.getNodeRefs().size(), maxItems); - - while (!isCalculationCompleted) - { - List nodeRefs = results.getNodeRefs().subList(skipCount, totalItems); - // Using AtomicLong to accumulate the total size. - AtomicLong resultSize = new AtomicLong(0); - nodeRefs.parallelStream().forEach(id -> { - try - { - ContentData contentData = (ContentData) nodeService.getProperty(id, ContentModel.PROP_CONTENT); - if (contentData != null) - { - resultSize.addAndGet(contentData.getSize()); - } - } - catch (Exception e) - { - resultSize.addAndGet(0); - } - }); - - totalSize+=resultSize.longValue(); - - if (results.getNodeRefs().size() <= totalItems || results.getNodeRefs().size() <= maxItems) - { - isCalculationCompleted = true; - } - else - { - skipCount += maxItems; - int remainingItems = results.getNodeRefs().size() - totalItems; - totalItems += Math.min(remainingItems, maxItems); - } - } - } - catch (RuntimeException ex) - { - LOG.error("Exception occurred in NodeSizeActionExecutor:results {}", ex.getMessage()); - nodeAction.setParameterValue(ERROR, ex.getMessage()); - throw ex; - } - - LOG.debug(" Calculating size of Folder Node - NodeSizeActionExecutor:executeImpl "); - final LocalDateTime eventTimestamp = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); - String formattedTimestamp = eventTimestamp.format(formatter); - response.put("id", nodeRef.getId()); - response.put("size", totalSize); - response.put("sizeFromFacet", totalSizeFromFacet); - response.put("calculatedAt", formattedTimestamp); - response.put("numberOfFiles", results != null ? results.getNodeRefs().size() : 0); - - if(isCalculationCompleted) - { - nodeAction.setParameterValue(RESULT, (Serializable) response); - simpleCache.put(nodeRef.getId(),response); - } + return searchService.query(searchParameters); } /** diff --git a/repository/src/main/resources/alfresco/action-services-context.xml b/repository/src/main/resources/alfresco/action-services-context.xml index a693260754..8219092e44 100644 --- a/repository/src/main/resources/alfresco/action-services-context.xml +++ b/repository/src/main/resources/alfresco/action-services-context.xml @@ -791,7 +791,6 @@ - diff --git a/repository/src/test/java/org/alfresco/repo/action/executer/NodeSizeActionExecuterTest.java b/repository/src/test/java/org/alfresco/repo/action/executer/NodeSizeActionExecuterTest.java index aedbd3339b..7a846342b0 100644 --- a/repository/src/test/java/org/alfresco/repo/action/executer/NodeSizeActionExecuterTest.java +++ b/repository/src/test/java/org/alfresco/repo/action/executer/NodeSizeActionExecuterTest.java @@ -108,7 +108,7 @@ public class NodeSizeActionExecuterTest extends BaseSpringTest ActionImpl action = new ActionImpl(null, ID, NodeSizeActionExecuter.NAME, null); action.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems); this.executer.executeImpl(action, this.nodeRef); - Object resultAction = action.getParameterValue(NodeSizeActionExecuter.RESULT); + Object resultAction = simpleCache.get(this.nodeRef.getId()); Map mapResult = (Map)resultAction; assertTrue(mapResult != null); }