GroovySupport

Материал из RunaWFE
Перейти к навигации Перейти к поиску

Использование Groovy

Версия 4.4.1

© 2015-2021, ООО "Процессные технологии", материалы этого документа распространяются свободно на условиях лицензии GNU FDL. RunaWFE Free является системой с открытым кодом и распространяется в соответствии с LGPL лицензией (http://www.gnu.org/licenses/lgpl.html).

# Обзор

Groovy является языком программирования, написанном на Java и исполняющемся в JVM. Поэтому можно использовать синтаксис Java для написания скриптов.

В системе Groovy используется

  • в обработчиках
  • в глобальных валидаторах переменных
  • в узле-ветвлении для принятия решения по какому переходу пойдет управление процесса

Замечание. В 3-й версии для этих целей был использован BeanShell скрипт. Известное отличие синтаксиса состоит в ключевом слове null, используемом для обозначения неопределенного значения (В BSH это void). Скрипты, написанные в 3-й версии должны работать без изменения в 4-й версии (для валидаторов требуется совершить дополнительные действия, см. замечание).

# Использование обработчика Groovy

ru.runa.wfe.extension.handler.GroovyActionHandler может использоваться для программирования логики процесса в нестандартных ситуациях.

Пример конфигурации:

My_date = new java.util.Date();
My_rnd = new java.util.Random(1000).nextInt();
My_time = java.lang.System.currentTimeMillis();

Измененные в процессе исполнения скрипта переменные изменят свое значение в процессе.


Конфигурацией обработчика является корректный код Groovy, который по синтаксису идентичен Java.

В версии RunaWFE 4.3.0 была добавлена возможность копирования списка исполнителей в переменную типа "Исполнитель" либо роль, с помощью создания временной группы. .

Роль = Список_исполнителей;

# Использование в глобальном валидаторе

Выполняется скрипт валидатора и на основании результата получаем результат проверки переменных.

результат выполнения скрипта результат проверки
true (java.lang.Boolean) пройдена
false (java.lang.Boolean), null или любой объект другого типа не пройдена
возник ru.runa.wfe.validation.ValidatorException не пройдена, сообщение об ошибке берётся из исключения
возник java.lang.Exception не пройдена, сообщение в логе в категории ERROR (сообщение об ошибке берётся из исключения в случае настройки "GroovyExpressionValidator.show.errors" = true)

Замечание. Для корректной работы валидаторов, написанных в 3-й версии, необходимо перезаписать используемый класс валидатора. Сделать это можно, расположив файл с именем wfe.custom.validators.xml в директорию расширений (подробнее о расширениях)

<?xml version="1.0" encoding="UTF-8"?>
<validators>
 <validator name="expression" class="ru.runa.wfe.validation.impl.BSHExpressionValidator"/>
</validators>

Пример: Проверка что текущая дата меньше определенного значения

java.util.Date deadlineDate = new java.text.SimpleDateFormat("dd.MM.yyyy").parse("01.01.2014");
return new java.util.Date().before(deadlineDate);

Пример: Проверка что текущее время меньше определенного значения

java.util.Calendar deadlineTime = ru.runa.wfe.commons.CalendarUtil.convertToCalendar("17:30", ru.runa.wfe.commons.CalendarUtil.HOURS_MINUTES_FORMAT);
java.util.Calendar nowTime = java.util.Calendar.getInstance();
return ru.runa.wfe.commons.CalendarUtil.compareTime(nowTime, deadlineTime) < 0;

Пример: Проверка зависимых переменных

Замечание. При работе со строками нужно проверять не только что переменная определена (не null), но и то что строка не является пустой ("").

Проверка обязательности одной переменной (Переменная2, тип = строка), если заполнена другая переменная (Переменная1, тип = дата)

if (Переменная1 != null) {
 return Переменная2 != null && Переменная2.length() > 0;
}
return true;

Проверка обязательности одной переменной (Переменная2, тип = строка), если заполнена другая переменная (Переменная1, тип = строка)

if (Переменная1 != null && Переменная1.length() > 0) {
 return Переменная2 != null && Переменная2.length() > 0;
}
return true;

Проверка обязательности одной переменной (Переменная2, тип = число), если заполнена другая переменная (Переменная1, тип = число)

if (Переменная1 != null) {
 return Переменная2 != null;
}
return true;

Проверка обязательности одной переменной (Переменная2, тип = число) в зависимости от значения другой переменной (Переменная1, тип = число)

if (Переменная1 == 100) {
 return Переменная2 != null;
}
return true;

Проверка взаимного позиционирования необязательных для ввода дат (переменная ДатаС задана ранее переменной ДатаПо)

if (ДатаС != null && ДатаПо != null) {
 return !ДатаС.after(ДатаПо);
}
return true;

Проверка обязательности одной переменной (Переменная2, тип = список) в зависимости от значения другой переменной (Переменная1, тип = строка).

Обратите внимание, что без установленного валидатора "Значения контейнера обязательны" пользователь может ввести неопределенный (null) элемент списка.

Пример использования Файл:ListValidation.par.

if (Variable1 != null && Variable1.length() > 0) {
 return ListVariable != null && ListVariable.size() > 0;
}
return true;

# Пример: Проверка переменных в зависимости от выбранного перехода

Замечание. Значение выбранного перехода доступно как переменная типа Строка с названием RUNAWFE_SELECTED_TRANSITION.

Проверка обязательности одной переменной (Переменная1, тип = строка), если выбранный переход называется Отказать.

if ("Отказать".equals(RUNAWFE_SELECTED_TRANSITION)) {
 return Переменная1 != null && Переменная1.trim().length() > 0;
}
return true;

# Использование в узле-ветвлении

В среде разработки есть конструктор конфигурации для простого случая принятия решения на основе значения переменных.

# Нюансы

# Требуется точка с запятой

По невыясненным причинам нижеприведённый код обработчика не работает

if (Полученные_номера_процессов != null && Полученные_номера_процессов.size() == Список_пользователей.size()) {
 return "все сообщения получены";
}
return "ждём";

При исполнении ругается

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 1: unexpected token: return @ line 1, column 148.
 n "все сообщения получены"; } return "жд
                                ^

Конфигурация, содержащая дополнительную точку с запятой ошибки не вызывает

if (Полученные_номера_процессов != null && Полученные_номера_процессов.size() == Список_пользователей.size()) {
 return "все сообщения получены";
};
return "ждём";