Реализация шлюза на языке 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 — это параметр, задающий, что вместо стандартной логики шлюза будет выполняться скрипт
Сам код шлюза заносится на вкладку "Скрипт" при редактировании типа шлюза:
Должна быть обязательно реализована функция 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.