mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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 -->
|
||||
<!-- -->
|
||||
|
@@ -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();
|
||||
|
@@ -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");
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user