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(); }