Some Optimization for NodeSize Calculation.

This commit is contained in:
kshah
2024-07-24 15:22:51 +05:30
parent 2f3596266b
commit 43ca02592c
4 changed files with 37 additions and 40 deletions

View File

@@ -42,6 +42,7 @@ public class FolderSizeImpl {
private ActionService actionService; private ActionService actionService;
private static final Logger LOG = LoggerFactory.getLogger(FolderSizeImpl.class); private static final Logger LOG = LoggerFactory.getLogger(FolderSizeImpl.class);
private static final String IN_PROGRESS = "IN-PROGRESS";
public Map<String, Object> executingAsynchronousFolderAction(final int maxItems, final NodeRef nodeRef, final Map<String, Object> result, final SimpleCache<Serializable, Object> simpleCache) public Map<String, Object> executingAsynchronousFolderAction(final int maxItems, final NodeRef nodeRef, final Map<String, Object> result, final SimpleCache<Serializable, Object> simpleCache)
{ {
@@ -49,9 +50,11 @@ public class FolderSizeImpl {
folderSizeAction.setTrackStatus(true); folderSizeAction.setTrackStatus(true);
folderSizeAction.setExecuteAsynchronously(true); folderSizeAction.setExecuteAsynchronously(true);
folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems); folderSizeAction.setParameterValue(NodeSizeActionExecuter.PAGE_SIZE, maxItems);
simpleCache.put(folderSizeAction.getId(),"IN-PROGRESS"); simpleCache.put(folderSizeAction.getId(),IN_PROGRESS);
actionService.executeAction(folderSizeAction, nodeRef, false, true); actionService.executeAction(folderSizeAction, nodeRef, false, true);
LOG.info("Executing NodeSizeActionExecuter from executingAsynchronousFolderAction method"); LOG.info("Executing NodeSizeActionExecuter from executingAsynchronousFolderAction method");
result.putIfAbsent("executionId",folderSizeAction.getId()); result.putIfAbsent("executionId",folderSizeAction.getId());
return result; return result;
} }

View File

@@ -37,6 +37,7 @@ import org.alfresco.rest.framework.WebApiParam;
import org.alfresco.rest.framework.WebApiParameters; 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.core.exceptions.NotFoundException; import org.alfresco.rest.framework.core.exceptions.NotFoundException;
import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException;
import org.alfresco.rest.framework.resource.RelationshipResource; import org.alfresco.rest.framework.resource.RelationshipResource;
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction.CalculateSize; 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.actions.interfaces.RelationshipResourceAction.ReadById;
@@ -68,6 +69,12 @@ 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 CalculateSize<Map<String, Object>>, ReadById<Map<String, Object>>, InitializingBean public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>>, ReadById<Map<String, Object>>, InitializingBean
{ {
private static final Logger LOG = LoggerFactory.getLogger(NodeFolderSizeRelation.class);
private static final String INVALID_NODEID = "Invalid parameter: value of nodeId is invalid";
private static final String EXECUTIONID_NOT_FOUND = "Searched ExecutionId does not exist";
private Nodes nodes; private Nodes nodes;
private SearchService searchService; private SearchService searchService;
private ServiceRegistry serviceRegistry; private ServiceRegistry serviceRegistry;
@@ -75,21 +82,8 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
private NodeService nodeService; private NodeService nodeService;
private ActionService actionService; private ActionService actionService;
private ActionTrackingService actionTrackingService; private ActionTrackingService actionTrackingService;
private String invalidMessage = "Invalid parameter: value of nodeId is invalid";
private String notFoundMessage = "Searched ExecutionId does not exist";
/** the simple cache that will hold action data */
private SimpleCache<Serializable,Object> simpleCache; private SimpleCache<Serializable,Object> simpleCache;
/**
* The logger
*/
private static final Logger LOG = LoggerFactory.getLogger(NodeFolderSizeRelation.class);
/**
* The class that wraps the ReST APIs from core.
*/
public void setNodes(Nodes nodes) public void setNodes(Nodes nodes)
{ {
this.nodes = nodes; this.nodes = nodes;
@@ -116,12 +110,6 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
this.actionService = actionService; this.actionService = actionService;
} }
@Override
public void afterPropertiesSet()
{
ParameterCheck.mandatory("nodes", this.nodes);
}
public void setActionTrackingService(ActionTrackingService actionTrackingService) public void setActionTrackingService(ActionTrackingService actionTrackingService)
{ {
this.actionTrackingService = actionTrackingService; this.actionTrackingService = actionTrackingService;
@@ -132,6 +120,11 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
this.simpleCache = simpleCache; this.simpleCache = simpleCache;
} }
@Override
public void afterPropertiesSet()
{
ParameterCheck.mandatory("nodes", this.nodes);
}
/** /**
* Folder Size - returns size of a folder. * Folder Size - returns size of a folder.
* *
@@ -151,12 +144,11 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
int maxItems = Math.min(params.getPaging().getMaxItems(), 1000); int maxItems = Math.min(params.getPaging().getMaxItems(), 1000);
QName qName = nodeService.getType(nodeRef); QName qName = nodeService.getType(nodeRef);
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
validatePermissions(nodeRef, nodeId); validatePermissions(nodeRef, nodeId);
if(!"folder".equals(qName.getLocalName())) if(!FOLDER.equalsIgnoreCase(qName.getLocalName()))
{ {
throw new InvalidNodeTypeException(invalidMessage); throw new InvalidNodeTypeException(INVALID_NODEID);
} }
try try
@@ -164,33 +156,30 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
FolderSizeImpl folderSizeImpl = new FolderSizeImpl(actionService); FolderSizeImpl folderSizeImpl = new FolderSizeImpl(actionService);
return folderSizeImpl.executingAsynchronousFolderAction(maxItems, nodeRef, result, simpleCache); return folderSizeImpl.executingAsynchronousFolderAction(maxItems, nodeRef, result, simpleCache);
} }
catch (Exception ex) catch (Exception alfrescoRuntimeError)
{ {
LOG.error("Exception occurred in NodeFolderSizeRelation:createById {}", ex.getMessage()); LOG.error("Exception occurred in NodeFolderSizeRelation:createById {}", alfrescoRuntimeError.getMessage());
throw new AlfrescoRuntimeException("Exception occurred in NodeFolderSizeRelation:createById",ex); throw new AlfrescoRuntimeException("Exception occurred in NodeFolderSizeRelation:createById",alfrescoRuntimeError);
} }
} }
@Override @Override
@WebApiDescription(title = "Returns Folder Node Size", description = "Returning a Folder Node Size") @WebApiDescription(title = "Returns Folder Node Size", description = "Returning a Folder Node Size")
@WebApiParameters({@WebApiParam(name = "executionId", title = "The unique id of Execution Job", description = "A single execution id")}) @WebApiParameters({@WebApiParam(name = "executionId", title = "The unique id of Execution Job", description = "A single execution id")})
public Map<String, Object> readById(String executionId, String id, Parameters parameters) public Map<String, Object> readById(String executionId, String nodeId, Parameters parameters)
{ {
Map<String, Object> result;
try try
{ {
LOG.info("Retrieving OUTPUT from NodeSizeActionExecutor - NodeFolderSizeRelation:readById"); LOG.info("Retrieving OUTPUT from NodeSizeActionExecutor - NodeFolderSizeRelation:readById");
Object cachedResult = simpleCache.get(executionId); Object cachedResult = simpleCache.get(executionId);
if(cachedResult != null) if(cachedResult != null)
{ {
result = getResult(cachedResult); return getResult(cachedResult);
} }
else else
{ {
throw new NotFoundException(notFoundMessage); throw new NotFoundException(EXECUTIONID_NOT_FOUND);
} }
return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -198,6 +187,7 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
throw ex; // Rethrow with original stack trace throw ex; // Rethrow with original stack trace
} }
} }
private Map<String, Object> getResult(Object outputResult) private Map<String, Object> getResult(Object outputResult)
{ {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
@@ -205,12 +195,12 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
if (outputResult instanceof Map) if (outputResult instanceof Map)
{ {
Map<String, Object> mapResult = (Map<String, Object>) outputResult; Map<String, Object> mapResult = (Map<String, Object>) outputResult;
mapResult.put("status", "COMPLETED"); mapResult.put(STATUS, COMPLETED);
result = mapResult; result = mapResult;
} }
else else if(outputResult instanceof String)
{ {
result.put("status", "IN-PROGRESS"); result.put(STATUS, outputResult);
} }
return result; return result;
} }
@@ -226,5 +216,4 @@ public class NodeFolderSizeRelation implements CalculateSize<Map<String, Object>
throw new AccessDeniedException("permissions.err_access_denied"); throw new AccessDeniedException("permissions.err_access_denied");
} }
} }
} }

View File

@@ -166,6 +166,9 @@ public interface RelationshipResourceAction
interface CalculateSize<E> extends ResourceAction interface CalculateSize<E> extends ResourceAction
{ {
String STATUS = "status";
String COMPLETED = "Completed";
String FOLDER = "folder";
/** /**
* Calculate the size of Folder Node. * Calculate the size of Folder Node.
* *

View File

@@ -64,13 +64,10 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase
public static final String PAGE_SIZE = "page-size"; public static final String PAGE_SIZE = "page-size";
public static final String RESULT = "size-result"; public static final String RESULT = "size-result";
public static final String ERROR = "exception"; public static final String ERROR = "exception";
private SimpleCache<Serializable,Object> simpleCache;
/**
* The node service
*/
private NodeService nodeService; private NodeService nodeService;
private SearchService searchService; private SearchService searchService;
private SimpleCache<Serializable,Object> simpleCache;
/** /**
* The logger * The logger
@@ -97,6 +94,11 @@ public class NodeSizeActionExecuter extends ActionExecuterAbstractBase
this.searchService = searchService; this.searchService = searchService;
} }
/**
* Set the simpleCache service
*
* @param simpleCache the cache service
*/
public void setSimpleCache(SimpleCache<Serializable, Object> simpleCache) public void setSimpleCache(SimpleCache<Serializable, Object> simpleCache)
{ {
this.simpleCache = simpleCache; this.simpleCache = simpleCache;