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

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

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

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

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

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

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

images/download/attachments/43385236/dynamic_overview.png

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

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

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

images/download/attachments/43385236/dyn_editor_newClass.png
Окно создания нового класса

В выпадающем списке можно выбрать один из следующих пунктов:

  • Глобальный скрипт - будет создан экземпляр класса, расширяющий абстрактный класс ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase. Данный класс можно запускать как глобальный скрипт, доступный через меню Сервис -> Автоматизация -> Глобальные скрипты поведения.

  • Отчеты: класс табличного отчета - будет создан экземпляр класса, реализующего интерфейс bitel.billing.server.reports.BGCSVReport.CSVFillerDataFields, который используется для формирования данных в табличном отчете модуля Reports.

  • Отчеты: xml описатель отчета - будет создан xml-файл с описанием фильтров отчета модуля Reports.

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

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

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

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

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

images/download/attachments/43385236/dyncode_run_result.png
Результаты запуска глобального скрипта из окна редактора динамического кода

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

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

Каждый редактируемый файл открывается в своей собственной вкладке. Ошибки, предупреждения, результат выполнения у каждой вкладки свои.

Щелчок правой кнопки мыши на заголовке вкладки откроет контекстное меню вкладки, в котором доступны несколько пунктов:

  • Закрыть - закрыть текущую вкладку

  • Закрыть остальные - закрыть все открытые вкладки кроме текущей

  • Закрыть все - закрыть все открытые в редакторе вкладки.

Как только в окне редактора вы начинаете изменять текст, данная вкладка помечается как измененная (знак "*" в заголовке вкладки рядом с названием файла).

images/download/attachments/43385236/dyncode_unsaved_class.png
Пометка вкладки как измененная.

При попытке обновить содержимое вкладки, содержащей несохраненные данные, с помощью кнопки Обновить на панели инструментов редактор выдаст предупреждение

images/download/attachments/43385236/dyncode_unsaved_data_warning.png
Предупреждение о наличии несохраненных данных на вкладке

При нажатии на кнопку Да из редактора удалятся все ваши внесенные изменения в файл. Нажатие кнопки Нет оставит ваши изменения нетронутыми.

При попытке закрыть вкладку, имеющую несохраненные данные, редактор выдаст предупреждение

images/download/attachments/43385236/dyncode_unsaved_class_close.png

Кнопка Да сохранит внесенные изменения и закроет вкладку, кнопка Нет закроет вкладку без сохранения изменений, кнопка Отмена предотвратит закрытие вкладки, оставив внесенные изменения.

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

images/download/attachments/43385236/dyncode_unsaved_tabs_close.png

Кнопка Да сохранит данные на всех вкладках, имеющих значок измененности, кнопка Нет просто закроет указанные вкладки.

Бывает ситуация, когда один и тот же файл редактируется одновременно из двух разных мест. Например, один пользователь правит файл в IDE, а другой в редакторе динамического кода. Если в момент сохранения в редакторе файл уже был сохранен кем то другим, то редактор выдаст предупреждение

images/download/attachments/43385236/dyncode_editor_wrap_warning.png

При нажатии кнопки Да будут применены изменения, которые были сделаны ВНЕ редактора динамического кода. При этом изменения, внесенные в редакторе, будут потеряны. При нажатии кнопки Нет, наоборот, будет использовано содержимое вкладки редактора, которое перетрет изменения, внесенные извне.

Горячие комбинации клавиш редактора

В левой стороне указаны комбинация для Linux и Windows, в правой для Mac OS

F9 - запуск

Ctrl + ↑ - переместить выделенный блок текста вверх - ( ⌘ + ↑ )

Ctrl + ↓ - переместить выделенный блок текста вниз - ( ⌘ + ↓ )

Ctrl + L - перейти на заданную строку - ( ⌘ + L )

Ctrl + F - перевести фокус на панель поиска - ( ⌘ + F )

Shift + C - закомментировать/раскомментировать строку (-и) - ( ⌘ + / )