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
This commit is contained in:
Roy Wetherall
2010-01-21 17:22:18 +00:00
parent be551544aa
commit ac8529fc24
5 changed files with 465 additions and 290 deletions

View File

@@ -70,6 +70,31 @@
<types>
<!-- -->
<!-- Workflow Package Folder Type -->
<!-- -->
<type name="bpm:package">
<title>Package Folder</title>
<parent>cm:systemfolder</parent>
<archive>true</archive>
<associations>
<child-association name="bpm:packageContains">
<source>
<mandatory>false</mandatory>
<many>true</many>
</source>
<target>
<class>sys:base</class>
<mandatory>false</mandatory>
<many>true</many>
</target>
<duplicate>true</duplicate>
<propagateTimestamps>true</propagateTimestamps>
</child-association>
</associations>
</type>
<!-- -->
<!-- Base definition for all Tasks -->
<!-- -->

View File

@@ -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<String, Serializable> paramValues = ruleAction.getParameterValues();

View File

@@ -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");

View File

@@ -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<NodeRef> 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<NodeRef> 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<String> getWorkflowIdsForContent(NodeRef packageItem)
{
@@ -183,14 +212,15 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
List<String> workflowIds = new ArrayList<String>();
if (nodeService.exists(packageItem))
{
List<ChildAssociationRef> packageItemParents = nodeService.getParentAssocs(packageItem);
for (ChildAssociationRef packageItemParent : packageItemParents)
List<ChildAssociationRef> 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<NodeRef> 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<NodeRef> 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;

View File

@@ -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<WorkflowDefinition> getDefinitions()
{
List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(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<WorkflowDefinition> getAllDefinitions()
{
List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(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<WorkflowDefinition> 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<WorkflowTaskDefinition> 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<QName, Serializable> 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<WorkflowInstance> 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<WorkflowPath> 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<QName, Serializable> 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<WorkflowTimer> 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<WorkflowTask> 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<WorkflowTask> getAssignedTasks(String authority, WorkflowTaskState state)
{
List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(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<WorkflowTask> getPooledTasks(String authority)
{
@@ -473,10 +546,11 @@ public class WorkflowServiceImpl implements WorkflowService
Set<String> 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<WorkflowTask> tasks = new ArrayList<WorkflowTask>(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<WorkflowTask> 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<WorkflowTask> tasks = new ArrayList<WorkflowTask>(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<QName, Serializable> properties, Map<QName, List<NodeRef>> add, Map<QName, List<NodeRef>> remove)
public WorkflowTask updateTask(String taskId, Map<QName, Serializable> properties, Map<QName, List<NodeRef>> add,
Map<QName, List<NodeRef>> 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<WorkflowInstance> 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<NodeRef> getPackageContents(String taskId)
{
WorkflowTask workflowTask = getTaskById(taskId);
List<NodeRef> contents = new ArrayList<NodeRef>();
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<NodeRef> getRepositoryPackageContents(NodeRef workflowPackage)
{
List<NodeRef> contents = new ArrayList<NodeRef>();
// get existing workflow package items
List<ChildAssociationRef> 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<ChildAssociationRef> 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<NodeRef> getAvmPackageContents(NodeRef workflowPackage)
{
List<NodeRef> contents = new ArrayList<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()));
}
}
}
return contents;
}
}