Как писать скрипты и триггеры в TrackStudio

Содержание

Принципы, на которых основана TrackStudio: универсальность и масштабируемость. Каким бы сложным и хитрым не был Ваш бизнес-процесс, можно найти способ, как реализовать его в TrackStudio. Возможно, полученный результат будет не столь изящным, как в специализированных под требуемую задачу системах (если таковые вообще существуют), и тем не менее, это будет рабочий инструмент.

Дополнительную функциональность в TrackStudio можно реализовать с помощью скриптов и триггеров. Скрипты обычно соответствуют вычисляемым дополнительным полям различных типов. Триггеры соответствуют событиям, происходящим с задачами, а именно: созданию задач, их редактированию и выполнению операций над ними. Скрипты вычисляются всякий раз при просмотре задачи, когда нужно отобразить значение поля, триггеры - при выполнении ассоциированных действий.

Скрипты и триггеры могут быть двух видов: интерпретируемые и скомпилированные. Интерпретируемые скрипты - это java-код, обрабатываемый интерпретатором Beanshell. Писать такие скрипты несколько проще, чем скомпилированные, т.к. не требуется согласования типов данных и наличия JDK для компиляции.
Скомпилированные же скрипты имеют ряд серьезных преимуществ:

  • во-первых, они выполняются быстрее из-за того, что не нужно загружать и инициализировать интерпретатор
  • во-вторых, если скрипт скомпилировался - там хотя бы нет синтаксических ошибок
  • в-третьих, в скомпилированных скриптах вы можете использовать всю мощь языка Java. Например, наследование и статические переменные

Как писать скрипты и триггеры?

Для того, чтобы писать и компилировать скрипты и триггеры вам понадобится: JDK (java development kit), который можно скачать с сайта http://java.com (обратите внимание, именно JDK, а не JRE).
Вам потребуется файл trackstudio.jar (располагается в /webapps/TrackStudio/WEB-INF/lib/trackstudio.jar), который есть в любом варианте поставки TrackStudio. И лучше, если вы будете использовать какую-либо IDE, например IDEA, Eclipse или Netbeans. Javadoc от TrackStudio находится в папке docs/javadoc дистрибутива.

Все скрипты и триггеры должны реализовывать один из интерфейсов:

com.trackstudio.external.OperationTrigger - для триггеров, выполняющихся при операциях с задачами
com.trackstudio.external.TaskBulkProcessor - для триггеров, выполняющихся над выбранными из списка задачами
com.trackstudio.external.TaskTrigger - для триггеров, выполняющихся при создании или редактировании задачи
com.trackstudio.external.TaskUDFLookupScript - для наборов возможных значений дополнительных полей к задачам
com.trackstudio.external.TaskUDFValueScript - для значений дополнительных полей к задачам
com.trackstudio.external.UserUDFLookupScript - для наборов возможных значений дополнительных полей к пользователям
com.trackstudio.external.UserUDFValueScript - для значений дополнительных полей к пользователям

Кроме того, скомпилированные скрипты должны находиться в пакетах в соответствии со структурой папок внутри plugins в TrackStudio.

Тип скрипта Назначение Пакет Папка (относительно etc/plugins)
Create Task/Before Выполняется до создания задачи scripts.before_create_task scripts/before_create_task
Create Task/InsteadOf Выполняется вместо создания задачи scripts.instead_of_create_task scripts/instead_of_create_task
Create Task/After Выполняется после того, как задача создана scripts.after_create_task scripts/after_create_task
Edit Task/Before Выполняется до редактирования задачи scripts.before_edit_task scripts/before_edit_task
Edit Task/InsteadOf Выполняется вместо редактирования задачи scripts.instead_of_edit_task scripts/instead_of_edit_task
Edit Task/After Выполняется после редактирования свойств задачи scripts.after_edit_task scripts/after_edit_task
Add Message/Before Выполняется до выполнения операции с задачей scripts.before_add_message scripts/before_add_message
Add Message/InsteadOf Выполняется вместо операции с задачей scripts.instead_of_add_message scripts/instead_of_add_message
Add Message/After Выполняется после операции с задачей scripts.after_add_message scripts/after_add_message
Bulk Выполняет действия над выбранными в списке задачами scripts.bulk scripts/bulk
Task Custom Field/Value Вычисляет значение дополнительного поля для задачи scripts.task_custom_field_value scripts/task_custom_field_value
Task Custom Field/Lookup Формирует список возможных значений для дополнительного поля типа Строка к задаче scripts.task_custom_field_lookup scripts/task_custom_field_lookup
User Custom Field/Value Вычисляет значение дополнительного поля для пользователя scripts.user_custom_field_value scripts/user_custom_field_value
User Custom Field/Lookup Формирует список возможных значений для дополнительного поля типа Строка к пользователю scripts.user_custom_field_lookup scripts/user_custom_field_lookup

Примеры скриптов вы также можете посмотреть и скачать из репозитария на Github.

package scripts.before_add_message;

import com.trackstudio.exception.GranException;
import com.trackstudio.exception.UserException;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.secured.SecuredMessageTriggerBean;
import com.trackstudio.tools.textfilter.HTMLEncoder;

public class CheckSpentTimeScript implements OperationTrigger {
    public static final int TIME_LIMIT = 1; /** time limit in milliseconds */
    public static final int K = 20; /** conversion factors */
    @Override
    public SecuredMessageTriggerBean execute(SecuredMessageTriggerBean message) throws GranException {
        String desc = HTMLEncoder.stripHtmlTags(message.getDescription());
        if (message.getHrs() != null && message.getHrs() > TIME_LIMIT && desc.length()/message.getHrs() < K){
            throw new UserException("Please "+ message.getSubmitter().getName()+", describe what you did at that time!");
        }
        return message;
    }
}

Скомпилировать такой скрипт можно командой

javac -cp path/trackstudio.jar CheckSpentTimeScript.java

Но лучше воспользоваться какой-нибудь IDE.
Далее можно либо положить полученный класс в папку ./etc/plugins/scripts/before_add_message/, либо создать jar

cd ../../
jar cf myscripts.jar scripts

И положить его в папку ./etc/plugins/scripts.