From 43b89745635882ae323704a0c7d0b9cd6135a05a Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 20 Sep 2013 20:49:30 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX to HEAD (4.2) 55501: Merged V4.1-BUG-FIX (4.1.7) to HEAD-BUG-FIX (4.2) << Had a conflict on merge - think it is okay >> 55463: Merged V4.1.6 (4.1.6) to V4.1-BUG-FIX (4.1.7) 55227: MNT-9074: Merged V4.1.6-PATCHES-2013_09_03 to PATCHES/V4.1.6 55046: MNT-9074 : My Tasks fails to render if tasks quantity is excessive Were implemented code for getting definite count of workflow instances and applying them to page. It makes the opening page more quickly. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@55782 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/workflow/WorkflowComponent.java | 18 ++++++ .../repo/workflow/WorkflowServiceImpl.java | 36 ++++++++++- .../activiti/ActivitiWorkflowEngine.java | 59 +++++++++++++++++-- .../repo/workflow/jbpm/JBPMEngine.java | 17 +++++- .../service/cmr/workflow/WorkflowService.java | 19 ++++++ 5 files changed, 140 insertions(+), 9 deletions(-) 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. *