From ac8529fc2472b97ef4f08c524ae25410cc0d93c2 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 21 Jan 2010 17:22:18 +0000 Subject: [PATCH] Merge V3.2 To HEAD 17834: Fix for ETHREEOH-3613. Now you can add two different pieces of content with the same name to a package. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@18230 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/model/bpmModel.xml | 25 + .../workflow/StartWorkflowActionExecuter.java | 2 +- .../alfresco/repo/workflow/WorkflowModel.java | 4 + .../repo/workflow/WorkflowPackageImpl.java | 196 ++++--- .../repo/workflow/WorkflowServiceImpl.java | 528 +++++++++++------- 5 files changed, 465 insertions(+), 290 deletions(-) diff --git a/config/alfresco/model/bpmModel.xml b/config/alfresco/model/bpmModel.xml index ef355f860e..0b03cbf3d6 100644 --- a/config/alfresco/model/bpmModel.xml +++ b/config/alfresco/model/bpmModel.xml @@ -70,6 +70,31 @@ + + + + + + Package Folder + cm:systemfolder + true + + + + false + true + + + sys:base + false + true + + true + true + + + + diff --git a/source/java/org/alfresco/repo/workflow/StartWorkflowActionExecuter.java b/source/java/org/alfresco/repo/workflow/StartWorkflowActionExecuter.java index 1fe1d4a924..c83cdc8052 100644 --- a/source/java/org/alfresco/repo/workflow/StartWorkflowActionExecuter.java +++ b/source/java/org/alfresco/repo/workflow/StartWorkflowActionExecuter.java @@ -126,7 +126,7 @@ public class StartWorkflowActionExecuter extends ActionExecuterAbstractBase NodeRef workflowPackage = (NodeRef)ruleAction.getParameterValue(WorkflowModel.ASSOC_PACKAGE.toPrefixString(namespaceService)); workflowPackage = workflowService.createPackage(workflowPackage); ChildAssociationRef childAssoc = nodeService.getPrimaryParent(actionedUponNodeRef); - nodeService.addChild(workflowPackage, actionedUponNodeRef, ContentModel.ASSOC_CONTAINS, childAssoc.getQName()); + nodeService.addChild(workflowPackage, actionedUponNodeRef, WorkflowModel.ASSOC_PACKAGE_CONTAINS, childAssoc.getQName()); // build map of workflow start task parameters Map paramValues = ruleAction.getParameterValues(); diff --git a/source/java/org/alfresco/repo/workflow/WorkflowModel.java b/source/java/org/alfresco/repo/workflow/WorkflowModel.java index 736e0fff51..9b62830075 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowModel.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowModel.java @@ -37,6 +37,10 @@ public interface WorkflowModel // // Base Business Process Management Definitions // + + // package folder constants + static final QName TYPE_PACKAGE = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package"); + static final QName ASSOC_PACKAGE_CONTAINS= QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "packageContains"); // task constants static final QName TYPE_TASK = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "task"); diff --git a/source/java/org/alfresco/repo/workflow/WorkflowPackageImpl.java b/source/java/org/alfresco/repo/workflow/WorkflowPackageImpl.java index e2b1b799d2..8cc8079a64 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowPackageImpl.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowPackageImpl.java @@ -22,6 +22,7 @@ * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ + package org.alfresco.repo.workflow; import java.util.ArrayList; @@ -41,7 +42,6 @@ import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; import org.springframework.extensions.surf.util.ParameterCheck; - /** * Alfresco implementation of Workflow Package where the package is stored * within the Alfresco Repository. @@ -61,9 +61,9 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent private NodeRef systemWorkflowContainer = null; private TenantService tenantService; - /** - * @param bootstrap the importer bootstrap for the store to place workflow items into + * @param bootstrap the importer bootstrap for the store to place workflow + * items into */ public void setImporterBootstrap(ImporterBootstrap bootstrap) { @@ -71,7 +71,7 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent } /** - * @param searchService search service + * @param searchService search service */ public void setSearchService(SearchService searchService) { @@ -79,37 +79,39 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent } /** - * @param nodeService node service + * @param nodeService node service */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } - + public void setPermissionService(PermissionService permissionService) { this.permissionService = permissionService; } - + /** - * @param namespaceService namespace service + * @param namespaceService namespace service */ public void setNamespaceService(NamespaceService namespaceService) { this.namespaceService = namespaceService; } - + /** - * @param tenantService tenant service + * @param tenantService tenant service */ public void setTenantService(TenantService tenantService) { this.tenantService = tenantService; - } + } - - /* (non-Javadoc) - * @see org.alfresco.repo.workflow.WorkflowPackageComponent#createPackage(org.alfresco.service.cmr.repository.NodeRef) + /* + * (non-Javadoc) + * @see + * org.alfresco.repo.workflow.WorkflowPackageComponent#createPackage(org + * .alfresco.service.cmr.repository.NodeRef) */ public NodeRef createPackage(NodeRef container) { @@ -117,52 +119,76 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent boolean isSystemPackage = false; if (container == null) { - // create simple folder in workflow system folder - NodeRef system = getSystemWorkflowContainer(); - - // TODO: Consider structuring this folder, if number of children becomes an issue - NodeRef packages = null; - List results = searchService.selectNodes(system, "./" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + PACKAGE_FOLDER, null, namespaceService, false); - if (results.size() > 0) - { - packages = results.get(0); - } - else - { - QName qname = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, PACKAGE_FOLDER); - ChildAssociationRef childRef = nodeService.createNode(system, ContentModel.ASSOC_CHILDREN, qname, ContentModel.TYPE_SYSTEM_FOLDER); - packages = childRef.getChildRef(); - } - - String containerName = "pkg_" + GUID.generate(); - QName qname = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, containerName); - ChildAssociationRef childRef = nodeService.createNode(packages, ContentModel.ASSOC_CONTAINS, qname, ContentModel.TYPE_SYSTEM_FOLDER); - container = childRef.getChildRef(); - // TODO: For now, grant full access to everyone - permissionService.setPermission(container, PermissionService.ALL_AUTHORITIES, PermissionService.ALL_PERMISSIONS, true); + container = makePackageContainer(); isSystemPackage = true; } - + // attach workflow package - if (nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) - { - throw new WorkflowException("Container '" + container + "' is already a workflow package."); - } + if (nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) { throw new WorkflowException( + "Container '" + container + "' is already a workflow package."); } nodeService.addAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE, null); nodeService.setProperty(container, WorkflowModel.PROP_IS_SYSTEM_PACKAGE, isSystemPackage); - + // return container return container; } - /* (non-Javadoc) - * @see org.alfresco.repo.workflow.WorkflowPackageComponent#deletePackage(org.alfresco.service.cmr.repository.NodeRef) + private NodeRef makePackageContainer() + { + NodeRef packages = findOrCreatePackagesFolder(); + String packageId = "pkg_" + GUID.generate(); + QName packageName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, packageId); + ChildAssociationRef packageAssoc = nodeService.createNode(packages, ContentModel.ASSOC_CONTAINS, packageName, + WorkflowModel.TYPE_PACKAGE); + NodeRef packageContainer = packageAssoc.getChildRef(); + // TODO: For now, grant full access to everyone + permissionService.setPermission(packageContainer, PermissionService.ALL_AUTHORITIES, + PermissionService.ALL_PERMISSIONS, true); + return packageContainer; + } + + /** + * Finds the system folder in which all packages are stored. If this folder + * has not been created yet then this method creates a new packages folder. + * + * @return The system folder containing all workflow packages. + */ + private NodeRef findOrCreatePackagesFolder() + { + // create simple folder in workflow system folder + NodeRef system = getSystemWorkflowContainer(); + + // TODO: Consider structuring this folder, if number of children becomes + // an issue + List packageFolders = searchService.selectNodes(system, "./" + NamespaceService.CONTENT_MODEL_PREFIX + + ":" + PACKAGE_FOLDER, null, namespaceService, false); + if (packageFolders.size() > 0) + { + return packageFolders.get(0); // Return folder if exists. + } + else + // Create new package folder + { + QName packageFolderName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, PACKAGE_FOLDER); + ChildAssociationRef packageFolderAssoc = nodeService.createNode(system, ContentModel.ASSOC_CHILDREN, + packageFolderName, ContentModel.TYPE_SYSTEM_FOLDER); + return packageFolderAssoc.getChildRef(); + } + } + + /* + * (non-Javadoc) + * @see + * org.alfresco.repo.workflow.WorkflowPackageComponent#deletePackage(org + * .alfresco.service.cmr.repository.NodeRef) */ public void deletePackage(NodeRef container) { - if (container != null && nodeService.exists(container) && nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) + if (container != null && nodeService.exists(container) + && nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) { - Boolean isSystemPackage = (Boolean)nodeService.getProperty(container, WorkflowModel.PROP_IS_SYSTEM_PACKAGE); + Boolean isSystemPackage = (Boolean) nodeService + .getProperty(container, WorkflowModel.PROP_IS_SYSTEM_PACKAGE); if (isSystemPackage != null && isSystemPackage.booleanValue()) { nodeService.deleteNode(container); @@ -173,9 +199,12 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent } } } - - /* (non-Javadoc) - * @see org.alfresco.repo.workflow.WorkflowPackageComponent#getWorkflowIdsForContent(org.alfresco.service.cmr.repository.NodeRef, boolean) + + /* + * (non-Javadoc) + * @see + * org.alfresco.repo.workflow.WorkflowPackageComponent#getWorkflowIdsForContent + * (org.alfresco.service.cmr.repository.NodeRef, boolean) */ public List getWorkflowIdsForContent(NodeRef packageItem) { @@ -183,14 +212,15 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent List workflowIds = new ArrayList(); if (nodeService.exists(packageItem)) { - List packageItemParents = nodeService.getParentAssocs(packageItem); - for (ChildAssociationRef packageItemParent : packageItemParents) + List parentAssocs = nodeService.getParentAssocs(packageItem); + for (ChildAssociationRef parentAssoc : parentAssocs) { - NodeRef parentRef = packageItemParent.getParentRef(); - if (nodeService.hasAspect(parentRef, WorkflowModel.ASPECT_WORKFLOW_PACKAGE) - && !nodeService.hasAspect(parentRef, ContentModel.ASPECT_ARCHIVED)) + NodeRef parentRef = parentAssoc.getParentRef(); + if (nodeService.hasAspect(parentRef, WorkflowModel.ASPECT_WORKFLOW_PACKAGE) + && !nodeService.hasAspect(parentRef, ContentModel.ASPECT_ARCHIVED)) { - String workflowInstance = (String)nodeService.getProperty(parentRef, WorkflowModel.PROP_WORKFLOW_INSTANCE_ID); + String workflowInstance = (String) nodeService.getProperty(parentRef, + WorkflowModel.PROP_WORKFLOW_INSTANCE_ID); if (workflowInstance != null && workflowInstance.length() > 0) { workflowIds.add(workflowInstance); @@ -200,11 +230,11 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent } return workflowIds; } - + /** * Gets the system workflow container for storing workflow related items * - * @return the system workflow container + * @return the system workflow container */ private NodeRef getSystemWorkflowContainer() { @@ -212,11 +242,9 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent { NodeRef systemContainer = findSystemContainer(); NodeRef tenantSystemWorkflowContainer = findSystemWorkflowContainer(systemContainer); - if (tenantSystemWorkflowContainer == null) - { - throw new WorkflowException("Unable to find system workflow folder - does not exist."); - } - + if (tenantSystemWorkflowContainer == null) { throw new WorkflowException( + "Unable to find system workflow folder - does not exist."); } + return tenantSystemWorkflowContainer; } else @@ -225,31 +253,27 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent { NodeRef systemContainer = findSystemContainer(); systemWorkflowContainer = findSystemWorkflowContainer(systemContainer); - if (systemWorkflowContainer == null) - { - throw new WorkflowException("Unable to find system workflow folder - does not exist."); - } + if (systemWorkflowContainer == null) { throw new WorkflowException( + "Unable to find system workflow folder - does not exist."); } } return systemWorkflowContainer; } - + } - + /** * Finds the system workflow container - * - * @param systemContainer the system container - * @return the system workflow container + * + * @param systemContainer the system container + * @return the system workflow container */ private NodeRef findSystemWorkflowContainer(NodeRef systemContainer) { String path = bootstrap.getConfiguration().getProperty("system.workflow_container.childname"); - if (path == null) - { - throw new WorkflowException("Unable to locate workflow system container - path not specified"); - } + if (path == null) { throw new WorkflowException( + "Unable to locate workflow system container - path not specified"); } List nodeRefs = searchService.selectNodes(systemContainer, path, null, namespaceService, false); - + if (tenantService.isEnabled()) { NodeRef tenantSystemWorkflowContainer = null; @@ -272,28 +296,23 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent /** * Finds the system container * - * @return the system container + * @return the system container */ private NodeRef findSystemContainer() { String path = bootstrap.getConfiguration().getProperty("system.system_container.childname"); - if (path == null) - { - throw new WorkflowException("Unable to locate system container - path not specified"); - } + if (path == null) { throw new WorkflowException("Unable to locate system container - path not specified"); } NodeRef root = nodeService.getRootNode(bootstrap.getStoreRef()); List nodeRefs = searchService.selectNodes(root, path, null, namespaceService, false); - if (nodeRefs == null || nodeRefs.size() == 0) - { - throw new WorkflowException("Unable to locate system container - path not found"); - } + if (nodeRefs == null || nodeRefs.size() == 0) { throw new WorkflowException( + "Unable to locate system container - path not found"); } return nodeRefs.get(0); } /** * Creates the System Workflow Container * - * @return the system workflow container + * @return the system workflow container */ public NodeRef createSystemWorkflowContainer() { @@ -303,7 +322,8 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent { String name = bootstrap.getConfiguration().getProperty("system.workflow_container.childname"); QName qname = QName.createQName(name, namespaceService); - ChildAssociationRef childRef = nodeService.createNode(systemContainer, ContentModel.ASSOC_CHILDREN, qname, ContentModel.TYPE_CONTAINER); + ChildAssociationRef childRef = nodeService.createNode(systemContainer, ContentModel.ASSOC_CHILDREN, qname, + ContentModel.TYPE_CONTAINER); systemWorkflowContainer = childRef.getChildRef(); } return systemWorkflowContainer; diff --git a/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java b/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java index 5d1c364f54..95f364eae1 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowServiceImpl.java @@ -22,6 +22,7 @@ * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ + package org.alfresco.repo.workflow; import java.io.InputStream; @@ -38,7 +39,6 @@ import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.service.cmr.avmsync.AVMDifference; import org.alfresco.service.cmr.avmsync.AVMSyncService; import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; @@ -59,14 +59,12 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskQuery; import org.alfresco.service.cmr.workflow.WorkflowTaskState; import org.alfresco.service.cmr.workflow.WorkflowTimer; import org.alfresco.service.namespace.QName; -import org.alfresco.service.namespace.RegexQNamePattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - /** - * Default Alfresco Workflow Service whose implementation is backed by registered - * BPM Engine plug-in components. + * Default Alfresco Workflow Service whose implementation is backed by + * registered BPM Engine plug-in components. * * @author davidc */ @@ -85,7 +83,6 @@ public class WorkflowServiceImpl implements WorkflowService private DictionaryService dictionaryService; private NodeService protectedNodeService; - /** * Sets the Authority Service * @@ -99,23 +96,23 @@ public class WorkflowServiceImpl implements WorkflowService /** * Sets the BPM Engine Registry * - * @param registry bpm engine registry + * @param registry bpm engine registry */ public void setBPMEngineRegistry(BPMEngineRegistry registry) { this.registry = registry; } - + /** * Sets the Workflow Package Component * - * @param workflowPackageComponent workflow package component + * @param workflowPackageComponent workflow package component */ public void setWorkflowPackageComponent(WorkflowPackageComponent workflowPackageComponent) { this.workflowPackageComponent = workflowPackageComponent; } - + /** * Sets the Node Service * @@ -125,7 +122,7 @@ public class WorkflowServiceImpl implements WorkflowService { this.nodeService = nodeService; } - + /** * Sets the Content Service * @@ -135,9 +132,10 @@ public class WorkflowServiceImpl implements WorkflowService { this.contentService = contentService; } - + /** - * Set the avm sync service + * Set the avm sync service + * * @param avmSyncService */ public void setAvmSyncService(AVMSyncService avmSyncService) @@ -146,7 +144,7 @@ public class WorkflowServiceImpl implements WorkflowService } /** - * Set the dictionary service + * Set the dictionary service * * @param dictionaryService */ @@ -155,9 +153,9 @@ public class WorkflowServiceImpl implements WorkflowService this.dictionaryService = dictionaryService; } - /** * Set the node service which applies permissions + * * @param protectedNodeService */ public void setProtectedNodeService(NodeService protectedNodeService) @@ -165,14 +163,17 @@ public class WorkflowServiceImpl implements WorkflowService this.protectedNodeService = protectedNodeService; } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#deployDefinition(java.lang.String, java.io.InputStream, java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#deployDefinition(java + * .lang.String, java.io.InputStream, java.lang.String) */ public WorkflowDeployment deployDefinition(String engineId, InputStream workflowDefinition, String mimetype) { WorkflowComponent component = getWorkflowComponent(engineId); WorkflowDeployment deployment = component.deployDefinition(workflowDefinition, mimetype); - + if (logger.isDebugEnabled() && deployment.problems.length > 0) { for (String problem : deployment.problems) @@ -180,28 +181,33 @@ public class WorkflowServiceImpl implements WorkflowService logger.debug("Workflow definition '" + deployment.definition.title + "' problem: " + problem); } } - + return deployment; } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#isDefinitionDeployed(org.alfresco.service.cmr.repository.NodeRef) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#isDefinitionDeployed + * (org.alfresco.service.cmr.repository.NodeRef) */ public boolean isDefinitionDeployed(NodeRef workflowDefinition) { - if (! nodeService.getType(workflowDefinition).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) - { - throw new WorkflowException("Node " + workflowDefinition + " is not of type 'bpm:workflowDefinition'"); - } - - String engineId = (String)nodeService.getProperty(workflowDefinition, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); + if (!nodeService.getType(workflowDefinition).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) { throw new WorkflowException( + "Node " + workflowDefinition + " is not of type 'bpm:workflowDefinition'"); } + + String engineId = (String) nodeService.getProperty(workflowDefinition, + WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); ContentReader contentReader = contentService.getReader(workflowDefinition, ContentModel.PROP_CONTENT); return isDefinitionDeployed(engineId, contentReader.getContentInputStream(), contentReader.getMimetype()); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#isDefinitionDeployed(java.lang.String, java.io.InputStream, java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#isDefinitionDeployed + * (java.lang.String, java.io.InputStream, java.lang.String) */ public boolean isDefinitionDeployed(String engineId, InputStream workflowDefinition, String mimetype) { @@ -209,24 +215,29 @@ public class WorkflowServiceImpl implements WorkflowService return component.isDefinitionDeployed(workflowDefinition, mimetype); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#deployDefinition(org.alfresco.service.cmr.repository.NodeRef) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#deployDefinition(org + * .alfresco.service.cmr.repository.NodeRef) */ public WorkflowDeployment deployDefinition(NodeRef definitionContent) { - if (! nodeService.getType(definitionContent).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) - { - throw new WorkflowException("Node " + definitionContent + " is not of type 'bpm:workflowDefinition'"); - } - - String engineId = (String)nodeService.getProperty(definitionContent, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); + if (!nodeService.getType(definitionContent).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) { throw new WorkflowException( + "Node " + definitionContent + " is not of type 'bpm:workflowDefinition'"); } + + String engineId = (String) nodeService + .getProperty(definitionContent, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); ContentReader contentReader = contentService.getReader(definitionContent, ContentModel.PROP_CONTENT); return deployDefinition(engineId, contentReader.getContentInputStream(), contentReader.getMimetype()); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#undeployDefinition(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#undeployDefinition( + * java.lang.String) */ public void undeployDefinition(String workflowDefinitionId) { @@ -235,38 +246,44 @@ public class WorkflowServiceImpl implements WorkflowService component.undeployDefinition(workflowDefinitionId); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitions() */ public List getDefinitions() { List definitions = new ArrayList(10); String[] ids = registry.getWorkflowComponents(); - for (String id: ids) + for (String id : ids) { WorkflowComponent component = registry.getWorkflowComponent(id); definitions.addAll(component.getDefinitions()); } return Collections.unmodifiableList(definitions); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getAllDefinitions() + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getAllDefinitions() */ public List getAllDefinitions() { List definitions = new ArrayList(10); String[] ids = registry.getWorkflowComponents(); - for (String id: ids) + for (String id : ids) { WorkflowComponent component = registry.getWorkflowComponent(id); definitions.addAll(component.getAllDefinitions()); } return Collections.unmodifiableList(definitions); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionById(java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionById(java + * .lang.String) */ public WorkflowDefinition getDefinitionById(String workflowDefinitionId) { @@ -275,8 +292,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getDefinitionById(workflowDefinitionId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionByName(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionByName + * (java.lang.String) */ public WorkflowDefinition getDefinitionByName(String workflowName) { @@ -285,8 +305,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getDefinitionByName(workflowName); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getAllDefinitionsByName(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getAllDefinitionsByName + * (java.lang.String) */ public List getAllDefinitionsByName(String workflowName) { @@ -295,8 +318,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getAllDefinitionsByName(workflowName); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionImage(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getDefinitionImage( + * java.lang.String) */ public byte[] getDefinitionImage(String workflowDefinitionId) { @@ -309,9 +335,12 @@ public class WorkflowServiceImpl implements WorkflowService } return definitionImage; } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getAllTaskDefinitions(java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getAllTaskDefinitions + * (java.lang.String) */ public List getTaskDefinitions(final String workflowDefinitionId) { @@ -319,9 +348,12 @@ public class WorkflowServiceImpl implements WorkflowService WorkflowComponent component = getWorkflowComponent(engineId); return component.getTaskDefinitions(workflowDefinitionId); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#startWorkflow(java.lang.String, java.util.Map) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#startWorkflow(java. + * lang.String, java.util.Map) */ public WorkflowPath startWorkflow(String workflowDefinitionId, Map parameters) { @@ -330,8 +362,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.startWorkflow(workflowDefinitionId, parameters); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#startWorkflowFromTemplate(org.alfresco.service.cmr.repository.NodeRef) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#startWorkflowFromTemplate + * (org.alfresco.service.cmr.repository.NodeRef) */ public WorkflowPath startWorkflowFromTemplate(NodeRef templateDefinition) { @@ -339,8 +374,11 @@ public class WorkflowServiceImpl implements WorkflowService throw new UnsupportedOperationException(); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getActiveWorkflows(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getActiveWorkflows( + * java.lang.String) */ public List getActiveWorkflows(String workflowDefinitionId) { @@ -349,8 +387,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getActiveWorkflows(workflowDefinitionId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowById(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowById(java + * .lang.String) */ public WorkflowInstance getWorkflowById(String workflowId) { @@ -358,9 +399,12 @@ public class WorkflowServiceImpl implements WorkflowService WorkflowComponent component = getWorkflowComponent(engineId); return component.getWorkflowById(workflowId); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowPaths(java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowPaths(java + * .lang.String) */ public List getWorkflowPaths(String workflowId) { @@ -369,8 +413,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getWorkflowPaths(workflowId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getPathProperties(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getPathProperties(java + * .lang.String) */ public Map getPathProperties(String pathId) { @@ -378,37 +425,48 @@ public class WorkflowServiceImpl implements WorkflowService WorkflowComponent component = getWorkflowComponent(engineId); return component.getPathProperties(pathId); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#cancelWorkflow(java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#cancelWorkflow(java + * .lang.String) */ public WorkflowInstance cancelWorkflow(String workflowId) { String engineId = BPMEngineRegistry.getEngineId(workflowId); WorkflowComponent component = getWorkflowComponent(engineId); WorkflowInstance instance = component.cancelWorkflow(workflowId); - // NOTE: Delete workflow package after cancelling workflow, so it's still available - // in process-end events of workflow definition + // NOTE: Delete workflow package after cancelling workflow, so it's + // still available + // in process-end events of workflow definition workflowPackageComponent.deletePackage(instance.workflowPackage); return instance; } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#deleteWorkflow(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#deleteWorkflow(java + * .lang.String) */ public WorkflowInstance deleteWorkflow(String workflowId) { String engineId = BPMEngineRegistry.getEngineId(workflowId); WorkflowComponent component = getWorkflowComponent(engineId); WorkflowInstance instance = component.deleteWorkflow(workflowId); - // NOTE: Delete workflow package after deleting workflow, so it's still available - // in process-end events of workflow definition + // NOTE: Delete workflow package after deleting workflow, so it's still + // available + // in process-end events of workflow definition workflowPackageComponent.deletePackage(instance.workflowPackage); return instance; } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#signal(java.lang.String, java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#signal(java.lang.String + * , java.lang.String) */ public WorkflowPath signal(String pathId, String transition) { @@ -417,8 +475,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.signal(pathId, transition); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#fireEvent(java.lang.String, java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#fireEvent(java.lang + * .String, java.lang.String) */ public WorkflowPath fireEvent(String pathId, String event) { @@ -427,8 +488,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.fireEvent(pathId, event); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getTimers(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getTimers(java.lang + * .String) */ public List getTimers(String workflowId) { @@ -437,8 +501,11 @@ public class WorkflowServiceImpl implements WorkflowService return component.getTimers(workflowId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getTasksForWorkflowPath(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getTasksForWorkflowPath + * (java.lang.String) */ public List getTasksForWorkflowPath(String pathId) { @@ -447,14 +514,17 @@ public class WorkflowServiceImpl implements WorkflowService return component.getTasksForWorkflowPath(pathId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getAssignedTasks(java.lang.String, org.alfresco.service.cmr.workflow.WorkflowTaskState) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getAssignedTasks(java + * .lang.String, org.alfresco.service.cmr.workflow.WorkflowTaskState) */ public List getAssignedTasks(String authority, WorkflowTaskState state) { List tasks = new ArrayList(10); String[] ids = registry.getTaskComponents(); - for (String id: ids) + for (String id : ids) { TaskComponent component = registry.getTaskComponent(id); tasks.addAll(component.getAssignedTasks(authority, state)); @@ -462,8 +532,11 @@ public class WorkflowServiceImpl implements WorkflowService return Collections.unmodifiableList(tasks); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getPooledTasks(java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getPooledTasks(java + * .lang.String) */ public List getPooledTasks(String authority) { @@ -473,10 +546,11 @@ public class WorkflowServiceImpl implements WorkflowService Set parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, authority, false); authorities.addAll(parents); - // Retrieve pooled tasks for authorities (from each of the registered task components) + // Retrieve pooled tasks for authorities (from each of the registered + // task components) List tasks = new ArrayList(10); String[] ids = registry.getTaskComponents(); - for (String id: ids) + for (String id : ids) { TaskComponent component = registry.getTaskComponent(id); tasks.addAll(component.getPooledTasks(authorities)); @@ -484,8 +558,11 @@ public class WorkflowServiceImpl implements WorkflowService return Collections.unmodifiableList(tasks); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#queryTasks(org.alfresco.service.cmr.workflow.WorkflowTaskFilter) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#queryTasks(org.alfresco + * .service.cmr.workflow.WorkflowTaskFilter) */ public List queryTasks(WorkflowTaskQuery query) { @@ -500,21 +577,20 @@ public class WorkflowServiceImpl implements WorkflowService if (taskId != null) { String taskEngineId = BPMEngineRegistry.getEngineId(taskId); - if (engineId != null && !engineId.equals(taskEngineId)) - { - throw new WorkflowException("Cannot query for tasks across multiple task components: " + engineId + ", " + taskEngineId); - } - engineId = taskEngineId; + if (engineId != null && !engineId.equals(taskEngineId)) { throw new WorkflowException( + "Cannot query for tasks across multiple task components: " + engineId + ", " + taskEngineId); } + engineId = taskEngineId; } - + // perform query List tasks = new ArrayList(10); String[] ids = registry.getTaskComponents(); - for (String id: ids) + for (String id : ids) { TaskComponent component = registry.getTaskComponent(id); - // NOTE: don't bother asking task component if specific task or process id - // are in the filter and do not correspond to the component + // NOTE: don't bother asking task component if specific task or + // process id + // are in the filter and do not correspond to the component if (engineId != null && !engineId.equals(id)) { continue; @@ -524,18 +600,25 @@ public class WorkflowServiceImpl implements WorkflowService return Collections.unmodifiableList(tasks); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#updateTask(java.lang.String, java.util.Map, java.util.Map, java.util.Map) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#updateTask(java.lang + * .String, java.util.Map, java.util.Map, java.util.Map) */ - public WorkflowTask updateTask(String taskId, Map properties, Map> add, Map> remove) + public WorkflowTask updateTask(String taskId, Map properties, Map> add, + Map> remove) { String engineId = BPMEngineRegistry.getEngineId(taskId); TaskComponent component = getTaskComponent(engineId); return component.updateTask(taskId, properties, add, remove); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#endTask(java.lang.String, java.lang.String) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#endTask(java.lang.String + * , java.lang.String) */ public WorkflowTask endTask(String taskId, String transition) { @@ -543,9 +626,12 @@ public class WorkflowServiceImpl implements WorkflowService TaskComponent component = getTaskComponent(engineId); return component.endTask(taskId, transition); } - - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getTaskById(java.lang.String) + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getTaskById(java.lang + * .String) */ public WorkflowTask getTaskById(String taskId) { @@ -554,16 +640,22 @@ public class WorkflowServiceImpl implements WorkflowService return component.getTaskById(taskId); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#createPackage(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#createPackage(java. + * lang.String, org.alfresco.service.cmr.repository.NodeRef) */ public NodeRef createPackage(NodeRef container) { return workflowPackageComponent.createPackage(container); } - /* (non-Javadoc) - * @see org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowsForContent(org.alfresco.service.cmr.repository.NodeRef, boolean) + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.workflow.WorkflowService#getWorkflowsForContent + * (org.alfresco.service.cmr.repository.NodeRef, boolean) */ public List getWorkflowsForContent(NodeRef packageItem, boolean active) { @@ -582,113 +674,147 @@ public class WorkflowServiceImpl implements WorkflowService return workflowInstances; } - /** - * Gets the Workflow Component registered against the specified BPM Engine Id + * Gets the Workflow Component registered against the specified BPM Engine + * Id * - * @param engineId engine id + * @param engineId engine id */ private WorkflowComponent getWorkflowComponent(String engineId) { WorkflowComponent component = registry.getWorkflowComponent(engineId); - if (component == null) - { - throw new WorkflowException("Workflow Component for engine id '" + engineId + "' is not registered"); - } + if (component == null) { throw new WorkflowException("Workflow Component for engine id '" + engineId + + "' is not registered"); } return component; } /** * Gets the Task Component registered against the specified BPM Engine Id * - * @param engineId engine id + * @param engineId engine id */ private TaskComponent getTaskComponent(String engineId) { TaskComponent component = registry.getTaskComponent(engineId); - if (component == null) - { - throw new WorkflowException("Task Component for engine id '" + engineId + "' is not registered"); - } + if (component == null) { throw new WorkflowException("Task Component for engine id '" + engineId + + "' is not registered"); } return component; } public List getPackageContents(String taskId) { - WorkflowTask workflowTask = getTaskById(taskId); - List contents = new ArrayList(); - - if (workflowTask != null) + NodeRef workflowPackage = getWorkflowPackageIfExists(taskId); + if (workflowPackage == null) { - NodeRef workflowPackage = (NodeRef)workflowTask.properties.get(WorkflowModel.ASSOC_PACKAGE); - if (workflowPackage != null) + return Collections.emptyList(); + } + else if (workflowPackage.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM)) + { + return getAvmPackageContents(workflowPackage); + } + else + { + return getRepositoryPackageContents(workflowPackage); + } + } + + /** + * Attempts to get the workflow package node from the workflow task + * specified by the task Id. If the task Id is invalid or no workflow + * package is associated with the specified task then this method returns + * null. + * + * @param taskId + * @return The workflow package NodeRef or null. + */ + private NodeRef getWorkflowPackageIfExists(String taskId) + { + WorkflowTask workflowTask = getTaskById(taskId); + if (workflowTask != null) { return (NodeRef) workflowTask.properties.get(WorkflowModel.ASSOC_PACKAGE); } + return null; + } + + /** + * @param contents + * @param workflowPackage + */ + private List getRepositoryPackageContents(NodeRef workflowPackage) + { + List contents = new ArrayList(); + // get existing workflow package items + List packageAssocs = protectedNodeService.getChildAssocs(workflowPackage); + for (ChildAssociationRef assoc : packageAssocs) + { + // create our Node representation from the NodeRef + NodeRef nodeRef = assoc.getChildRef(); + QName assocType = assoc.getTypeQName(); + if (!protectedNodeService.exists(nodeRef)) { - if (workflowPackage.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM)) + if (logger.isDebugEnabled()) + logger.debug("Ignoring " + nodeRef + " as it has been removed from the repository"); + } + else if (!ContentModel.ASSOC_CONTAINS.equals(assocType) && !WorkflowModel.ASSOC_PACKAGE_CONTAINS.equals(assocType)) + { + if (logger.isDebugEnabled()) + logger.debug("Ignoring " + nodeRef + " as it has an invalid association type: "+assocType); + } + else + { + if (checkTypeIsInDataDictionary(nodeRef)) { - if (protectedNodeService.exists(workflowPackage)) - { - final NodeRef stagingNodeRef = (NodeRef) - protectedNodeService.getProperty(workflowPackage, - WCMModel.PROP_AVM_DIR_INDIRECTION); - final String stagingAvmPath = AVMNodeConverter.ToAVMVersionPath(stagingNodeRef).getSecond(); - final String packageAvmPath = AVMNodeConverter.ToAVMVersionPath(workflowPackage).getSecond(); - if (logger.isDebugEnabled()) - logger.debug("comparing " + packageAvmPath + " with " + stagingAvmPath); - for (AVMDifference d : avmSyncService.compare(-1, packageAvmPath, - -1, stagingAvmPath, - null)) - { - if (logger.isDebugEnabled()) - logger.debug("got difference " + d); - if (d.getDifferenceCode() == AVMDifference.NEWER || - d.getDifferenceCode() == AVMDifference.CONFLICT) - { - contents.add(AVMNodeConverter.ToNodeRef(d.getSourceVersion(), d.getSourcePath())); - } - } - } - } - else - { - // get existing workflow package items - List childRefs = protectedNodeService.getChildAssocs( - workflowPackage, ContentModel.ASSOC_CONTAINS, - RegexQNamePattern.MATCH_ALL); - - for (ChildAssociationRef ref: childRefs) - { - // create our Node representation from the NodeRef - NodeRef nodeRef = ref.getChildRef(); - - if (!protectedNodeService.exists(nodeRef)) - { - if (logger.isDebugEnabled()) - logger.debug("Ignoring " + nodeRef + " as it has been removed from the repository"); - } - else - { - // find it's type so we can see if it's a node we are interested in - QName type = protectedNodeService.getType(nodeRef); - - // make sure the type is defined in the data dictionary - TypeDefinition typeDef = dictionaryService.getType(type); - - if (typeDef == null) - { - if (logger.isWarnEnabled()) - logger.warn("Found invalid object in database: id = " + nodeRef + - ", type = " + type); - } - else - { - contents.add(nodeRef); - } - } - } + contents.add(nodeRef); + } + } + } + return contents; + } + + /** + * Gets teh type of the nodeRef and checks that the type exists in the data + * dcitionary. If the type is not in the data dictionary then the method + * logs a warning and returns false. Otherwise it returns true. + * + * @param nodeRef + * @return True if the nodeRef type is in the data dictionary, otherwise + * false. + */ + private boolean checkTypeIsInDataDictionary(NodeRef nodeRef) + { + QName type = protectedNodeService.getType(nodeRef); + if (dictionaryService.getType(type) == null) + { + if (logger.isWarnEnabled()) + logger.warn("Found invalid object in database: id = " + nodeRef + ", type = " + type); + return false; + } + return true; + } + + /** + * @param contents + * @param workflowPackage + */ + private List getAvmPackageContents(NodeRef workflowPackage) + { + List contents = new ArrayList(); + if (protectedNodeService.exists(workflowPackage)) + { + final NodeRef stagingNodeRef = (NodeRef) protectedNodeService.getProperty(workflowPackage, + WCMModel.PROP_AVM_DIR_INDIRECTION); + final String stagingAvmPath = AVMNodeConverter.ToAVMVersionPath(stagingNodeRef).getSecond(); + final String packageAvmPath = AVMNodeConverter.ToAVMVersionPath(workflowPackage).getSecond(); + if (logger.isDebugEnabled()) + logger.debug("comparing " + packageAvmPath + " with " + stagingAvmPath); + for (AVMDifference d : avmSyncService.compare(-1, packageAvmPath, -1, stagingAvmPath, null)) + { + if (logger.isDebugEnabled()) + logger.debug("got difference " + d); + if (d.getDifferenceCode() == AVMDifference.NEWER || d.getDifferenceCode() == AVMDifference.CONFLICT) + { + contents.add(AVMNodeConverter.ToNodeRef(d.getSourceVersion(), d.getSourcePath())); } } } - return contents; } }