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;
    }
}