mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
- Next checkpoint of workflow
- Made the date picker renderer allow user to set date to "None" git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3554 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,20 +1,29 @@
|
||||
package org.alfresco.web.bean.workflow;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTransition;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||
import org.alfresco.web.bean.repository.MapNode;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.TransientNode;
|
||||
@@ -34,6 +43,7 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
protected Node workItemNode;
|
||||
protected WorkflowTask workItem;
|
||||
protected WorkflowTransition[] transitions;
|
||||
protected List<Node> resources;
|
||||
|
||||
protected static final String ID_PREFIX = "transition_";
|
||||
protected static final String CLIENT_ID_PREFIX = "dialog:" + ID_PREFIX;
|
||||
@@ -57,9 +67,6 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
WorkflowTaskDefinition taskDef = this.workItem.definition;
|
||||
this.workItemNode = new TransientNode(taskDef.metadata.getName(),
|
||||
"task_" + System.currentTimeMillis(), this.workItem.properties);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created node for work item: " + this.workItemNode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +75,7 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
throws Exception
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Saving work item with params: " + this.workItemNode.getProperties());
|
||||
logger.debug("Saving work item: " + this.workItemNode.getId());
|
||||
|
||||
// prepare the edited parameters for saving
|
||||
Map<QName, Serializable> params = WorkflowBean.prepareWorkItemParams(this.workItemNode);
|
||||
@@ -96,7 +103,7 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
|
||||
for (WorkflowTransition trans : this.transitions)
|
||||
{
|
||||
buttons.add(new DialogButtonConfig(ID_PREFIX + trans, trans.title, null,
|
||||
buttons.add(new DialogButtonConfig(ID_PREFIX + trans.title, trans.title, null,
|
||||
"#{DialogManager.bean.transition}", "false", null));
|
||||
}
|
||||
}
|
||||
@@ -125,6 +132,9 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
{
|
||||
String outcome = getDefaultFinishOutcome();
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Transitioning work item: " + this.workItemNode.getId());
|
||||
|
||||
// to find out which transition button was pressed we need
|
||||
// to look for the button's id in the request parameters,
|
||||
// the first non-null result is the button that was pressed.
|
||||
@@ -134,7 +144,7 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
String selectedTransition = null;
|
||||
for (WorkflowTransition trans : this.transitions)
|
||||
{
|
||||
Object result = reqParams.get(CLIENT_ID_PREFIX + trans);
|
||||
Object result = reqParams.get(CLIENT_ID_PREFIX + trans.title);
|
||||
if (result != null)
|
||||
{
|
||||
// this was the button that was pressed
|
||||
@@ -195,6 +205,88 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
return this.workItemNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of resources associated with this work item
|
||||
* i.e. the children of the workflow package
|
||||
*
|
||||
* @return The list of nodes
|
||||
*/
|
||||
public List<Node> getResources()
|
||||
{
|
||||
NodeRef workflowPackage = (NodeRef)this.workItem.properties.get(WorkflowModel.ASSOC_PACKAGE);
|
||||
|
||||
this.resources = new ArrayList<Node>(4);
|
||||
|
||||
if (workflowPackage != null)
|
||||
{
|
||||
UserTransaction tx = null;
|
||||
try
|
||||
{
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
tx = Repository.getUserTransaction(context, true);
|
||||
tx.begin();
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Found workflow package for work item '" +
|
||||
this.workItem.id + "': " + workflowPackage );
|
||||
|
||||
List<ChildAssociationRef> childRefs = this.nodeService.getChildAssocs(workflowPackage,
|
||||
ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
|
||||
|
||||
for (ChildAssociationRef ref: childRefs)
|
||||
{
|
||||
// create our Node representation from the NodeRef
|
||||
NodeRef nodeRef = ref.getChildRef();
|
||||
|
||||
if (this.nodeService.exists(nodeRef))
|
||||
{
|
||||
// find it's type so we can see if it's a node we are interested in
|
||||
QName type = this.nodeService.getType(nodeRef);
|
||||
|
||||
// make sure the type is defined in the data dictionary
|
||||
TypeDefinition typeDef = this.dictionaryService.getType(type);
|
||||
|
||||
if (typeDef != null)
|
||||
{
|
||||
// look for content nodes or links to content
|
||||
// NOTE: folders within workflow packages are ignored for now
|
||||
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT) ||
|
||||
ContentModel.TYPE_FILELINK.equals(type))
|
||||
{
|
||||
// create our Node representation
|
||||
MapNode node = new MapNode(nodeRef, this.nodeService, true);
|
||||
this.browseBean.setupCommonBindingProperties(node);
|
||||
|
||||
this.resources.add(node);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (logger.isWarnEnabled())
|
||||
logger.warn("Found invalid object in database: id = " + nodeRef + ", type = " + type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// commit the transaction
|
||||
tx.commit();
|
||||
}
|
||||
catch (Throwable err)
|
||||
{
|
||||
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
|
||||
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err);
|
||||
this.resources = Collections.<Node>emptyList();
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||
}
|
||||
}
|
||||
else if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Failed to find workflow package for work item: " + this.workItem.id);
|
||||
}
|
||||
|
||||
return this.resources;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the workflow service to use
|
||||
*
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package org.alfresco.web.bean.workflow;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -9,14 +10,20 @@ import java.util.ResourceBundle;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.model.SelectItem;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.TransientNode;
|
||||
import org.alfresco.web.bean.wizard.BaseWizardBean;
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -66,11 +73,41 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
// TODO: Deal with workflows that don't require any data
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Starting workflow with params: " + this.startTaskNode.getProperties());
|
||||
logger.debug("Starting workflow: " + this.selectedWorkflow);
|
||||
|
||||
// prepare the parameters from the current state of the property sheet
|
||||
Map<QName, Serializable> params = WorkflowBean.prepareWorkItemParams(this.startTaskNode);
|
||||
|
||||
// create a workflow package for the attached items and add them
|
||||
String itemToWorkflowId = this.parameters.get("item-to-workflow");
|
||||
if (itemToWorkflowId != null && itemToWorkflowId.length() > 0)
|
||||
{
|
||||
// create the node ref for the item and determine its type
|
||||
NodeRef itemToWorkflow = new NodeRef(Repository.getStoreRef(), itemToWorkflowId);
|
||||
QName type = this.nodeService.getType(itemToWorkflow);
|
||||
|
||||
NodeRef workflowPackage = null;
|
||||
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER) ||
|
||||
this.dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDERLINK))
|
||||
{
|
||||
throw new UnsupportedOperationException("Workflow on a folder is not supported yet!");
|
||||
}
|
||||
else
|
||||
{
|
||||
// create a workflow package and add the given item to workflow as a child
|
||||
workflowPackage = this.workflowService.createPackage(null);
|
||||
this.nodeService.addChild(workflowPackage, itemToWorkflow,
|
||||
ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
||||
QName.createValidLocalName((String)this.nodeService.getProperty(
|
||||
itemToWorkflow, ContentModel.PROP_NAME))));
|
||||
}
|
||||
|
||||
// add the workflow package to the parameter map
|
||||
params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage);
|
||||
}
|
||||
|
||||
// start the workflow to get access to the start task
|
||||
WorkflowPath path = this.workflowService.startWorkflow(this.selectedWorkflow,
|
||||
WorkflowBean.prepareWorkItemParams(this.startTaskNode));
|
||||
WorkflowPath path = this.workflowService.startWorkflow(this.selectedWorkflow, params);
|
||||
if (path != null)
|
||||
{
|
||||
// extract the start task
|
||||
@@ -111,7 +148,7 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
WorkflowDefinition flowDef = this.workflows.get(this.selectedWorkflow);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Starting workflow: "+ flowDef);
|
||||
logger.debug("Selected workflow: "+ flowDef);
|
||||
|
||||
WorkflowTaskDefinition taskDef = flowDef.startTaskDefinition;
|
||||
if (taskDef != null)
|
||||
@@ -122,9 +159,6 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
// create an instance of a task from the data dictionary
|
||||
this.startTaskNode = new TransientNode(taskDef.metadata.getName(),
|
||||
"task_" + System.currentTimeMillis(), null);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created node for task: " + this.startTaskNode);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -143,6 +143,9 @@ public class WorkflowBean
|
||||
params.put(assocQName, (Serializable)targets);
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Prepared parameters: " + params);
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
@@ -166,9 +169,6 @@ public class WorkflowBean
|
||||
node.getProperties().put("type", taskDef.metadata.getTitle());
|
||||
node.getProperties().put("id", task.id);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created node for work item with id '" + task.id + "' " + node);
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user