Управление динамическим кодом
Для более полного понимания данной секции необходимо владеть базовыми знаниями Java (прочитать об этом можно, например, на официальном сайте http://download.oracle.com/javase/tutorial/).
Параметры подсистемы динамического кода настраиваются в конфигурации сервера.
Для встраивания дополнительной функциональности посредством написания Java-классов, необходимо предварительно скомпилировать и загрузить их в базу данных биллинга. Уникальным идентификатором каждого динамического класса является его полное имя - это имя, включащее как имя пакета (своебразного пространства имён в Java - оно совпадает со структурой каталогов, в которых лежит класс) класса, так и самого имени класса. Например: ru.bitel.bgbilling.Test - это полное имя класса Test, который лежит в пакете ru.bitel.bgbilling.
Исходные коды динамического Java-кода хранятся по умолчанию в каталоге BGBillingServer/dyn.
Каждый класс для реализации конкретной функциональности (например, скрипта поведения) должен реализовывать определённый интерфейс (в каждом случае свой). После этого его необходимо скомпилировать и он станет доступен для выбора в соответствующем меню привязки динамического класса.
Для работы с динамически загружаемыми классами из клиента биллинга необходимо воспользоваться пунктом меню Сервис=>Автоматизация=>Управление динамическим кодом.
Дерево динамических классов можно видеть на панели слева. Изменённые, но не перекомпилированные классы отображаются в дереве со значком * (это будет работать ТОЛЬКО в случае, если файловая система, в которой хранятся скрипты, поддерживает хранение времени последнего изменения файла, в противном случае все исходные коды всегда будут помечены как изменённые).
Для открытия существующего класса на редактирование необходимо выбрать нужный класс в дереве классов слева и щелкнуть на кнопку Редактировать на стандартной панели инструментов, либо открыть класс двойным щелчком мыши. Каждый класс открывается в отдельной вкладке.
Для создания нового класса необходимо нажать кнопку Новый элемент на стандартной панели инструментов. Откроется диалоговое окно, в котором будет предложено ввести полное имя класса. Полное имя класса включает в себя пакет, в котором располагается класс. Пакет по своей сути представляет собой папку в файловой системе. Пакеты разделяются между собой символом "." (точка). Обратите внимание, что если в дереве классов выбрать предварительно какой-либо пакет и нажать кнопку создания нового класса, то этот пакет автоматически подставится в поле диалогового окна.
В выпадающем списке можно выбрать один из следующих пунктов:
Глобальный скрипт - будет создан экземпляр класса, расширяющий абстрактный класс ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase. Данный класс можно запускать как глобальный скрипт, доступный через меню Сервис -> Автоматизация -> Глобальные скрипты поведения.
Отчеты: класс табличного отчета - будет создан экземпляр класса, реализующего интерфейс bitel.billing.server.reports.BGCSVReport.CSVFillerDataFields, который используется для формирования данных в табличном отчете модуля Reports.
Отчеты: xml описатель отчета - будет создан xml-файл с описанием фильтров отчета модуля Reports.
Для полной перекомпиляции всех исходных кодов необходимо нажать кнопку Скомпилировать всё. Для компиляции отдельных классов необходимо открыть их в дереве по двойному щелчку и нажать кнопку Сохранить и скомпилировать. Ошибки и предупреждения компилятора можно увидеть в открывающейся панели Сообщения компилятора. В случае ошибки в процессе компиляции некоторого класса никаких изменений в базе данных скомпилированных классов не произойдет. Это означает, что будет работать последняя работоспособная версия динамического класса.
Для удаления класса (или группы классов) необходимо выбрать их в дереве классов и нажать кнопку Удалить в панели инструментов. Перед удалением выбранных классов производится полная перекомпиляция динамических классов без участия удаляемых классов для проверки на наличие зависимостей оставшегося кода от них. В случае, если компиляция пройдет с ошибками, то удаление классов не будет произведено для сохранения работоспособности оставшегося кода!
Обратите внимание, что привязка удаляемых классов в различных подсистемах (скрипты поведения, глобальные скрипты и т.п.) не проверяется! Удаление классов производится на свой страх и риск. В случае оставшейся привязки удалённого класса к какой-либо подсистеме, корректное поведение этой подсистемы не гарантируется!
Одним из преимуществ такого подхода к разработке расширений биллинга состоит в том, что возможна организация полноценной работы в IDE (автодополнение, проверка кода на ошибки и т.п.). Пример, как это сделать, вы можете найти в WiKi.
Для возможностей отладки и удобного запуска можно запустить код прямо из редактора.
Сначала пытается запуститься метод execute как у глобальных скриптов (можно просто добавить этот метод с такой сигнатурой). Если такой метод есть, то создаётся экземпляр класса и в него передаются объекты типа ru.bitel.bgbilling.server.util.Setup и ru.bitel.common.sql.ConnectionSet, как в глобальные скрипты. Первый содержит в себе конфигурацию приложения, второй - набор соединений к БД (основной, slave и "мусорной" и при наличии ). Если такого метода нет, то ищется стандартный метод public static void main(String[] args).
Работа с встроенным редактором
Каждый редактируемый файл открывается в своей собственной вкладке. Ошибки, предупреждения, результат выполнения у каждой вкладки свои.
Щелчок правой кнопки мыши на заголовке вкладки откроет контекстное меню вкладки, в котором доступны несколько пунктов:
Закрыть - закрыть текущую вкладку
Закрыть остальные - закрыть все открытые вкладки кроме текущей
Закрыть все - закрыть все открытые в редакторе вкладки.
Как только в окне редактора вы начинаете изменять текст, данная вкладка помечается как измененная (знак "*" в заголовке вкладки рядом с названием файла).
При попытке обновить содержимое вкладки, содержащей несохраненные данные, с помощью кнопки Обновить на панели инструментов редактор выдаст предупреждение
При нажатии на кнопку Да из редактора удалятся все ваши внесенные изменения в файл. Нажатие кнопки Нет оставит ваши изменения нетронутыми.
При попытке закрыть вкладку, имеющую несохраненные данные, редактор выдаст предупреждение
Кнопка Да сохранит внесенные изменения и закроет вкладку, кнопка Нет закроет вкладку без сохранения изменений, кнопка Отмена предотвратит закрытие вкладки, оставив внесенные изменения.
Если в редакторе открыто сразу несколько вкладок и среди них есть как минимум одна с несохраненными изменениями, то предупреждение будет выглядеть следующим образом:
Кнопка Да сохранит данные на всех вкладках, имеющих значок измененности, кнопка Нет просто закроет указанные вкладки.
Бывает ситуация, когда один и тот же файл редактируется одновременно из двух разных мест. Например, один пользователь правит файл в IDE, а другой в редакторе динамического кода. Если в момент сохранения в редакторе файл уже был сохранен кем то другим, то редактор выдаст предупреждение
При нажатии кнопки Да будут применены изменения, которые были сделаны ВНЕ редактора динамического кода. При этом изменения, внесенные в редакторе, будут потеряны. При нажатии кнопки Нет, наоборот, будет использовано содержимое вкладки редактора, которое перетрет изменения, внесенные извне.
Горячие комбинации клавиш редактора
В левой стороне указаны комбинация для Linux и Windows, в правой для Mac OS
F9 - запуск
Ctrl + ↑ - переместить выделенный блок текста вверх - ( ⌘ + ↑ )
Ctrl + ↓ - переместить выделенный блок текста вниз - ( ⌘ + ↓ )
Ctrl + L - перейти на заданную строку - ( ⌘ + L )
Ctrl + F - перевести фокус на панель поиска - ( ⌘ + F )
Shift + C - закомментировать/раскомментировать строку (-и) - ( ⌘ + / )