[feature/MNT-24127-EndpointToCalculateFolderSize] Added Endpoint to calculate folder size

This commit is contained in:
Mohit Singh
2024-08-02 15:21:45 +05:30
parent 873dfe2224
commit 0c5cc98de9
7 changed files with 54 additions and 106 deletions

View File

@@ -45,6 +45,18 @@ public class FolderSizeImpl {
private static final String IN_PROGRESS = "IN-PROGRESS";
public Map<String, Object> executingAsynchronousFolderAction(final NodeRef nodeRef, final int maxItems, final Map<String, Object> result, final SimpleCache<Serializable, Object> 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<Serializable, Object> 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;
}
}

View File

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

View File

@@ -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.
* <p>POST:</p>
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/calculateSize}
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/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.
* <p>GET:</p>
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/calculateSize}
* {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/nodes/<nodeId>/get-folder-size}
*/
@Test
public void testBGetCalculateFolderSize() throws Exception

View File

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

View File

@@ -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<Serializable,Object> 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<Pair<String, Integer>> 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<Pair<String, Integer>> 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<NodeRef> 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);
}
/**

View File

@@ -791,7 +791,6 @@
<bean id="folder-size" class="org.alfresco.repo.action.executer.NodeSizeActionExecuter" parent="action-executer">
<property name="searchService" ref="searchService"/>
<property name="nodeService" ref="nodeService"/>
<property name="simpleCache" ref="folderSizeSharedCache" />
</bean>

View File

@@ -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<String, Object> mapResult = (Map<String, Object>)resultAction;
assertTrue(mapResult != null);
}