From 0932f9eea019a5d2d7f5b2da071247a5795de7e0 Mon Sep 17 00:00:00 2001 From: Pavel Yurke Date: Mon, 30 Sep 2013 08:31:34 +0000 Subject: [PATCH] ALF-19942: Failed to displayed Process Engines page in Admin Console after creation of workflow by tenant user Do special tenant specific filtering for WorkflowInstances and TaskInstances: for default tenant all instances included, for other tenants - only tenant-specific. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@56139 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/workflow/WorkflowObjectFactory.java | 32 +++++++++++++- .../activiti/ActivitiTypeConverter.java | 44 ++++++++++++++++++- .../activiti/ActivitiWorkflowEngine.java | 2 +- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/source/java/org/alfresco/repo/workflow/WorkflowObjectFactory.java b/source/java/org/alfresco/repo/workflow/WorkflowObjectFactory.java index f1fb103e43..d274c836e3 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowObjectFactory.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowObjectFactory.java @@ -64,6 +64,8 @@ public class WorkflowObjectFactory private final String engineId; private final QName defaultStartTaskType; + private boolean ignoreTenantCheck; + public WorkflowObjectFactory(WorkflowQNameConverter qNameConverter, TenantService tenantService, MessageService messageService, @@ -364,7 +366,7 @@ public class WorkflowObjectFactory */ public void checkDomain(String defName) { - if (tenantService.isEnabled()) + if (tenantService.isEnabled() && !ignoreTenantCheck) { String processKey = defName; if (isGlobalId(defName)) @@ -397,6 +399,24 @@ public class WorkflowObjectFactory }); } + /** + * For "default" domain return ALL workflows + * For tenant-specific workflows exclude "default" + */ + public List doSpecialTenantFilter(Collection values, final Function processKeyGetter) + { + final String currentDomain = tenantService.getCurrentUserDomain(); + return CollectionUtils.filter(values, new Filter() + { + public Boolean apply(T value) + { + String key = processKeyGetter.apply(value); + String domain = TenantUtil.getTenantDomain(key); + return currentDomain.equals(domain) || currentDomain.equals(TenantService.DEFAULT_DOMAIN); + } + }); + } + /** * Returns an anonymous {@link TypeDefinition} for the given name with all * the mandatory aspects applied. @@ -467,4 +487,14 @@ public class WorkflowObjectFactory { qNameConverter.clearCache(); } + + public boolean isIgnoreTenantCheck() + { + return ignoreTenantCheck; + } + + public void setIgnoreTenantCheck(boolean ignoreTenantCheck) + { + this.ignoreTenantCheck = ignoreTenantCheck; + } } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiTypeConverter.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiTypeConverter.java index dcf7a97c19..50bcdbf071 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiTypeConverter.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiTypeConverter.java @@ -108,6 +108,30 @@ public class ActivitiTypeConverter return convert(filtered); } + /** + * filters HistoricProcessInstances by domain + * including all instances for default domain + * and excluding shared instances (THOR-206) for tenants + * + * @param completedInstances + * @param function + * @return + */ + public List doSpecialTenantFilterAndSafeConvert(List values, Function processKeyGetter) + { + List filtered = factory.doSpecialTenantFilter(values, processKeyGetter); + factory.setIgnoreTenantCheck(factory.isDefaultDomain()); + try + { + return convert(filtered, true); + } + finally + { + factory.setIgnoreTenantCheck(false); + } + + } + /** * Convert a {@link Deployment} into a {@link WorkflowDeployment}. * @param deployment @@ -329,13 +353,29 @@ public class ActivitiTypeConverter return results; } - @SuppressWarnings("unchecked") public List convert(List inputs) + { + return convert(inputs, false); + } + + @SuppressWarnings("unchecked") + public List convert(List inputs, boolean ignoreNotDeployed) { ArrayList results = new ArrayList(inputs.size()); for (Object in : inputs) { - T out = (T) convert(in); + T out = null; + try + { + out = (T) convert(in); + } + catch (NullPointerException npe) + { + if (!ignoreNotDeployed) + { + throw npe; + } + } if(out != null) { results.add(out); diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java index 4ac143145e..1c0269f41d 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java @@ -1121,7 +1121,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine */ private List getValidWorkflowTasks(List tasks) { - return typeConverter.filterByDomainAndConvert(tasks, new Function() + return typeConverter.doSpecialTenantFilterAndSafeConvert(tasks, new Function() { public String apply(Task task) {