As we transition to the new Hyland Community, some post links may be temporarily disrupted as we finalize redirects. We apologize for the inconvenience and are working to resolve this as quickly as possible. Details.
Hi,
I want to sort the visible task in my-task in descending order of the workflow initiated(I want workflow initiated to be on the top).
Please suggest.Thanks.
Below is the my-task screenshot
You need to check with the api(webscript) which is returning result.
sanjaybandhniya,
Could you show me how to do this?
You need to override TaskInstancesGet webscript.(TaskInstancesGet.java)In that file there is a Comparator which is sorting task by DueDate.Here you need to change it to as per your scenario.Ex.if you want latest created workflow comes first then you need to use ContentModel.PROP_CREATED instead of WorkflowModel.PROP_DUE_DATE.
Below Example willr display task by latest.
class WorkflowTaskDueAscComparator implements Comparator<WorkflowTask> { @Override public int compare(WorkflowTask o1, WorkflowTask o2) { Date date1 = (Date)o1.getProperties().get(ContentModel.PROP_CREATED); Date date2 = (Date)o2.getProperties().get(ContentModel.PROP_CREATED); long time1 = date1 == null ? Long.MAX_VALUE : date1.getTime(); long time2 = date2 == null ? Long.MAX_VALUE : date2.getTime(); return time1>time2?-1:1; } }
I have created a java file named TaskInstancesGet.java at location and changed the parameters:--> \dms\tomcat\webapps\alfresco\WEB-INF\classes\org\alfresco\repo\web\scripts\workflow but then also it is not working.
package org.alfresco.repo.web.scripts.workflow;
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.repo.workflow.WorkflowModel;import org.alfresco.service.cmr.workflow.WorkflowTask;import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;import org.alfresco.service.cmr.workflow.WorkflowTaskQuery.OrderBy;import org.alfresco.service.cmr.workflow.WorkflowTaskState;import org.alfresco.util.ModelUtil;import org.springframework.extensions.webscripts.Cache;import org.springframework.extensions.webscripts.Status;import org.springframework.extensions.webscripts.WebScriptException;import org.springframework.extensions.webscripts.WebScriptRequest;
/*** Webscript impelementation to return workflow task instances.** @author Nick Smith* @author Gavin Cornwell* @since 3.4*/public class TaskInstancesGet extends AbstractWorkflowWebscript{public static final String PARAM_AUTHORITY = "authority";public static final String PARAM_STATE = "state";public static final String PARAM_PRIORITY = "priority";public static final String PARAM_DUE_BEFORE = "dueBefore";public static final String PARAM_DUE_AFTER = "dueAfter";public static final String PARAM_PROPERTIES = "properties";public static final String PARAM_POOLED_TASKS = "pooledTasks";public static final String VAR_WORKFLOW_INSTANCE_ID = "workflow_instance_id";
private WorkflowTaskDueAscComparator taskComparator = new WorkflowTaskDueAscComparator();
@overrideprotected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache){Map<String, String> params = req.getServiceMatch().getTemplateVars();Map<String, Object> filters = new HashMap<String, Object>(4);
// authority is not included into filters list as it will be taken into account before filteringString authority = getAuthority(req);if (authority == null){// ALF-11036 fix, if authority argument is omitted the tasks for the current user should be returned.authority = authenticationService.getCurrentUserName();}// state is also not included into filters list, for the same reasonWorkflowTaskState state = getState(req);// look for a workflow instance idString workflowInstanceId = params.get(VAR_WORKFLOW_INSTANCE_ID);// determine if pooledTasks should be included, when appropriate i.e. when an authority is suppliedBoolean pooledTasksOnly = getPooledTasks(req);// get list of properties to include in the responseList<String> properties = getProperties(req);// get filter param valuesfilters.put(PARAM_PRIORITY, req.getParameter(PARAM_PRIORITY));processDateFilter(req, PARAM_DUE_BEFORE, filters);processDateFilter(req, PARAM_DUE_AFTER, filters);String excludeParam = req.getParameter(PARAM_EXCLUDE);if (excludeParam != null && excludeParam.length() > 0){filters.put(PARAM_EXCLUDE, new ExcludeFilter(excludeParam));}List<WorkflowTask> allTasks;
if (workflowInstanceId != null){// a workflow instance id was provided so query for tasksWorkflowTaskQuery taskQuery = new WorkflowTaskQuery();taskQuery.setActive(null);taskQuery.setProcessId(workflowInstanceId);taskQuery.setTaskState(state);taskQuery.setOrderBy(new OrderBy[]{OrderBy.TaskDue_Asc});if (authority != null){taskQuery.setActorId(authority);}allTasks = workflowService.queryTasks(taskQuery);}else{// default task state to IN_PROGRESS if not suppliedif (state == null){state = WorkflowTaskState.IN_PROGRESS;}// no workflow instance id is present so get all tasksif (authority != null){List<WorkflowTask> tasks = workflowService.getAssignedTasks(authority, state, true);List<WorkflowTask> pooledTasks = workflowService.getPooledTasks(authority, true);if (pooledTasksOnly != null){if (pooledTasksOnly.booleanValue()){// only return pooled tasks the user can claimallTasks = new ArrayList<WorkflowTask>(pooledTasks.size());allTasks.addAll(pooledTasks);}else{// only return tasks assigned to the userallTasks = new ArrayList<WorkflowTask>(tasks.size());allTasks.addAll(tasks);}}else{// include both assigned and unassigned tasksallTasks = new ArrayList<WorkflowTask>(tasks.size() + pooledTasks.size());allTasks.addAll(tasks);allTasks.addAll(pooledTasks);}// sort tasks by due dateCollections.sort(allTasks, taskComparator);}else{// authority was not provided -> return all active tasks in the systemWorkflowTaskQuery taskQuery = new WorkflowTaskQuery();taskQuery.setTaskState(state);taskQuery.setActive(null);taskQuery.setOrderBy(new OrderBy[] { OrderBy.TaskDue_Asc });allTasks = workflowService.queryTasks(taskQuery);}}int maxItems = getIntParameter(req, PARAM_MAX_ITEMS, DEFAULT_MAX_ITEMS);int skipCount = getIntParameter(req, PARAM_SKIP_COUNT, DEFAULT_SKIP_COUNT);int totalCount = 0;ArrayList<Map<String, Object>> results = new ArrayList<Map<String, Object>>();// Filter resultsWorkflowTask task = null;for(int i=0; i<allTasks.size(); i++){task = allTasks.get(i);if (matches(task, filters)){// Total-count needs to be based on matching tasks only, so we can't just use allTasks.size() for thistotalCount++;if(totalCount > skipCount && (maxItems < 0 || maxItems > results.size())){// Only build the actual detail if it's in the range of items we need. This will// drastically improve performance over paging after building the modelresults.add(modelBuilder.buildSimple(task, properties));}}}Map<String, Object> model = new HashMap<String, Object>();model.put("taskInstances", results);if (maxItems != DEFAULT_MAX_ITEMS || skipCount != DEFAULT_SKIP_COUNT){// maxItems or skipCount parameter was provided so we need to include paging into responsemodel.put("paging", ModelUtil.buildPaging(totalCount, maxItems == DEFAULT_MAX_ITEMS ? totalCount : maxItems, skipCount));}// create and return results, paginated if necessaryreturn model;}
/*** Retrieves the list of property names to include in the response.** @param req The WebScript request* @return List of property names*/private List<String> getProperties(WebScriptRequest req){String propertiesStr = req.getParameter(PARAM_PROPERTIES);if (propertiesStr != null){return Arrays.asList(propertiesStr.split(","));}return null;}/*** Retrieves the pooledTasks parameter.** @param req The WebScript request* @return null if not present, Boolean object otherwise*/private Boolean getPooledTasks(WebScriptRequest req){Boolean result = null;String includePooledTasks = req.getParameter(PARAM_POOLED_TASKS);if (includePooledTasks != null){result = Boolean.valueOf(includePooledTasks);}return result;}/*** Gets the specified {@link WorkflowTaskState}, null if not requested** @param req* @return*/private WorkflowTaskState getState(WebScriptRequest req){String stateName = req.getParameter(PARAM_STATE);if (stateName != null){try{return WorkflowTaskState.valueOf(stateName.toUpperCase());}catch (IllegalArgumentException e){String msg = "Unrecognised State parameter: " + stateName;throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, msg);}}return null;}
/*** Returns the specified authority. If no authority is specified then returns the current Fully Authenticated user.* @param req* @return*/private String getAuthority(WebScriptRequest req){String authority = req.getParameter(PARAM_AUTHORITY);if (authority == null || authority.length() == 0){authority = null;}return authority;}
/*** Determine if the given task should be included in the response.** @param task The task to check* @param filters The list of filters the task must match to be included* @return true if the task matches and should therefore be returned*/private boolean matches(WorkflowTask task, Map<String, Object> filters){// by default we assume that workflow task should be includedboolean result = true;
for (String key : filters.keySet()){Object filterValue = filters.get(key);
// skip null filters (null value means that filter was not specified)if (filterValue != null){if (key.equals(PARAM_EXCLUDE)){ExcludeFilter excludeFilter = (ExcludeFilter)filterValue;String type = task.getDefinition().getMetadata().getName().toPrefixString(this.namespaceService);if (excludeFilter.isMatch(type)){result = false;break;}}else if (key.equals(PARAM_DUE_BEFORE)){Date dueDate = (Date)task.getProperties().get(WorkflowModel.PROP_DUE_DATE);
if (!isDateMatchForFilter(dueDate, filterValue, true)){result = false;break;}}else if (key.equals(PARAM_DUE_AFTER)){Date dueDate = (Date)task.getProperties().get(WorkflowModel.PROP_DUE_DATE);
if (!isDateMatchForFilter(dueDate, filterValue, false)){result = false;break;}}else if (key.equals(PARAM_PRIORITY)){if (!filterValue.equals(task.getProperties().get(WorkflowModel.PROP_PRIORITY).toString())){result = false;break;}}}}
return result;}/*** Comparator to sort workflow tasks by due date in ascending order.*/class WorkflowTaskDueAscComparator implements Comparator<WorkflowTask>{@overridepublic int compare(WorkflowTask o1, WorkflowTask o2){Date date1 = (Date)o1.getProperties().get(ContentModel.PROP_CREATED);Date date2 = (Date)o2.getProperties().get(ContentModel.PROP_CREATED);long time1 = date1 == null ? Long.MAX_VALUE : date1.getTime();long time2 = date2 == null ? Long.MAX_VALUE : date2.getTime();long result = time1 - time2;return (result > 0) ? 1 : (result < 0 ? -1 : 0);}}}
How to do that as i tried to create class file also of TaskInstancesGet but unfortunately it is giving error. Can anyone share the class file as well as tell me at what location we need to change the file ..
Any kind of help will be appreciable.