Page tree
Skip to end of metadata
Go to start of metadata

Для более полного понимания данной секции необходимо владеть базовыми знаниями 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 - закомментировать/раскомментировать строку (-и) - ( ⌘ + / )

 

 

  • No labels