From 5f14a5105b673bb8f46970017730b17bd3fc437d Mon Sep 17 00:00:00 2001 From: Gavin Cornwell Date: Thu, 8 Sep 2011 21:49:35 +0000 Subject: [PATCH] ALF-10117: JBPM workflows should be hidden. A new property "system.workflow.jbpm.definitions.visible" has been added, set to false by default. This means that when the JBPM engine is enabled (the default for upgrades) in-flight workflows can continue but the JBPM definitions will not be returned and therefore hide them from the UI preventing new instances from being created. If customers want to show the JBPM workflows again all is required is to set the "system.workflow.jbpm.definitions.visible" property to true. The Workflow MBean has also been updated to expose the new property and the Workflow admin console now displays the value. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30356 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/jbpm-context.xml | 1 + config/alfresco/repository.properties | 7 + config/alfresco/workflow-context.xml | 9 +- .../AbstractInvitationServiceImplTest.java | 2 +- .../ActivitiInvitationServiceImplTests.java | 2 +- .../JbpmInvitationServiceImplTests.java | 4 +- ...bstractWorkflowServiceIntegrationTest.java | 5 + .../workflow/WorkflowAdminServiceImpl.java | 24 +++- .../repo/workflow/jbpm/JBPMEngine.java | 135 +++++++++++------- .../repo/workflow/jbpm/JBPMEngineTest.java | 36 ++++- .../cmr/workflow/WorkflowAdminService.java | 11 ++ 11 files changed, 166 insertions(+), 70 deletions(-) diff --git a/config/alfresco/jbpm-context.xml b/config/alfresco/jbpm-context.xml index 96287e2982..950fbf23b1 100644 --- a/config/alfresco/jbpm-context.xml +++ b/config/alfresco/jbpm-context.xml @@ -25,6 +25,7 @@ + diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index b8a96d5e56..a713b1eaba 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -45,6 +45,13 @@ system.workflow.deployservlet.enabled=false # Sets the location for the JBPM Configuration File system.workflow.jbpm.config.location=classpath:org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml +# Determines if JBPM workflow definitions are shown. +# Default is false. This controls the visibility of JBPM +# workflow definitions from the getDefinitions and +# getAllDefinitions WorkflowService API but still allows +# any in-flight JBPM workflows to be completed. +system.workflow.jbpm.definitions.visible=false + # Determines if the JBPM engine is enabled system.workflow.engine.jbpm.enabled=true diff --git a/config/alfresco/workflow-context.xml b/config/alfresco/workflow-context.xml index f596c6f4ce..a468c0454e 100644 --- a/config/alfresco/workflow-context.xml +++ b/config/alfresco/workflow-context.xml @@ -68,12 +68,15 @@ - - ${system.workflow.engine.jbpm.enabled} - ${system.workflow.engine.activiti.enabled} + + ${system.workflow.engine.jbpm.enabled} + + + ${system.workflow.jbpm.definitions.visible} + diff --git a/source/java/org/alfresco/repo/invitation/AbstractInvitationServiceImplTest.java b/source/java/org/alfresco/repo/invitation/AbstractInvitationServiceImplTest.java index 508334d8f0..b7d8b90eed 100644 --- a/source/java/org/alfresco/repo/invitation/AbstractInvitationServiceImplTest.java +++ b/source/java/org/alfresco/repo/invitation/AbstractInvitationServiceImplTest.java @@ -152,7 +152,7 @@ public abstract class AbstractInvitationServiceImplTest extends BaseAlfrescoSpri { // Make sure both workflow engines are enabled. workflowAdminService.setActivitiEngineEnabled(true); - workflowAdminService.setJbpmEngineEnabled(true); + workflowAdminService.setJBPMEngineEnabled(true); this.authenticationComponent.setSystemUserAsCurrentUser(); invitationServiceImpl.setSendEmails(startSendEmails); diff --git a/source/java/org/alfresco/repo/invitation/ActivitiInvitationServiceImplTests.java b/source/java/org/alfresco/repo/invitation/ActivitiInvitationServiceImplTests.java index 289efe99aa..1b3da836c5 100644 --- a/source/java/org/alfresco/repo/invitation/ActivitiInvitationServiceImplTests.java +++ b/source/java/org/alfresco/repo/invitation/ActivitiInvitationServiceImplTests.java @@ -59,7 +59,7 @@ public class ActivitiInvitationServiceImplTests extends AbstractInvitationServic resourceType, resourceName, inviteeRole); // Disable Jbpm and enable Activiti - workflowAdminService.setJbpmEngineEnabled(false); + workflowAdminService.setJBPMEngineEnabled(false); workflowAdminService.setActivitiEngineEnabled(true); } } diff --git a/source/java/org/alfresco/repo/invitation/JbpmInvitationServiceImplTests.java b/source/java/org/alfresco/repo/invitation/JbpmInvitationServiceImplTests.java index 3710a11d93..ea5eab3b13 100644 --- a/source/java/org/alfresco/repo/invitation/JbpmInvitationServiceImplTests.java +++ b/source/java/org/alfresco/repo/invitation/JbpmInvitationServiceImplTests.java @@ -38,7 +38,7 @@ public class JbpmInvitationServiceImplTests extends AbstractInvitationServiceImp super.onSetUpInTransaction(); // Add a few Jbpm invitations to check they dont' interfere with Activiti invitations. - workflowAdminService.setJbpmEngineEnabled(false); + workflowAdminService.setJBPMEngineEnabled(false); String invitee = USER_ONE; Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE; @@ -60,6 +60,6 @@ public class JbpmInvitationServiceImplTests extends AbstractInvitationServiceImp // Disable Jbpm and enable Activiti workflowAdminService.setActivitiEngineEnabled(false); - workflowAdminService.setJbpmEngineEnabled(true); + workflowAdminService.setJBPMEngineEnabled(true); } } diff --git a/source/java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java b/source/java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java index d8bbd2d819..7b45c20f00 100644 --- a/source/java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java +++ b/source/java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java @@ -79,6 +79,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT protected TestPersonManager personManager; protected TestGroupManager groupManager; protected NodeService nodeService; + protected WorkflowAdminServiceImpl workflowAdminService; private NodeRef companyHome; public void testDeployWorkflowDefinition() @@ -1151,6 +1152,10 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT authenticationComponent.setSystemUserAsCurrentUser(); + // for the purposes of the tests make sure JBPM workflow definitions are visible + this.workflowAdminService = (WorkflowAdminServiceImpl) applicationContext.getBean("workflowAdminService"); + this.workflowAdminService.setJBPMWorkflowDefinitionsVisible(true); + // create test users this.personManager = new TestPersonManager(authenticationService, personService, nodeService); this.groupManager = new TestGroupManager(authorityService, searchService); diff --git a/source/java/org/alfresco/repo/workflow/WorkflowAdminServiceImpl.java b/source/java/org/alfresco/repo/workflow/WorkflowAdminServiceImpl.java index 7a95df5766..0154981531 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowAdminServiceImpl.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowAdminServiceImpl.java @@ -32,19 +32,31 @@ public class WorkflowAdminServiceImpl implements WorkflowAdminService { public static final String NAME = "workflowAdminService"; - private boolean jbpmEngineEnabled = true; private boolean activitiEngineEnabled = true; - - public void setJbpmEngineEnabled(boolean jbpmEngineEnabled) - { - this.jbpmEngineEnabled = jbpmEngineEnabled; - } + private boolean jbpmEngineEnabled = true; + private boolean jbpmDefinitionsVisible = false; public void setActivitiEngineEnabled(boolean activitiEngineEnabled) { this.activitiEngineEnabled = activitiEngineEnabled; } + + public void setJBPMEngineEnabled(boolean jbpmEngineEnabled) + { + this.jbpmEngineEnabled = jbpmEngineEnabled; + } + + public void setJBPMWorkflowDefinitionsVisible(boolean jbpmDefinitionsVisible) + { + this.jbpmDefinitionsVisible = jbpmDefinitionsVisible; + } + @Override + public boolean isJBPMWorkflowDefinitionsVisible() + { + return this.jbpmDefinitionsVisible; + } + @Override public boolean isEngineEnabled(String engineId) { diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java index db9bf05e77..46ebc78416 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java @@ -54,6 +54,7 @@ import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.cmr.workflow.WorkflowAdminService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDeployment; import org.alfresco.service.cmr.workflow.WorkflowException; @@ -126,6 +127,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine protected AuthorityDAO authorityDAO; protected JbpmTemplate jbpmTemplate; protected SearchService unprotectedSearchService; + protected WorkflowAdminService workflowAdminService; // Company Home protected StoreRef companyHomeStore; @@ -281,6 +283,15 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine this.unprotectedSearchService = unprotectedSearchService; } + /** + * Sets the Workflow Admin Service + * + * @param workflowAdminService + */ + public void setWorkflowAdminService(WorkflowAdminService workflowAdminService) + { + this.workflowAdminService = workflowAdminService; + } // // Workflow Definition... @@ -403,42 +414,49 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine @SuppressWarnings("unchecked") public List getDefinitions() { - try + if (workflowAdminService.isJBPMWorkflowDefinitionsVisible()) { - return (List)jbpmTemplate.execute(new JbpmCallback() + try { - public Object doInJbpm(JbpmContext context) + return (List)jbpmTemplate.execute(new JbpmCallback() { - GraphSession graphSession = context.getGraphSession(); - List processDefs = graphSession.findLatestProcessDefinitions(); - List workflowDefs = new ArrayList(processDefs.size()); - for (ProcessDefinition processDef : processDefs) - { - if (tenantService.isEnabled()) - { - try - { - tenantService.checkDomain(processDef.getName()); + public Object doInJbpm(JbpmContext context) + { + GraphSession graphSession = context.getGraphSession(); + List processDefs = graphSession.findLatestProcessDefinitions(); + List workflowDefs = new ArrayList(processDefs.size()); + for (ProcessDefinition processDef : processDefs) + { + if (tenantService.isEnabled()) + { + try + { + tenantService.checkDomain(processDef.getName()); + } + catch (RuntimeException re) + { + // deliberately skip this one - due to domain + // mismatch + continue; + } } - catch (RuntimeException re) - { - // deliberately skip this one - due to domain - // mismatch - continue; - } + + WorkflowDefinition workflowDef = createWorkflowDefinition(processDef); + workflowDefs.add(workflowDef); } - - WorkflowDefinition workflowDef = createWorkflowDefinition(processDef); - workflowDefs.add(workflowDef); + return workflowDefs; } - return workflowDefs; - } - }); + }); + } + catch (JbpmException e) + { + String msg = messageService.getMessage(ERR_GET_WORKFLOW_DEF); + throw new WorkflowException(msg, e); + } } - catch(JbpmException e) + else { - String msg = messageService.getMessage(ERR_GET_WORKFLOW_DEF); - throw new WorkflowException(msg, e); + return Collections.emptyList(); } } @@ -451,42 +469,49 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine @SuppressWarnings("unchecked") public List getAllDefinitions() { - try + if (workflowAdminService.isJBPMWorkflowDefinitionsVisible()) { - return (List)jbpmTemplate.execute(new JbpmCallback() + try { - public Object doInJbpm(JbpmContext context) + return (List)jbpmTemplate.execute(new JbpmCallback() { - GraphSession graphSession = context.getGraphSession(); - List processDefs = graphSession.findAllProcessDefinitions(); - List workflowDefs = new ArrayList(processDefs.size()); - for (ProcessDefinition processDef : processDefs) + public Object doInJbpm(JbpmContext context) { - if (tenantService.isEnabled()) - { - try - { - tenantService.checkDomain(processDef.getName()); + GraphSession graphSession = context.getGraphSession(); + List processDefs = graphSession.findAllProcessDefinitions(); + List workflowDefs = new ArrayList(processDefs.size()); + for (ProcessDefinition processDef : processDefs) + { + if (tenantService.isEnabled()) + { + try + { + tenantService.checkDomain(processDef.getName()); + } + catch (RuntimeException re) + { + // deliberately skip this one - due to domain + // mismatch + continue; + } } - catch (RuntimeException re) - { - // deliberately skip this one - due to domain - // mismatch - continue; - } + + WorkflowDefinition workflowDef = createWorkflowDefinition(processDef); + workflowDefs.add(workflowDef); } - - WorkflowDefinition workflowDef = createWorkflowDefinition(processDef); - workflowDefs.add(workflowDef); + return workflowDefs; } - return workflowDefs; - } - }); + }); + } + catch (JbpmException e) + { + String msg = messageService.getMessage(ERR_GET_WORKFLOW_DEF); + throw new WorkflowException(msg, e); + } } - catch(JbpmException e) + else { - String msg = messageService.getMessage(ERR_GET_WORKFLOW_DEF); - throw new WorkflowException(msg, e); + return Collections.emptyList(); } } diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java index ff1df20906..18675ea3a2 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java @@ -32,11 +32,13 @@ import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.workflow.BPMEngineRegistry; import org.alfresco.repo.workflow.TaskComponent; +import org.alfresco.repo.workflow.WorkflowAdminServiceImpl; import org.alfresco.repo.workflow.WorkflowComponent; import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.repo.workflow.WorkflowPackageComponent; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.cmr.workflow.WorkflowAdminService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDeployment; import org.alfresco.service.cmr.workflow.WorkflowException; @@ -68,6 +70,7 @@ public class JBPMEngineTest extends BaseAlfrescoSpringTest private WorkflowPackageComponent packageComponent; private PersonService personService; private WorkflowDefinition testWorkflowDef; + private WorkflowAdminServiceImpl workflowAdminService; private NodeRef person1; private NodeRef person2; private NodeRef person3; @@ -86,7 +89,11 @@ public class JBPMEngineTest extends BaseAlfrescoSpringTest BPMEngineRegistry registry = (BPMEngineRegistry)applicationContext.getBean("bpm_engineRegistry"); workflowComponent = registry.getWorkflowComponent(JBPMEngine.ENGINE_ID); taskComponent = registry.getTaskComponent(JBPMEngine.ENGINE_ID); - packageComponent = (WorkflowPackageComponent)applicationContext.getBean("workflowPackageImpl"); + packageComponent = (WorkflowPackageComponent)applicationContext.getBean("workflowPackageImpl"); + + // for the purposes of the tests make sure JBPM workflow definitions are visible + this.workflowAdminService = (WorkflowAdminServiceImpl) applicationContext.getBean("workflowAdminService"); + this.workflowAdminService.setJBPMWorkflowDefinitionsVisible(true); // deploy test process messages I18NUtil.registerResourceBundle("jbpmresources/test-messages"); @@ -558,7 +565,32 @@ public class JBPMEngineTest extends BaseAlfrescoSpringTest assertEquals(WorkflowTaskState.IN_PROGRESS, tasks1.get(0).getState()); WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).getId(), null); assertNotNull(updatedTask); - } + } + + public void testWorkflowDefinitionVisibility() + { + // retrieve workflow definitions + List defs = workflowComponent.getDefinitions(); + List allDefs = workflowComponent.getAllDefinitions(); + + // make sure both lists are populated (only if the JBPM engine is enabled) + if (workflowAdminService.isEngineEnabled(JBPMEngine.ENGINE_ID)) + { + assertFalse(defs.isEmpty()); + assertFalse(allDefs.isEmpty()); + } + + // turn off workflow definition visibility + this.workflowAdminService.setJBPMWorkflowDefinitionsVisible(false); + + // retrieve workflow definitions again + defs = workflowComponent.getDefinitions(); + allDefs = workflowComponent.getAllDefinitions(); + + // ensure the list of workflow definitions are empty + assertTrue(defs.isEmpty()); + assertTrue(allDefs.isEmpty()); + } // public void testAssignTaskVariablesWithScript() throws Exception // { diff --git a/source/java/org/alfresco/service/cmr/workflow/WorkflowAdminService.java b/source/java/org/alfresco/service/cmr/workflow/WorkflowAdminService.java index cf7cacd071..96a5f67fdd 100644 --- a/source/java/org/alfresco/service/cmr/workflow/WorkflowAdminService.java +++ b/source/java/org/alfresco/service/cmr/workflow/WorkflowAdminService.java @@ -34,4 +34,15 @@ public interface WorkflowAdminService * @return true if the engine id is valid and is enabled */ public boolean isEngineEnabled(String engineId); + + /** + * Determines whether the JBPM workflow definitions are visible + * when the JBPM engine is enabled. + * + * NOTE: Workflow definitions can always be retrieved directly + * i.e. via name or id + * + * @return true if the definitions are visible + */ + public boolean isJBPMWorkflowDefinitionsVisible(); }