mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
- More workflow features
- Added single select capability to generic picker - Fixed NPE in client (create rule wizard) due to missing messages git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3606 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
package org.alfresco.web.bean.workflow;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Bean implementation for the "Cancel Workflow" dialog
|
||||
*
|
||||
* @author gavinc
|
||||
*/
|
||||
public class CancelWorkflowDialog extends BaseDialogBean
|
||||
{
|
||||
protected String workflowInstanceId;
|
||||
protected WorkflowService workflowService;
|
||||
|
||||
private static final Log logger = LogFactory.getLog(CancelWorkflowDialog.class);
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Dialog implementation
|
||||
|
||||
@Override
|
||||
public void init(Map<String, String> parameters)
|
||||
{
|
||||
super.init(parameters);
|
||||
|
||||
// make sure the workflow instance id has been passed
|
||||
this.workflowInstanceId = this.parameters.get("workflow-instance-id");
|
||||
if (this.workflowInstanceId == null || this.workflowInstanceId.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Cancel workflow dialog called without workflow instance id");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String finishImpl(FacesContext context, String outcome)
|
||||
throws Exception
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Cancelling workflow with id: " + this.workflowInstanceId);
|
||||
|
||||
// cancel the workflow
|
||||
this.workflowService.cancelWorkflow(this.workflowInstanceId);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Cancelled workflow with id: " + this.workflowInstanceId);
|
||||
|
||||
return outcome;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getErrorMessageId()
|
||||
{
|
||||
return "error_cancel_workflow";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getFinishButtonDisabled()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean Getters and Setters
|
||||
|
||||
/**
|
||||
* Returns the confirmation to display to the user before deleting the content.
|
||||
*
|
||||
* @return The formatted message to display
|
||||
*/
|
||||
public String getConfirmMessage()
|
||||
{
|
||||
String confirmMsg = Application.getMessage(FacesContext.getCurrentInstance(),
|
||||
"cancel_workflow_confirm");
|
||||
|
||||
return MessageFormat.format(confirmMsg,
|
||||
new Object[] {this.parameters.get("workflow-instance-name")});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the workflow service instance
|
||||
*
|
||||
* @return WorkflowService instance
|
||||
*/
|
||||
public WorkflowService getWorkflowService()
|
||||
{
|
||||
return workflowService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the workflow service to use
|
||||
*
|
||||
* @param workflowService The WorkflowService instance
|
||||
*/
|
||||
public void setWorkflowService(WorkflowService workflowService)
|
||||
{
|
||||
this.workflowService = workflowService;
|
||||
}
|
||||
}
|
@@ -313,6 +313,28 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
return this.workItemNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the action group the current task uses for the workflow package
|
||||
*
|
||||
* @return action group id
|
||||
*/
|
||||
public String getPackageActionGroup()
|
||||
{
|
||||
return (String)this.workItem.properties.get(
|
||||
WorkflowModel.PROP_PACKAGE_ACTION_GROUP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the action group the current task uses for each workflow package item
|
||||
*
|
||||
* @return action group id
|
||||
*/
|
||||
public String getPackageItemActionGroup()
|
||||
{
|
||||
return (String)this.workItem.properties.get(
|
||||
WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of resources associated with this work item
|
||||
* i.e. the children of the workflow package
|
||||
|
@@ -0,0 +1,199 @@
|
||||
package org.alfresco.web.bean.workflow;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import javax.faces.component.UIComponent;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.model.SelectItem;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.security.PersonService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.ui.common.SortableSelectItem;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
import org.alfresco.web.ui.common.component.UIGenericPicker;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Bean implementation for the "Reassign Work Item" dialog
|
||||
*
|
||||
* @author gavinc
|
||||
*/
|
||||
public class ReassignWorkItemDialog extends BaseDialogBean
|
||||
{
|
||||
protected String workItemId;
|
||||
|
||||
protected WorkflowService workflowService;
|
||||
protected PersonService personService;
|
||||
|
||||
private static final Log logger = LogFactory.getLog(ReassignWorkItemDialog.class);
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Dialog implementation
|
||||
|
||||
@Override
|
||||
public void init(Map<String, String> parameters)
|
||||
{
|
||||
super.init(parameters);
|
||||
|
||||
this.workItemId = this.parameters.get("workitem-id");
|
||||
if (this.workItemId == null || this.workItemId.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Reassign workitem dialog called without task id");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String finishImpl(FacesContext context, String outcome)
|
||||
throws Exception
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Reassigning work item with id: " + this.workItemId);
|
||||
|
||||
UIComponent picker = context.getViewRoot().findComponent("dialog:dialog-body:user-picker");
|
||||
|
||||
if (picker != null && picker instanceof UIGenericPicker)
|
||||
{
|
||||
UIGenericPicker userPicker = (UIGenericPicker)picker;
|
||||
String[] user = userPicker.getSelectedResults();
|
||||
if (user != null && user.length > 0)
|
||||
{
|
||||
// create a map to hold the new owner property then update the task
|
||||
String userName = user[0];
|
||||
Map<QName, Serializable> params = new HashMap<QName, Serializable>(1);
|
||||
params.put(ContentModel.PROP_OWNER, userName);
|
||||
this.workflowService.updateTask(this.workItemId, params, null, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (logger.isWarnEnabled())
|
||||
logger.warn("Failed to find selected user, reassign was unsuccessful");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (logger.isWarnEnabled())
|
||||
logger.warn("Failed to find user-picker component, reassign was unsuccessful");
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Reassigning work item with id: " + this.workItemId);
|
||||
|
||||
return outcome;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getErrorMessageId()
|
||||
{
|
||||
return "error_reassign_workitem";
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean Getters and Setters
|
||||
|
||||
/**
|
||||
* Property accessed by the Generic Picker component.
|
||||
*
|
||||
* @return the array of filter options to show in the users/groups picker
|
||||
*/
|
||||
public SelectItem[] getFilters()
|
||||
{
|
||||
ResourceBundle bundle = Application.getBundle(FacesContext.getCurrentInstance());
|
||||
return new SelectItem[] {new SelectItem("0", bundle.getString("users"))};
|
||||
}
|
||||
|
||||
/**
|
||||
* Query callback method executed by the Generic Picker component.
|
||||
* This method is part of the contract to the Generic Picker, it is up to the backing bean
|
||||
* to execute whatever query is appropriate and return the results.
|
||||
*
|
||||
* @param filterIndex Index of the filter drop-down selection
|
||||
* @param contains Text from the contains textbox
|
||||
*
|
||||
* @return An array of SelectItem objects containing the results to display in the picker.
|
||||
*/
|
||||
public SelectItem[] pickerCallback(int filterIndex, String contains)
|
||||
{
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
|
||||
SelectItem[] items;
|
||||
|
||||
UserTransaction tx = null;
|
||||
try
|
||||
{
|
||||
tx = Repository.getUserTransaction(context, true);
|
||||
tx.begin();
|
||||
|
||||
// build xpath to match available User/Person objects
|
||||
NodeRef peopleRef = personService.getPeopleContainer();
|
||||
// NOTE: see SearcherComponentTest
|
||||
String xpath = "*[like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + "%', false)" +
|
||||
" or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "lastName, '%" + contains + "%', false)]";
|
||||
|
||||
List<NodeRef> nodes = searchService.selectNodes(
|
||||
peopleRef,
|
||||
xpath,
|
||||
null,
|
||||
this.namespaceService,
|
||||
false);
|
||||
|
||||
items = new SelectItem[nodes.size()];
|
||||
for (int index=0; index<nodes.size(); index++)
|
||||
{
|
||||
NodeRef personRef = nodes.get(index);
|
||||
String firstName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_FIRSTNAME);
|
||||
String lastName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_LASTNAME);
|
||||
String username = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_USERNAME);
|
||||
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName);
|
||||
items[index] = item;
|
||||
}
|
||||
|
||||
Arrays.sort(items);
|
||||
|
||||
// commit the transaction
|
||||
tx.commit();
|
||||
}
|
||||
catch (Throwable err)
|
||||
{
|
||||
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
|
||||
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err);
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||
|
||||
items = new SelectItem[0];
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the workflow service to use
|
||||
*
|
||||
* @param workflowService The WorkflowService instance
|
||||
*/
|
||||
public void setWorkflowService(WorkflowService workflowService)
|
||||
{
|
||||
this.workflowService = workflowService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param permissionService The PermissionService to set.
|
||||
*/
|
||||
public void setPersonService(PersonService personService)
|
||||
{
|
||||
this.personService = personService;
|
||||
}
|
||||
}
|
@@ -12,6 +12,7 @@ import javax.faces.model.SelectItem;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
@@ -207,6 +208,54 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
return this.startTaskNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the action group the current task uses for the workflow package
|
||||
*
|
||||
* @return action group id
|
||||
*/
|
||||
public String getPackageActionGroup()
|
||||
{
|
||||
String actionGroup = null;
|
||||
|
||||
WorkflowDefinition flowDef = this.workflows.get(this.selectedWorkflow);
|
||||
WorkflowTaskDefinition taskDef = flowDef.startTaskDefinition;
|
||||
if (taskDef != null)
|
||||
{
|
||||
PropertyDefinition propDef = taskDef.metadata.getProperties().get(
|
||||
WorkflowModel.PROP_PACKAGE_ACTION_GROUP);
|
||||
if (propDef != null)
|
||||
{
|
||||
actionGroup = propDef.getDefaultValue();
|
||||
}
|
||||
}
|
||||
|
||||
return actionGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the action group the current task uses for each workflow package item
|
||||
*
|
||||
* @return action group id
|
||||
*/
|
||||
public String getPackageItemActionGroup()
|
||||
{
|
||||
String actionGroup = null;
|
||||
|
||||
WorkflowDefinition flowDef = this.workflows.get(this.selectedWorkflow);
|
||||
WorkflowTaskDefinition taskDef = flowDef.startTaskDefinition;
|
||||
if (taskDef != null)
|
||||
{
|
||||
PropertyDefinition propDef = taskDef.metadata.getProperties().get(
|
||||
WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP);
|
||||
if (propDef != null)
|
||||
{
|
||||
actionGroup = propDef.getDefaultValue();
|
||||
}
|
||||
}
|
||||
|
||||
return actionGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the summary data for the wizard.
|
||||
*/
|
||||
|
@@ -74,7 +74,11 @@ public class WorkflowBean
|
||||
this.workItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
{
|
||||
this.workItems.add(createWorkItem(task));
|
||||
Node node = createWorkItem(task);
|
||||
this.workItems.add(node);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Added to do work item: " + node);
|
||||
}
|
||||
|
||||
// commit the changes
|
||||
@@ -117,7 +121,11 @@ public class WorkflowBean
|
||||
this.completedWorkItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
{
|
||||
this.completedWorkItems.add(createWorkItem(task));
|
||||
Node node = createWorkItem(task);
|
||||
this.completedWorkItems.add(node);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Added completed work item: " + node);
|
||||
}
|
||||
|
||||
// commit the changes
|
||||
@@ -237,9 +245,10 @@ public class WorkflowBean
|
||||
node.getProperties().put("sourceSpaceId", context.getId());
|
||||
}
|
||||
|
||||
// add the outcome label for any completed task
|
||||
// add extra properties for completed tasks
|
||||
if (task.state.equals(WorkflowTaskState.COMPLETED))
|
||||
{
|
||||
// add the outcome label for any completed task
|
||||
String outcome = null;
|
||||
String transition = (String)task.properties.get(WorkflowModel.PROP_OUTCOME);
|
||||
if (transition != null)
|
||||
@@ -259,6 +268,10 @@ public class WorkflowBean
|
||||
node.getProperties().put("outcome", outcome);
|
||||
}
|
||||
}
|
||||
|
||||
// add the workflow instance id and name this taks belongs to
|
||||
node.getProperties().put("workflowInstanceId", task.path.instance.id);
|
||||
node.getProperties().put("workflowInstanceName", task.path.instance.definition.title);
|
||||
}
|
||||
|
||||
return node;
|
||||
|
Reference in New Issue
Block a user