AnnotatedEventListener

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

Quick start

  1. Наследуем скрипт от ru.bgcrm.event.listener.dispatcher.AnnotatedEventListener, для скриптов процессов в комбинации с [интеракторами] от ru.bgcrm.event.listener.dispatcher.ProcessAnnotatedEventListener

  2. Отмечаем публичные функции необходимыми аннотациями, в качестве аргумента функция или не принимает аргументов, или должна принимать ожидаемый тип события, либо super-тип.

  3. Profit!

Имеется возможность в рамках метода указывать сразу несколько аннотаций и/или использовать для одного вида события несколько методов. Для работы данных режимов необходимо указать в аннотации EventDispatcher параметр multipleSubscribers=true (см. @EventDispatcher).
В случае использования режима нескольких аннотаций, в качестве аргумента метод может или не принимать аргументов вообще, или должен принимать только тот тип события, который имеется у всех входящих в метод аннотаций
В случае использования EventProcessor.subscribe не используйте обработчик наследованный от ru.bgcrm.event.listener.dispatcher.ProcessAnnotatedEventListener (Могут происходить проблемы с интерактором. Данная проблема происходит из-за того, что обработчик объявляется один раз, и интерактор не переопределяется из-за использования Lazy)
Пример
@EventDispatcher(multipleSubscribers = true)
public class CameraInstallationListener extends AnnotatedEventListener {

    @OnCreated
    public void init(ProcessChangedEvent event) {
        // init default params
    }

    @OnStatusChanged(STATUS_ACTIVATION)
    public void activateCamera(ProcessChangedEvent event) {
        // do some dirty stuff
    }

    @OnStatusChanged(STATUS_REGISTRATION)
    public void registerCamera(ProcessChangedEvent event) {
        // do some dirty stuff
    }

    @OnParamChanged(PARAM_CAMERA_TYPE)
    public void enableSoundRecording(ParamChangedEvent event) {
        // do some dirty stuff
    }

    @OnLinkAdding
    public void validateLink(LinkAddingEvent event) {
        // do some dirty stuff
    }

    @OnLinkAdded
    public void onLinkAdded(LinkAddedEvent event) {
        // do some dirty stuff
    }

}

Аннотации

Базовые

@EventDispatcher

Аннотация вешается на весь класс и позволяет менять глобальные (в рамках скрипта) настройки.

Параметры
Name Type Required Default Description

event

Class<T extends Event>

true

Класс события

multipleSubscribers

Boolean

true

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

@OnEvent

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

Параметры
Name Type Required Default Description

event

Class<T extends Event>

true

Класс события

includeSupertypes

Boolean

false

false

Возможность обрабатывать дочерние типы события

Работа с параметрами

@OnParamChanging

Подсписка на событие перед изменением параметра (ParamChangingEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID параметров

@OnParamChanged

Подсписка на событие после изменения параметра (ParamChangedEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID параметров

@OnParamListGet

Подсписка на событие получения списка значений для динамического списка (ParamListGetEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID параметров

@OnParamListShowList

Подсписка на событие отображения выбранных значений для динамического списка (ParamListShowListEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID параметров

@OnParamUpdated

Подсписка на событие после обновления параметра (ParameterUpdateEvent)

@OnParamRemoved

Подсписка на событие после удаления параметра (ParameterRemoveEvent)

Работа с процессами

@OnProcessCreated

Подписка на событие создания процесса (ProcessChangedEvent)

Параметры
Name Type Required Default Description

mode

Array<Mode>

false

[Mode.CREATE,Mode.CREATE_FINISHED]

Режим создания процесса, имеет следующие значения:

  • CREATE - первичное создание процесса

  • CREATE_FINISHED - завершение создания процесса через мастер создания

Подписка на создание процесса, как привязанного к другому процессу (ProcessCreateAsLinkEvent)

@OnProcessRemoving

Подписка на событие перед удалением процесса (ProcessChangingEvent)

@OnProcessRemoved

Подписка на событие после удаления процесса (ProcessChangedEvent)

@OnStatusChanging

Подсписка на событие перед изменением статуса процесса (ProcessChangingEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID статусов

@OnStatusChanged

Подсписка на событие после изменения статуса процесса (ProcessChangedEvent)

Параметры
Name Type Required Default Description

value

Array<Int>

false

[]

ID статусов

@OnProcessClosing

Подсписка на событие перед изменения статуса процесса на любой из закрывающих статусов(ProcessChangingEvent)

@OnProcessClosed

Подсписка на событие после изменения статуса процесса на любой из закрывающих статусов (ProcessChangedEvent)

@OnDependedProcessClosed

Подписка на событие после изменения статуса связанного процесса на любой из закрывающих статусов (DependedProcessCloseEvent)

Связанный процесс должен быть порожден родительским процессом (имеет тип привязки processMade)
Параметры
Name Type Required Default Description

typesFilter

Array<Int>

false

[]

ID типов

statusesFilter

Array<Int>

false

[]

ID статусов

@OnTypeChanging

Подписка на событие перед изменением типа процесса (ProcessChangingEvent)

@OnTypeChanged

Подписка на событие после изменения типа процесса (ProcessChangedEvent)

@OnProcessTypeUpdated

Подписка на событие после обновления типа процесса (ProcessTypeUpdateEvent)

@OnProcessTypeRemoved

Подписка на событие после удаления типа процесса (ProcessTypeRemoveEvent)

@OnPriorityChanging

Подписка на событие перед изменением приоритета процесса (ProcessChangingEvent)

@OnPriorityChanged

Подписка на событие после изменения приоритета процесса (ProcessChangedEvent)

@OnGroupChanging

Подписка на событие перед изменением групп исполнителей процесса (ProcessChangingEvent)

@OnGroupChanged

Подписка на событие после изменения групп исполнителей процесса (ProcessChangedEvent)

@OnExecutorChanging

Подписка на событие перед изменением исполнителей процесса (ProcessChangingEvent)

@OnExecutorChanged

Подписка на событие после изменения исполнителей процесса (ProcessChangedEvent)

@OnDescriptionAdding

Подписка на событие перед добавлением описания процесса (ProcessChangingEvent)

@OnDescriptionAdded

Подписка на событие после добавления описания процесса (ProcessChangedEvent)

@OnDescriptionChanging

Подписка на событие перед изменением описания процесса (ProcessChangingEvent)

@OnDescriptionChanged

Подписка на событие после изменения описания процесса (ProcessChangedEvent)

Работа с адресным справочником

@OnAddressAdding

Подписка на событие перед добавлением адреса (AddressAddingEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

@OnAddressAdded

Подписка на событие добавления адреса (AddressAddedEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

@OnAddressChanging

Подписка на событие перед изменением адреса (AddressChangingEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

@OnAddressChanged

Подписка на событие изменения адреса (AddressChangedEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

@OnAddressRemoving

Подписка на событие перед удалением адреса (AddressRemovingEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

@OnAddressRemoved

Подписка на событие удаления адреса (AddressRemovedEvent)

Параметры
Name Type Required Default Description

types

Array<AddressType>

false

[]

Типы адреса

Работа с ТМЦ

@OnTmcListAdding

Подписка на событие перед добавлением движения (TmcListChangingEvent)

Параметры
Name Type Required Default Description

destinations

Array<TmcDestinationVerdandi>

false

[]

Направления движений

@OnTmcListAdded

Подписка на событие добавления движения (TmcListChangedEvent)

Name Type Required Default Description

destinations

Array<TmcDestinationVerdandi>

false

[]

Направления движений

@OnTmcListRemoving

Подписка на событие перед удалением движения (TmcListChangingEvent)

Name Type Required Default Description

destinations

Array<TmcDestinationVerdandi>

false

[]

Направления движений

@OnTmcListRemoved

Подписка на событие удаления движения (TmcListChangedEvent)

Name Type Required Default Description

destinations

Array<TmcDestinationVerdandi>

false

[]

Направления движений

Работа с модулем "Task"

@OnProcessTaskCreate

Подписка на события создания запланированной задачи (ProcessTaskCreateEvent)

Параметры
Name Type Required Default Description

taskIds

IntArray

false

[]

ID задач

@OnProcessTaskCancel

Подписка на события отмены запланированной задачи (ProcessTaskCancelEvent)

Параметры
Name Type Required Default Description

taskIds

IntArray

false

[]

ID задач

@OnProcessTaskComplete

Подписка на события выполнения запланированной задачи (ProcessTaskCompleteEvent)

Параметры
Name Type Required Default Description

taskIds

IntArray

false

[]

ID задач

result

Array<TaskResult>

false

[]

Статус выполнения запланированной задачи, имеет следующие значения:

  • SUCCESS - запланированная задача выполнена успешно.

  • ERROR - запланированная задача выполнена с ошибкой.

Дополнительные

@OnRunClassRequest

Подсписка на событие запуска динамического класса (RunClassRequestEvent)

Параметры
Name Type Required Default Description

checkMethodName

Boolean

false

false

Необходимость проверки имени метода.

Проверка производится по точному совпадению с переданным параметром method

Используется как основа для динамических API, является заменой функционала ru.bgcrm.dyn.handlers.BaseHandler

См.пакет ru.bgcrm.event.listener.dispatcher.filter

Contribution guide

Заведение новой аннотации

  1. Определиться с пакетом. Для ядровых аннотаций используется пакет ru.bgcrm.event.listener.dispatcher.filter, для аннотаций плагинов в соответствии со структурой пакетов плагина

  2. Создать класс аннотации и класс обработчик аннотации, наследующийся от ru.bgcrm.event.listener.dispatcher.filter.BaseEventFilter

  3. На класс аннотацию повесить аннотацию Dispatch с указанием класса-обработчика

  4. Реализовать логику проверки совпадения события в классе-обработчике

  5. Написать тесты

  6. Написать документацию (java doc на аннотации + adoc)

FAQ

Если у одного и того же события в скрипте есть несколько методов обработчиков, то какие из них вызовутся?

По-умолчанию будет вызван только первый из найденных методов. Можно сделать так, чтобы вызывались все, но порядок их вызова пока ничем не гарантирован:

@EventDispatcher(multipleSubscribers = true)

Как обрабатываются исключения?

Любые исключения пробрасываются наверх, если у события было несколько обработчиков, то соответственно их перебор прерывается.