GroovySupport
Использование Groovy
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Обзор
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 "ждём";