Workflow Activity Scripts#
You can assign a workflow activity script to state transitions in workflows.
A workflow activity script is executed when the workflow transition, to which the script is assigned, is initiated. For example, you can automatically change the responsible person or create a sub-item when the item state changes.
Examples#
The following script appends a comment at the end of the description field when an item state changes.
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.util.event.IEventHandler;
public class CommentByReopen implements IEventHandler {
private static String REOPEN_SEPARATOR =
"**************************REOPEN*******************************";
public Map<String, Object> handleEvent(Map<String, Object> inputBinding) {
TWorkItemBean workItemBean = (TWorkItemBean)inputBinding.get("issue");
String comment = workItemBean.getComment();
if (comment == null || comment.trim().length() == 0) {
List<ErrorData> errorList = new LinkedList<ErrorData>();
errorList.add(new ErrorData("Comment is required by reopen"));
inputBinding.put("errorList", errorList);
} else {
String description = workItemBean.getDescription();
if (description == null) {
description = "";
}
description = description + REOPEN_SEPARATOR + comment;
workItemBean.setDescription(description);
workItemBean.setComment(null);
}
return inputBinding;
}
}
The next script changes the responsible to the “Guest” user:
//
// This script changes the responsible to "guest" when a status change occurs
//
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.dao.DAOFactory;
import com.aurel.track.dao.PersonDAO;
import com.aurel.track.beans.TPersonBean;
public class ChangeResponsible implements IEventHandler {
public Map handleEvent(Map inputBinding) {
TWorkItemBean workItemBean = (TWorkItemBean)inputBinding.get("issue");
PersonDAO personDAO = DAOFactory.getFactory().getPersonDAO();
TPersonBean personBean = personDAO.loadByLoginName("guest");
workItemBean.setResponsibleID(personBean.getObjectID());
}
}
The next script changes the manager to the first person belonging to a group in a certain role (“roleNew”):
//
// Change the manager to the first person that belongs to a group
// in role "roleNew" upon a status change
//
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.dao.DAOFactory;
import com.aurel.track.dao.PersonDAO;
import com.aurel.track.beans.TPersonBean;
import com.aurel.track.dao.RoleDAO;
import com.aurel.track.beans.TRoleBean;
public class ChangeManager implements IEventHandler {
public Map handleEvent(Map inputBinding) {
TWorkItemBean workItemBean = (TWorkItemBean)inputBinding.get("issue");
PersonDAO personDAO = DAOFactory.getFactory().getPersonDAO();
RoleDAO roleDAO= DAOFactory.getFactory().getRoleDAO();
TRoleBean roleBean = roleDAO.loadByName("roleNew");
if (roleBean != null) {
List<TPersonBean> personsWithExchangeRole =
personDAO.loadByProjectAndRoles(
workItemBean.getProjectID(),
roleBean.getObjectID());
if (personsWithExchangeRole != null &&
personsWithExchangeRole.size() > 0) {
TPersonBean personBean =
(TPersonBean)personsWithExchangeRole.get(0);
workItemBean.setOwnerID(
personBean.getObjectID());
}
}
}
}
The next script copies an item and creates a link between the copy and the original:
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.aurel.track.beans.TLinkTypeBean;
import com.aurel.track.beans.TPersonBean;
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.fieldType.runtime.base.WorkItemContext;
import com.aurel.track.item.ItemBL;
import com.aurel.track.item.link.ItemLinkConfigBL;
import com.aurel.track.linkType.LinkTypeBL;
import com.aurel.track.util.event.IEventHandler;
public class CopyItem implements IEventHandler {
/**
* Copies an item and creates a link between the original item and copied item
*/
public Map<String, Object> handleEvent(Map<String, Object> inputBinding) {
WorkItemContext workItemContext = (WorkItemContext)inputBinding.get(
"workItemContext");
TWorkItemBean workItemBean = workItemContext.getWorkItemBean();
Integer copiedFromItemID = workItemBean.getObjectID();
TPersonBean personBean = (TPersonBean)inputBinding.get("user");
Locale locale = (Locale)inputBinding.get("locale");
List<ErrorData> errorList = new LinkedList<ErrorData>();
//create a copy of an item
WorkItemContext copyContext = ItemBL.editCopyWorkItem(copiedFromItemID, personBean, locale);
TWorkItemBean workItemBeanCopy = copyContext.getWorkItemBean();
//change the copied item as needed
workItemBeanCopy.setSynopsis("(Copy) " + workItemBeanCopy.getSynopsis());
//save the copied item in db
Integer copiedItemID = ItemBL.copyWorkItem(copyContext,
errorList, false);
//look up the linktype ID in Link types config, ID column
Integer linkTypeID = 1001;
// 1=Unidirectional outward and bidirectional links,
// 2=Unidirectional inward (MsProject)
Integer linkDirection = 1;
List<ErrorData> linkErrors = ItemLinkConfigBL.saveItemLink(
copiedFromItemID, copiedItemID, linkTypeID, linkDirection,
null, null, personBean, locale, null, workItemContext);
if (linkErrors != null) {
errorList.addAll(linkErrors);
}
inputBinding.put("errorList", errorList);
return inputBinding;
}
}
The following script shows how to access custom fields:
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.admin.customize.treeConfig.field.FieldDesignBL;
import com.aurel.track.beans.TFieldBean;
public class ConnectNavision {
private String CRLF = System.getProperty("line.separator");
public Map handleEvent (Map<String, Object> inputBinding) {
TWorkItemBean workItemBean = (TWorkItemBean)inputBinding.get("issue");
// PLZ is a custom field
List<TFieldBean> fieldBeans = FieldDesignBL.loadByName("PLZ");
TFieldBean fieldBean = fieldBeans.get(0);
Integer fieldID = fieldBean.getObjectID();
String fname = "NAV" + String.valueOf(workItemBean.getObjectID());
File file = new File("C:\\temp\\" + fname + ".txt");
if (file.exists()) {
file.delete();
}
file << workItemBean.getObjectID() + CRLF;
file << workItemBean.getSynopsis() + CRLF;
file << workItemBean.getAttribute(fieldID) + CRLF;
return inputBinding;
}
}