diff --git a/source/java/org/alfresco/repo/workflow/WorkflowComponent.java b/source/java/org/alfresco/repo/workflow/WorkflowComponent.java index 081c4221c3..6603f06132 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowComponent.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowComponent.java @@ -194,6 +194,24 @@ public interface WorkflowComponent */ public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery); + /** + * Gets maxItems "in-flight" workflow instances according to the specified workflowInstanceQuery parameter + * + * @param workflowInstanceQuery + * @param maxItems + * @param skipCount + * @return maxItems workflow instances + */ + public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery, int maxItems, int skipCount); + + /** + * Get count of workflow instances + * + * @param workflowInstanceQuery + * @return count of workflow instances + */ + public long countWorkflows(WorkflowInstanceQuery workflowInstanceQuery); + /** * Gets all "in-flight" active workflow instances. * diff --git a/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java b/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java index 06605a9f7d..7b47c9cab6 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java @@ -482,7 +482,13 @@ public class WorkflowServiceImpl implements WorkflowService } @Override - public List getWorkflows(final WorkflowInstanceQuery workflowInstanceQuery) + public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery) + { + return getWorkflows(workflowInstanceQuery, 0, 0); + } + + @Override + public List getWorkflows(final WorkflowInstanceQuery workflowInstanceQuery, final int maxItems, final int skipCount) { if(workflowInstanceQuery.getWorkflowDefinitionId() == null) { @@ -492,14 +498,38 @@ public class WorkflowServiceImpl implements WorkflowService public List apply(String id) { WorkflowComponent component = registry.getWorkflowComponent(id); - return component.getWorkflows(workflowInstanceQuery); + return component.getWorkflows(workflowInstanceQuery, maxItems, skipCount); } }); } String engineId = BPMEngineRegistry.getEngineId(workflowInstanceQuery.getWorkflowDefinitionId()); WorkflowComponent component = getWorkflowComponent(engineId); - return component.getWorkflows(workflowInstanceQuery); + return component.getWorkflows(workflowInstanceQuery, maxItems, skipCount); + } + + @Override + public long countWorkflows(final WorkflowInstanceQuery workflowInstanceQuery) + { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + if (workflowInstanceQuery.getWorkflowDefinitionId() == null) + { + List ids = Arrays.asList(registry.getWorkflowComponents()); + + long total = 0; + + for (String id : ids) + { + WorkflowComponent component = registry.getWorkflowComponent(id); + total += component.countWorkflows(workflowInstanceQuery); + } + + return total; + } + + String engineId = BPMEngineRegistry.getEngineId(workflowInstanceQuery.getWorkflowDefinitionId()); + WorkflowComponent component = getWorkflowComponent(engineId); + return component.countWorkflows(workflowInstanceQuery); } /** diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java index f2790ba8c1..4ac143145e 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java @@ -2182,25 +2182,75 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine @Override public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery) + { + return getWorkflows(workflowInstanceQuery, 0, 0); + } + + @Override + public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery, int maxItems, int skipCount) { LinkedList results = new LinkedList(); if (Boolean.FALSE.equals(workflowInstanceQuery.getActive()) == false) { //Add active. - results.addAll(getWorkflowsInternal(workflowInstanceQuery, true)); + results.addAll(getWorkflowsInternal(workflowInstanceQuery, true, maxItems, skipCount)); } if (Boolean.TRUE.equals(workflowInstanceQuery.getActive()) == false) { //Add complete - results.addAll(getWorkflowsInternal(workflowInstanceQuery, false)); + results.addAll(getWorkflowsInternal(workflowInstanceQuery, false, maxItems, skipCount)); } return results; } @SuppressWarnings("unchecked") - private List getWorkflowsInternal(WorkflowInstanceQuery workflowInstanceQuery, boolean isActive) + private List getWorkflowsInternal(WorkflowInstanceQuery workflowInstanceQuery, boolean isActive, int maxItems, int skipCount) { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + HistoricProcessInstanceQuery query = createQuery(workflowInstanceQuery, isActive); + + LinkedList results = new LinkedList(); + + List completedInstances; + if (maxItems > 0) + { + completedInstances = query.orderByProcessInstanceDuration().desc().listPage(skipCount, maxItems); + } + else + { + completedInstances = query.list(); + } + + List completedResults = typeConverter.convert(completedInstances); + + results.addAll(completedResults); + return results; + } + + @Override + public long countWorkflows(WorkflowInstanceQuery workflowInstanceQuery) + { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + long total = 0; + if (Boolean.FALSE.equals(workflowInstanceQuery.getActive()) == false) + { + // Add active. + total += createQuery(workflowInstanceQuery, true).count(); + } + if (Boolean.TRUE.equals(workflowInstanceQuery.getActive()) == false) + { + // Add complete + total += createQuery(workflowInstanceQuery, false).count(); + } + + return total; + } + + @SuppressWarnings("unchecked") + private HistoricProcessInstanceQuery createQuery(WorkflowInstanceQuery workflowInstanceQuery, boolean isActive) + { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive String processDefId = workflowInstanceQuery.getWorkflowDefinitionId() == null ? null : createLocalId(workflowInstanceQuery.getWorkflowDefinitionId()); HistoricProcessInstanceQuery query; @@ -2324,8 +2374,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine } } - List completedInstances = query.list(); - return typeConverter.convert(completedInstances); + return query; } /** diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java index f015ba5f30..b050b27e90 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java @@ -876,8 +876,16 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine } @Override - public List getWorkflows(final WorkflowInstanceQuery query) + public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery) { + return getWorkflows(workflowInstanceQuery, 0, 0); + } + + @Override + public List getWorkflows(final WorkflowInstanceQuery query, int maxItems, int skipCount) + { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + // here don't use maxItems and skipCount try { List instances = getProcessInstances(query); @@ -891,6 +899,13 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine } } + @Override + public long countWorkflows(WorkflowInstanceQuery workflowInstanceQuery) + { + // MNT-9074 My Tasks fails to render if tasks quantity is excessive + return getWorkflows(workflowInstanceQuery).size(); + } + @SuppressWarnings("unchecked") private List getProcessInstances(final WorkflowInstanceQuery query) { diff --git a/source/java/org/alfresco/service/cmr/workflow/WorkflowService.java b/source/java/org/alfresco/service/cmr/workflow/WorkflowService.java index 653efd9887..fbd497c866 100644 --- a/source/java/org/alfresco/service/cmr/workflow/WorkflowService.java +++ b/source/java/org/alfresco/service/cmr/workflow/WorkflowService.java @@ -245,6 +245,25 @@ public interface WorkflowService */ public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery); + /** + * Gets maxItems "in-flight" workflow instances according to the specified workflowInstanceQuery parameter + * Get maxItems and skipCount parameters form request + * + * @param workflowInstanceQuery + * @param maxItems + * @param skipCount + * @return maxItems workflow instances + */ + public List getWorkflows(WorkflowInstanceQuery workflowInstanceQuery, int maxItems, int skipCount); + + /** + * Get count of workflow instances + * + * @param workflowInstanceQuery + * @return count of workflow instances + */ + public long countWorkflows(WorkflowInstanceQuery workflowInstanceQuery); + /** * Gets all active workflow instances. *