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> <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 --> <!-- 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)); NodeRef workflowPackage = (NodeRef)ruleAction.getParameterValue(WorkflowModel.ASSOC_PACKAGE.toPrefixString(namespaceService));
workflowPackage = workflowService.createPackage(workflowPackage); workflowPackage = workflowService.createPackage(workflowPackage);
ChildAssociationRef childAssoc = nodeService.getPrimaryParent(actionedUponNodeRef); 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 // build map of workflow start task parameters
Map<String, Serializable> paramValues = ruleAction.getParameterValues(); Map<String, Serializable> paramValues = ruleAction.getParameterValues();

View File

@@ -38,6 +38,10 @@ public interface WorkflowModel
// Base Business Process Management Definitions // 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 // task constants
static final QName TYPE_TASK = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "task"); static final QName TYPE_TASK = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "task");
static final QName PROP_TASK_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "taskId"); static final QName PROP_TASK_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "taskId");

View File

@@ -22,6 +22,7 @@
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" * http://www.alfresco.com/legal/licensing"
*/ */
package org.alfresco.repo.workflow; package org.alfresco.repo.workflow;
import java.util.ArrayList; import java.util.ArrayList;
@@ -41,7 +42,6 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID; import org.alfresco.util.GUID;
import org.springframework.extensions.surf.util.ParameterCheck; import org.springframework.extensions.surf.util.ParameterCheck;
/** /**
* Alfresco implementation of Workflow Package where the package is stored * Alfresco implementation of Workflow Package where the package is stored
* within the Alfresco Repository. * within the Alfresco Repository.
@@ -61,9 +61,9 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
private NodeRef systemWorkflowContainer = null; private NodeRef systemWorkflowContainer = null;
private TenantService tenantService; 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) 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) public void setSearchService(SearchService searchService)
{ {
@@ -79,7 +79,7 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
} }
/** /**
* @param nodeService node service * @param nodeService node service
*/ */
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService)
{ {
@@ -92,7 +92,7 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
} }
/** /**
* @param namespaceService namespace service * @param namespaceService namespace service
*/ */
public void setNamespaceService(NamespaceService namespaceService) public void setNamespaceService(NamespaceService namespaceService)
{ {
@@ -100,16 +100,18 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
} }
/** /**
* @param tenantService tenant service * @param tenantService tenant service
*/ */
public void setTenantService(TenantService tenantService) public void setTenantService(TenantService tenantService)
{ {
this.tenantService = tenantService; this.tenantService = tenantService;
} }
/*
/* (non-Javadoc) * (non-Javadoc)
* @see org.alfresco.repo.workflow.WorkflowPackageComponent#createPackage(org.alfresco.service.cmr.repository.NodeRef) * @see
* org.alfresco.repo.workflow.WorkflowPackageComponent#createPackage(org
* .alfresco.service.cmr.repository.NodeRef)
*/ */
public NodeRef createPackage(NodeRef container) public NodeRef createPackage(NodeRef container)
{ {
@@ -117,37 +119,13 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
boolean isSystemPackage = false; boolean isSystemPackage = false;
if (container == null) if (container == null)
{ {
// create simple folder in workflow system folder container = makePackageContainer();
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);
isSystemPackage = true; isSystemPackage = true;
} }
// attach workflow package // attach workflow package
if (nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) if (nodeService.hasAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)) { throw new WorkflowException(
{ "Container '" + container + "' is already a workflow package."); }
throw new WorkflowException("Container '" + container + "' is already a workflow package.");
}
nodeService.addAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE, null); nodeService.addAspect(container, WorkflowModel.ASPECT_WORKFLOW_PACKAGE, null);
nodeService.setProperty(container, WorkflowModel.PROP_IS_SYSTEM_PACKAGE, isSystemPackage); nodeService.setProperty(container, WorkflowModel.PROP_IS_SYSTEM_PACKAGE, isSystemPackage);
@@ -155,14 +133,62 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
return container; return container;
} }
/* (non-Javadoc) private NodeRef makePackageContainer()
* @see org.alfresco.repo.workflow.WorkflowPackageComponent#deletePackage(org.alfresco.service.cmr.repository.NodeRef) {
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) 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()) if (isSystemPackage != null && isSystemPackage.booleanValue())
{ {
nodeService.deleteNode(container); nodeService.deleteNode(container);
@@ -174,8 +200,11 @@ 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) public List<String> getWorkflowIdsForContent(NodeRef packageItem)
{ {
@@ -183,14 +212,15 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
List<String> workflowIds = new ArrayList<String>(); List<String> workflowIds = new ArrayList<String>();
if (nodeService.exists(packageItem)) if (nodeService.exists(packageItem))
{ {
List<ChildAssociationRef> packageItemParents = nodeService.getParentAssocs(packageItem); List<ChildAssociationRef> parentAssocs = nodeService.getParentAssocs(packageItem);
for (ChildAssociationRef packageItemParent : packageItemParents) for (ChildAssociationRef parentAssoc : parentAssocs)
{ {
NodeRef parentRef = packageItemParent.getParentRef(); NodeRef parentRef = parentAssoc.getParentRef();
if (nodeService.hasAspect(parentRef, WorkflowModel.ASPECT_WORKFLOW_PACKAGE) if (nodeService.hasAspect(parentRef, WorkflowModel.ASPECT_WORKFLOW_PACKAGE)
&& !nodeService.hasAspect(parentRef, ContentModel.ASPECT_ARCHIVED)) && !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) if (workflowInstance != null && workflowInstance.length() > 0)
{ {
workflowIds.add(workflowInstance); workflowIds.add(workflowInstance);
@@ -204,7 +234,7 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
/** /**
* Gets the system workflow container for storing workflow related items * Gets the system workflow container for storing workflow related items
* *
* @return the system workflow container * @return the system workflow container
*/ */
private NodeRef getSystemWorkflowContainer() private NodeRef getSystemWorkflowContainer()
{ {
@@ -212,10 +242,8 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
{ {
NodeRef systemContainer = findSystemContainer(); NodeRef systemContainer = findSystemContainer();
NodeRef tenantSystemWorkflowContainer = findSystemWorkflowContainer(systemContainer); NodeRef tenantSystemWorkflowContainer = findSystemWorkflowContainer(systemContainer);
if (tenantSystemWorkflowContainer == null) if (tenantSystemWorkflowContainer == null) { throw new WorkflowException(
{ "Unable to find system workflow folder - does not exist."); }
throw new WorkflowException("Unable to find system workflow folder - does not exist.");
}
return tenantSystemWorkflowContainer; return tenantSystemWorkflowContainer;
} }
@@ -225,10 +253,8 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
{ {
NodeRef systemContainer = findSystemContainer(); NodeRef systemContainer = findSystemContainer();
systemWorkflowContainer = findSystemWorkflowContainer(systemContainer); systemWorkflowContainer = findSystemWorkflowContainer(systemContainer);
if (systemWorkflowContainer == null) if (systemWorkflowContainer == null) { throw new WorkflowException(
{ "Unable to find system workflow folder - does not exist."); }
throw new WorkflowException("Unable to find system workflow folder - does not exist.");
}
} }
return systemWorkflowContainer; return systemWorkflowContainer;
} }
@@ -238,16 +264,14 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
/** /**
* Finds the system workflow container * Finds the system workflow container
* *
* @param systemContainer the system container * @param systemContainer the system container
* @return the system workflow container * @return the system workflow container
*/ */
private NodeRef findSystemWorkflowContainer(NodeRef systemContainer) private NodeRef findSystemWorkflowContainer(NodeRef systemContainer)
{ {
String path = bootstrap.getConfiguration().getProperty("system.workflow_container.childname"); String path = bootstrap.getConfiguration().getProperty("system.workflow_container.childname");
if (path == null) if (path == null) { throw new WorkflowException(
{ "Unable to locate workflow system container - path not specified"); }
throw new WorkflowException("Unable to locate workflow system container - path not specified");
}
List<NodeRef> nodeRefs = searchService.selectNodes(systemContainer, path, null, namespaceService, false); List<NodeRef> nodeRefs = searchService.selectNodes(systemContainer, path, null, namespaceService, false);
if (tenantService.isEnabled()) if (tenantService.isEnabled())
@@ -272,28 +296,23 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
/** /**
* Finds the system container * Finds the system container
* *
* @return the system container * @return the system container
*/ */
private NodeRef findSystemContainer() private NodeRef findSystemContainer()
{ {
String path = bootstrap.getConfiguration().getProperty("system.system_container.childname"); String path = bootstrap.getConfiguration().getProperty("system.system_container.childname");
if (path == null) if (path == null) { throw new WorkflowException("Unable to locate system container - path not specified"); }
{
throw new WorkflowException("Unable to locate system container - path not specified");
}
NodeRef root = nodeService.getRootNode(bootstrap.getStoreRef()); NodeRef root = nodeService.getRootNode(bootstrap.getStoreRef());
List<NodeRef> nodeRefs = searchService.selectNodes(root, path, null, namespaceService, false); List<NodeRef> nodeRefs = searchService.selectNodes(root, path, null, namespaceService, false);
if (nodeRefs == null || nodeRefs.size() == 0) if (nodeRefs == null || nodeRefs.size() == 0) { throw new WorkflowException(
{ "Unable to locate system container - path not found"); }
throw new WorkflowException("Unable to locate system container - path not found");
}
return nodeRefs.get(0); return nodeRefs.get(0);
} }
/** /**
* Creates the System Workflow Container * Creates the System Workflow Container
* *
* @return the system workflow container * @return the system workflow container
*/ */
public NodeRef createSystemWorkflowContainer() public NodeRef createSystemWorkflowContainer()
{ {
@@ -303,7 +322,8 @@ public class WorkflowPackageImpl implements WorkflowPackageComponent
{ {
String name = bootstrap.getConfiguration().getProperty("system.workflow_container.childname"); String name = bootstrap.getConfiguration().getProperty("system.workflow_container.childname");
QName qname = QName.createQName(name, namespaceService); 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(); systemWorkflowContainer = childRef.getChildRef();
} }
return systemWorkflowContainer; return systemWorkflowContainer;

View File

@@ -22,6 +22,7 @@
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" * http://www.alfresco.com/legal/licensing"
*/ */
package org.alfresco.repo.workflow; package org.alfresco.repo.workflow;
import java.io.InputStream; 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.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService; import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.dictionary.DictionaryService; 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.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService; 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.WorkflowTaskState;
import org.alfresco.service.cmr.workflow.WorkflowTimer; import org.alfresco.service.cmr.workflow.WorkflowTimer;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
/** /**
* Default Alfresco Workflow Service whose implementation is backed by registered * Default Alfresco Workflow Service whose implementation is backed by
* BPM Engine plug-in components. * registered BPM Engine plug-in components.
* *
* @author davidc * @author davidc
*/ */
@@ -85,7 +83,6 @@ public class WorkflowServiceImpl implements WorkflowService
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
private NodeService protectedNodeService; private NodeService protectedNodeService;
/** /**
* Sets the Authority Service * Sets the Authority Service
* *
@@ -99,7 +96,7 @@ public class WorkflowServiceImpl implements WorkflowService
/** /**
* Sets the BPM Engine Registry * Sets the BPM Engine Registry
* *
* @param registry bpm engine registry * @param registry bpm engine registry
*/ */
public void setBPMEngineRegistry(BPMEngineRegistry registry) public void setBPMEngineRegistry(BPMEngineRegistry registry)
{ {
@@ -109,7 +106,7 @@ public class WorkflowServiceImpl implements WorkflowService
/** /**
* Sets the Workflow Package Component * Sets the Workflow Package Component
* *
* @param workflowPackageComponent workflow package component * @param workflowPackageComponent workflow package component
*/ */
public void setWorkflowPackageComponent(WorkflowPackageComponent workflowPackageComponent) public void setWorkflowPackageComponent(WorkflowPackageComponent workflowPackageComponent)
{ {
@@ -138,6 +135,7 @@ public class WorkflowServiceImpl implements WorkflowService
/** /**
* Set the avm sync service * Set the avm sync service
*
* @param avmSyncService * @param avmSyncService
*/ */
public void setAvmSyncService(AVMSyncService avmSyncService) public void setAvmSyncService(AVMSyncService avmSyncService)
@@ -155,9 +153,9 @@ public class WorkflowServiceImpl implements WorkflowService
this.dictionaryService = dictionaryService; this.dictionaryService = dictionaryService;
} }
/** /**
* Set the node service which applies permissions * Set the node service which applies permissions
*
* @param protectedNodeService * @param protectedNodeService
*/ */
public void setProtectedNodeService(NodeService protectedNodeService) public void setProtectedNodeService(NodeService protectedNodeService)
@@ -165,8 +163,11 @@ public class WorkflowServiceImpl implements WorkflowService
this.protectedNodeService = protectedNodeService; 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) public WorkflowDeployment deployDefinition(String engineId, InputStream workflowDefinition, String mimetype)
{ {
@@ -184,24 +185,29 @@ public class WorkflowServiceImpl implements WorkflowService
return deployment; 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) public boolean isDefinitionDeployed(NodeRef workflowDefinition)
{ {
if (! nodeService.getType(workflowDefinition).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) if (!nodeService.getType(workflowDefinition).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) { throw new WorkflowException(
{ "Node " + workflowDefinition + " is not of type 'bpm:workflowDefinition'"); }
throw new WorkflowException("Node " + workflowDefinition + " is not of type 'bpm:workflowDefinition'");
}
String engineId = (String)nodeService.getProperty(workflowDefinition, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); String engineId = (String) nodeService.getProperty(workflowDefinition,
WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID);
ContentReader contentReader = contentService.getReader(workflowDefinition, ContentModel.PROP_CONTENT); ContentReader contentReader = contentService.getReader(workflowDefinition, ContentModel.PROP_CONTENT);
return isDefinitionDeployed(engineId, contentReader.getContentInputStream(), contentReader.getMimetype()); 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) public boolean isDefinitionDeployed(String engineId, InputStream workflowDefinition, String mimetype)
{ {
@@ -209,24 +215,29 @@ public class WorkflowServiceImpl implements WorkflowService
return component.isDefinitionDeployed(workflowDefinition, mimetype); 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) public WorkflowDeployment deployDefinition(NodeRef definitionContent)
{ {
if (! nodeService.getType(definitionContent).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) if (!nodeService.getType(definitionContent).equals(WorkflowModel.TYPE_WORKFLOW_DEF)) { throw new WorkflowException(
{ "Node " + definitionContent + " is not of type 'bpm:workflowDefinition'"); }
throw new WorkflowException("Node " + definitionContent + " is not of type 'bpm:workflowDefinition'");
}
String engineId = (String)nodeService.getProperty(definitionContent, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID); String engineId = (String) nodeService
.getProperty(definitionContent, WorkflowModel.PROP_WORKFLOW_DEF_ENGINE_ID);
ContentReader contentReader = contentService.getReader(definitionContent, ContentModel.PROP_CONTENT); ContentReader contentReader = contentService.getReader(definitionContent, ContentModel.PROP_CONTENT);
return deployDefinition(engineId, contentReader.getContentInputStream(), contentReader.getMimetype()); 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) public void undeployDefinition(String workflowDefinitionId)
{ {
@@ -235,14 +246,15 @@ public class WorkflowServiceImpl implements WorkflowService
component.undeployDefinition(workflowDefinitionId); component.undeployDefinition(workflowDefinitionId);
} }
/* (non-Javadoc) /*
* (non-Javadoc)
* @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitions() * @see org.alfresco.service.cmr.workflow.WorkflowService#getDefinitions()
*/ */
public List<WorkflowDefinition> getDefinitions() public List<WorkflowDefinition> getDefinitions()
{ {
List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(10); List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(10);
String[] ids = registry.getWorkflowComponents(); String[] ids = registry.getWorkflowComponents();
for (String id: ids) for (String id : ids)
{ {
WorkflowComponent component = registry.getWorkflowComponent(id); WorkflowComponent component = registry.getWorkflowComponent(id);
definitions.addAll(component.getDefinitions()); definitions.addAll(component.getDefinitions());
@@ -250,14 +262,16 @@ public class WorkflowServiceImpl implements WorkflowService
return Collections.unmodifiableList(definitions); 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() public List<WorkflowDefinition> getAllDefinitions()
{ {
List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(10); List<WorkflowDefinition> definitions = new ArrayList<WorkflowDefinition>(10);
String[] ids = registry.getWorkflowComponents(); String[] ids = registry.getWorkflowComponents();
for (String id: ids) for (String id : ids)
{ {
WorkflowComponent component = registry.getWorkflowComponent(id); WorkflowComponent component = registry.getWorkflowComponent(id);
definitions.addAll(component.getAllDefinitions()); definitions.addAll(component.getAllDefinitions());
@@ -265,8 +279,11 @@ public class WorkflowServiceImpl implements WorkflowService
return Collections.unmodifiableList(definitions); 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) public WorkflowDefinition getDefinitionById(String workflowDefinitionId)
{ {
@@ -275,8 +292,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getDefinitionById(workflowDefinitionId); 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) public WorkflowDefinition getDefinitionByName(String workflowName)
{ {
@@ -285,8 +305,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getDefinitionByName(workflowName); 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) public List<WorkflowDefinition> getAllDefinitionsByName(String workflowName)
{ {
@@ -295,8 +318,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getAllDefinitionsByName(workflowName); 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) public byte[] getDefinitionImage(String workflowDefinitionId)
{ {
@@ -310,8 +336,11 @@ public class WorkflowServiceImpl implements WorkflowService
return definitionImage; 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) public List<WorkflowTaskDefinition> getTaskDefinitions(final String workflowDefinitionId)
{ {
@@ -320,8 +349,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getTaskDefinitions(workflowDefinitionId); 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) public WorkflowPath startWorkflow(String workflowDefinitionId, Map<QName, Serializable> parameters)
{ {
@@ -330,8 +362,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.startWorkflow(workflowDefinitionId, parameters); 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) public WorkflowPath startWorkflowFromTemplate(NodeRef templateDefinition)
{ {
@@ -339,8 +374,11 @@ public class WorkflowServiceImpl implements WorkflowService
throw new UnsupportedOperationException(); 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) public List<WorkflowInstance> getActiveWorkflows(String workflowDefinitionId)
{ {
@@ -349,8 +387,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getActiveWorkflows(workflowDefinitionId); 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) public WorkflowInstance getWorkflowById(String workflowId)
{ {
@@ -359,8 +400,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getWorkflowById(workflowId); 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) public List<WorkflowPath> getWorkflowPaths(String workflowId)
{ {
@@ -369,8 +413,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getWorkflowPaths(workflowId); 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) public Map<QName, Serializable> getPathProperties(String pathId)
{ {
@@ -379,36 +426,47 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getPathProperties(pathId); 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) public WorkflowInstance cancelWorkflow(String workflowId)
{ {
String engineId = BPMEngineRegistry.getEngineId(workflowId); String engineId = BPMEngineRegistry.getEngineId(workflowId);
WorkflowComponent component = getWorkflowComponent(engineId); WorkflowComponent component = getWorkflowComponent(engineId);
WorkflowInstance instance = component.cancelWorkflow(workflowId); WorkflowInstance instance = component.cancelWorkflow(workflowId);
// NOTE: Delete workflow package after cancelling workflow, so it's still available // NOTE: Delete workflow package after cancelling workflow, so it's
// in process-end events of workflow definition // still available
// in process-end events of workflow definition
workflowPackageComponent.deletePackage(instance.workflowPackage); workflowPackageComponent.deletePackage(instance.workflowPackage);
return instance; 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) public WorkflowInstance deleteWorkflow(String workflowId)
{ {
String engineId = BPMEngineRegistry.getEngineId(workflowId); String engineId = BPMEngineRegistry.getEngineId(workflowId);
WorkflowComponent component = getWorkflowComponent(engineId); WorkflowComponent component = getWorkflowComponent(engineId);
WorkflowInstance instance = component.deleteWorkflow(workflowId); WorkflowInstance instance = component.deleteWorkflow(workflowId);
// NOTE: Delete workflow package after deleting workflow, so it's still available // NOTE: Delete workflow package after deleting workflow, so it's still
// in process-end events of workflow definition // available
// in process-end events of workflow definition
workflowPackageComponent.deletePackage(instance.workflowPackage); workflowPackageComponent.deletePackage(instance.workflowPackage);
return instance; 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) public WorkflowPath signal(String pathId, String transition)
{ {
@@ -417,8 +475,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.signal(pathId, transition); 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) public WorkflowPath fireEvent(String pathId, String event)
{ {
@@ -427,8 +488,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.fireEvent(pathId, event); 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) public List<WorkflowTimer> getTimers(String workflowId)
{ {
@@ -437,8 +501,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getTimers(workflowId); 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) public List<WorkflowTask> getTasksForWorkflowPath(String pathId)
{ {
@@ -447,14 +514,17 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getTasksForWorkflowPath(pathId); 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) public List<WorkflowTask> getAssignedTasks(String authority, WorkflowTaskState state)
{ {
List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(10); List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(10);
String[] ids = registry.getTaskComponents(); String[] ids = registry.getTaskComponents();
for (String id: ids) for (String id : ids)
{ {
TaskComponent component = registry.getTaskComponent(id); TaskComponent component = registry.getTaskComponent(id);
tasks.addAll(component.getAssignedTasks(authority, state)); tasks.addAll(component.getAssignedTasks(authority, state));
@@ -462,8 +532,11 @@ public class WorkflowServiceImpl implements WorkflowService
return Collections.unmodifiableList(tasks); 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) public List<WorkflowTask> getPooledTasks(String authority)
{ {
@@ -473,10 +546,11 @@ public class WorkflowServiceImpl implements WorkflowService
Set<String> parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, authority, false); Set<String> parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, authority, false);
authorities.addAll(parents); 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); List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(10);
String[] ids = registry.getTaskComponents(); String[] ids = registry.getTaskComponents();
for (String id: ids) for (String id : ids)
{ {
TaskComponent component = registry.getTaskComponent(id); TaskComponent component = registry.getTaskComponent(id);
tasks.addAll(component.getPooledTasks(authorities)); tasks.addAll(component.getPooledTasks(authorities));
@@ -484,8 +558,11 @@ public class WorkflowServiceImpl implements WorkflowService
return Collections.unmodifiableList(tasks); 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) public List<WorkflowTask> queryTasks(WorkflowTaskQuery query)
{ {
@@ -500,21 +577,20 @@ public class WorkflowServiceImpl implements WorkflowService
if (taskId != null) if (taskId != null)
{ {
String taskEngineId = BPMEngineRegistry.getEngineId(taskId); String taskEngineId = BPMEngineRegistry.getEngineId(taskId);
if (engineId != null && !engineId.equals(taskEngineId)) if (engineId != null && !engineId.equals(taskEngineId)) { throw new WorkflowException(
{ "Cannot query for tasks across multiple task components: " + engineId + ", " + taskEngineId); }
throw new WorkflowException("Cannot query for tasks across multiple task components: " + engineId + ", " + taskEngineId);
}
engineId = taskEngineId; engineId = taskEngineId;
} }
// perform query // perform query
List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(10); List<WorkflowTask> tasks = new ArrayList<WorkflowTask>(10);
String[] ids = registry.getTaskComponents(); String[] ids = registry.getTaskComponents();
for (String id: ids) for (String id : ids)
{ {
TaskComponent component = registry.getTaskComponent(id); TaskComponent component = registry.getTaskComponent(id);
// NOTE: don't bother asking task component if specific task or process id // NOTE: don't bother asking task component if specific task or
// are in the filter and do not correspond to the component // process id
// are in the filter and do not correspond to the component
if (engineId != null && !engineId.equals(id)) if (engineId != null && !engineId.equals(id))
{ {
continue; continue;
@@ -524,18 +600,25 @@ public class WorkflowServiceImpl implements WorkflowService
return Collections.unmodifiableList(tasks); 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); String engineId = BPMEngineRegistry.getEngineId(taskId);
TaskComponent component = getTaskComponent(engineId); TaskComponent component = getTaskComponent(engineId);
return component.updateTask(taskId, properties, add, remove); 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) public WorkflowTask endTask(String taskId, String transition)
{ {
@@ -544,8 +627,11 @@ public class WorkflowServiceImpl implements WorkflowService
return component.endTask(taskId, transition); 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) public WorkflowTask getTaskById(String taskId)
{ {
@@ -554,16 +640,22 @@ public class WorkflowServiceImpl implements WorkflowService
return component.getTaskById(taskId); 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) public NodeRef createPackage(NodeRef container)
{ {
return workflowPackageComponent.createPackage(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) public List<WorkflowInstance> getWorkflowsForContent(NodeRef packageItem, boolean active)
{ {
@@ -582,113 +674,147 @@ public class WorkflowServiceImpl implements WorkflowService
return workflowInstances; 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) private WorkflowComponent getWorkflowComponent(String engineId)
{ {
WorkflowComponent component = registry.getWorkflowComponent(engineId); WorkflowComponent component = registry.getWorkflowComponent(engineId);
if (component == null) if (component == null) { throw new WorkflowException("Workflow Component for engine id '" + engineId
{ + "' is not registered"); }
throw new WorkflowException("Workflow Component for engine id '" + engineId + "' is not registered");
}
return component; return component;
} }
/** /**
* Gets the Task Component registered against the specified BPM Engine Id * Gets the Task Component registered against the specified BPM Engine Id
* *
* @param engineId engine id * @param engineId engine id
*/ */
private TaskComponent getTaskComponent(String engineId) private TaskComponent getTaskComponent(String engineId)
{ {
TaskComponent component = registry.getTaskComponent(engineId); TaskComponent component = registry.getTaskComponent(engineId);
if (component == null) if (component == null) { throw new WorkflowException("Task Component for engine id '" + engineId
{ + "' is not registered"); }
throw new WorkflowException("Task Component for engine id '" + engineId + "' is not registered");
}
return component; return component;
} }
public List<NodeRef> getPackageContents(String taskId) public List<NodeRef> getPackageContents(String taskId)
{ {
WorkflowTask workflowTask = getTaskById(taskId); NodeRef workflowPackage = getWorkflowPackageIfExists(taskId);
List<NodeRef> contents = new ArrayList<NodeRef>(); if (workflowPackage == null)
if (workflowTask != null)
{ {
NodeRef workflowPackage = (NodeRef)workflowTask.properties.get(WorkflowModel.ASSOC_PACKAGE); return Collections.emptyList();
if (workflowPackage != null) }
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)) contents.add(nodeRef);
{
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);
}
}
}
} }
} }
} }
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; return contents;
} }
} }