diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java index 6cfdc79fb2..514130d04f 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java @@ -18,6 +18,7 @@ */ package org.alfresco.repo.web.scripts.workflow; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -227,7 +228,17 @@ public abstract class AbstractWorkflowWebscript extends DeclarativeWebScript protected Map createResultModel(WebScriptRequest req, String dataPropertyName, List> results) { - int totalItems = results.size(); + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + int totalItems = 0; + try + { + totalItems = getCapacity(results); + } + catch (Exception e) + { + totalItems = results.size(); + } + int maxItems = getIntParameter(req, PARAM_MAX_ITEMS, DEFAULT_MAX_ITEMS); int skipCount = getIntParameter(req, PARAM_SKIP_COUNT, DEFAULT_SKIP_COUNT); @@ -243,6 +254,19 @@ public abstract class AbstractWorkflowWebscript extends DeclarativeWebScript return model; } + /** + * Get capacity instaead of size of list + * MNT-9074 My Tasks fails to render if tasks quantity is excessive + * @param list + * @return capacity of list + * @throws Exception + */ + private int getCapacity(List list) throws Exception { + Field dataField = ArrayList.class.getDeclaredField("elementData"); + dataField.setAccessible(true); + return ((Object[]) dataField.get(list)).length; + } + /** * Make the pagination for given list of objects * diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java index ffe5500629..d5172cab8f 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java @@ -149,16 +149,26 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript { workflowInstanceQuery.setWorkflowDefinitionId(workflowDefinitionId); } - workflows.addAll(workflowService.getWorkflows(workflowInstanceQuery)); - // sort workflows by due date - Collections.sort(workflows, workflowComparator); + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + int maxItems = getIntParameter(req, PARAM_MAX_ITEMS, DEFAULT_MAX_ITEMS); + int skipCount = getIntParameter(req, PARAM_SKIP_COUNT, DEFAULT_SKIP_COUNT); - List> results = new ArrayList>(workflows.size()); + workflows.addAll(workflowService.getWorkflows(workflowInstanceQuery, maxItems, skipCount)); + + int total = (int) workflowService.countWorkflows(workflowInstanceQuery); + + List> results = new ArrayList>(total); + + // init empty list + results.addAll(Arrays.asList((Map[]) new Map[total])); for (WorkflowInstance workflow : workflows) { - results.add(modelBuilder.buildSimple(workflow)); + // set to special index + results.set(skipCount, modelBuilder.buildSimple(workflow)); + + skipCount++; } // create and return results, paginated if necessary