2. Управление динамическим кодом

Замечание

Для более полного понимания данной секции необходимо владеть базовыми знаниями Java (прочитать об этом можно, например, на официальном сайте http://download.oracle.com/javase/tutorial/).

Параметры подсистемы динамического кода настраиваются в конфигурации сервера.

Для встраивания дополнительной функциональности посредством написания Java-классов, необходимо предварительно скомпилировать и загрузить их в базу данных биллинга. Уникальным идентификатором каждого динамического класса является его полное имя - это имя, включащее как имя пакета (своебразного пространства имён в Java - оно совпадает со структурой каталогов, в которых лежит класс) класса, так и самого имени класса. Например: ru.bitel.bgbilling.Test - это полное имя класса Test, который лежит в пакете ru.bitel.bgbilling.

Исходные коды динамического Java-кода хранятся по умолчанию в каталоге BGBillingServer/dyn.

Каждый класс для реализации конкретной функциональности (например, скрипта поведения) должен реализовывать определённый интерфейс (в каждом случае свой). После этого его необходимо скомпилировать и он станет доступен для выбора в соответствующем меню привязки динамического класса.

Для работы с динамически загружаемыми классами из клиента биллинга необходимо воспользоваться пунктом меню Сервис=>Автоматизация=>Управление динамическим кодом.

Дерево динамических классов можно видеть на панели слева. Изменённые, но не перекомпилированные классы отображаются в дереве со значком * (это будет работать ТОЛЬКО в случае, если файловая система, в которой хранятся скрипты, поддерживает хранение времени последнего изменения файла, в противном случае все исходные коды всегда будут помечены как изменённые).

Для открытия существующего класса на редактирование необходимо выбрать нужный класс в дереве классов слева и щелкнуть на кнопку Редактировать на стандартной панели инструментов, либо открыть класс двойным щелчком мыши. Каждый класс открывается в отдельной вкладке.

Для создания нового класса необходимо нажать кнопку Новый элемент на стандартной панели инструментов. Откроется диалоговое окно, в котором будет предложено ввести полное имя класса. Полное имя класса включает в себя пакет, в котором располагается класс. Пакет по своей сути представляет собой папку в файловой системе. Пакеты разделяются между собой символом "." (точка). Обратите внимание, что если в дереве классов выбрать предварительно какой-либо пакет и нажать кнопку создания нового класса, то этот пакет автоматически подставится в поле диалогового окна.

Для полной перекомпиляции всех исходных кодов необходимо нажать кнопку Скомпилировать всё. Для компиляции отдельных классов необходимо открыть их в дереве по двойному щелчку и нажать кнопку Сохранить и скомпилировать. Ошибки и предупреждения компилятора можно увидеть в открывающейся панели Сообщения компилятора. В случае ошибки в процессе компиляции некоторого класса никаких изменений в базе данных скомпилированных классов не произойдет. Это означает, что будет работать последняя работоспособная версия динамического класса.

Для удаления класса (или группы классов) необходимо выбрать их в дереве классов и нажать кнопку Удалить в панели инструментов. Перед удалением выбранных классов производится полная перекомпиляция динамических классов без участия удаляемых классов для проверки на наличие зависимостей оставшегося кода от них. В случае, если компиляция пройдет с ошибками, то удаление классов не будет произведено для сохранения работоспособности оставшегося кода!

Внимание

Обратите внимание, что привязка удаляемых классов в различных подсистемах (скрипты поведения, глобальные скрипты и т.п.) не проверяется! Удаление классов производится на свой страх и риск. В случае оставшейся привязки удалённого класса к какой-либо подсистеме, корректное поведение этой подсистемы не гарантируется!

Одним из преимуществ такого подхода к разработке расширений биллинга состоит в том, что возможна организация полноценной работы в IDE (автодополнение, проверка кода на ошибки и т.п.). Пример, как это сделать, вы можете найти в WiKi.

Для возможностей отладки и удобного запуска можно запустить код прямо из редактора.

Сначала пытается запуститься метод execute как у глобальных скриптов (можно просто добавить этот метод с такой сигнатурой). Если такой метод есть, то создаётся экземпляр класса и в него передаются объекты типа ru.bitel.bgbilling.server.util.Setup и ru.bitel.common.sql.ConnectionSet, как в глобальные скрипты. Первый содержит в себе конфигурацию приложения, второй - набор соединений к БД (основной, slave и "мусорной" и при наличии ). Если такого метода нет, то ищется стандартный метод public static void main(String[] args).