Реализация шлюза на языке BeanShell

В версии 4.5 помимо стандартных шлюзов, возможно создание своего собственного шлюза с помощью встроенного языка BeanShell.

В этом случае в конфигурации типов шлюзов вы можете указывать например :

user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1

Здесь user_rule.editor.class - это класс, который отображает редактор шлюза в клиенте биллинга и сохраняет данные шлюза .Вы можете поставить один из стандартных классов (указаны в документации в соответствующих главах), либо поставить user_rule.editor.class.EmptyContractRuleEditor, если редактировать шлюз не нужно в договоре. gate_manager.class - это класс, осуществляющий взаимодействие со шлюзом на стороне сервера биллинга. Именно логику этого класса мы и подменяем своим скриптовым шлюзом. Вы можете указать user_rule.editor.class=bitel.billing.server.ipn.EmptyGateWorker. Но если вы подменяете логику работы одного из стандартных шлюзов, то желательно указывать класс этого шлюза, т.к. логика его работы будет подменена, но есть ещё другие правила, например, в случае сложных иерархических шлюзов производится синхронизация с родительским шлюзом и она пока не может быть реализована скриптовым шлюзом. use.script=1 — это параметр, задающий, что вместо стандартной логики шлюза будет выполняться скрипт

Сам код шлюза заносится на вкладку "Скрипт" при редактировании типа шлюза:

images/download/attachments/43386131/gate_script.png

Должна быть обязательно реализована функция doSync() - именно она и отвечает за взаимодействие со шлюзом. Вот минимальный код шлюза:

protected void doSync()
{
}

Также дополнительно может быть определена дополнительная функция синхронизации со шлюзом предком. Она определяется у шлюза предка и вызывается потомком перед вызовом doSync().

protected void parentSync( Gate child, GateWorker childWorker)
{
}

где child - объект типа bitel.billing.server.ipn.bean.Gate, представляющий шлюз, который вызывал этот метод.

childWorker - объект типа bitel.billing.server.ipn.GateWorker, представляющий шлюз, который вызывал этот метод.

В скрипт передаются такие переменные:

con — объект java.sql.Connection для соединения с БД;

gate — объект bitel.billing.server.ipn.bean.Gate;

ruleTypeMap — объект java.util.Map<Integer, bitel.billing.server.ipn.bean.RuleType>. В нем содержаться все типы правил из БД. Ключ — id правила;

gateTypeMap — объект java.util.Map<Integer, bitel.billing.server.ipn.bean.GateType> gateTypeMap. В нем содержаться все типы шлюзов из БД. Ключ — id типа шлюза;

Log — объект org.apache.log4j.Logger. Для вывода сообщений, ошибок шлюза;

StatusList — объект List<bitel.billing.server.ipn.UserStatus> statusList. В нем содержаться статусы пользователей, которые синхронизируются на данном шлюзе. Ключ — id статуса. ;

GateErrors — объект java.lang.StringBuilder, содержащий ошибки выполнения шлюза;

mid — int, код модуля;

worker - объект типа GateWorker, обработчтик логики работы со шлюзом, который вызвал этот скрипт.

Примеры шлюзов и реализация большинства стандартных шлюзов есть на WiKi.