Урок 8. Дополнительные возможности#
В данном уроке рассматриваются:
Поиск по шаблону
Универсальный фильтр
Работа с файлами
Точки расширений
Проектное переопределение кода
Шаблоны thymeleaf
Логирование
Мониторинг производительности
SSH-сервис сервера приложений
Локализация приложений
Миграция данных
Поиск по шаблону#
Руководство разработчика: Сервисные возможности для классов # Поиск по шаблону
Универсальный фильтр#
Универсальный фильтр - сервис позволяющий осуществлять фильтрацию в списках. Позволяет фильтровать записи по коллекциям и значениям атрибутов объектов, на которые ссылаются объекты текущего класса.
Работа с файлами#
Сервис прикрепленных файлов позволяет прикреплять к объектам класса произвольные файлы, которые сохраняются в специальном хранилище на сервере и сопоставляются с конечным объектом-владельцем.
Руководство разработчика: Сервисы класса # Сервис прикрепленных файлов
Шаблоны Thymeleaf#
Шаблонизатор Thymeleaf используется для реализации наследования разметки выборки.
Руководство разработчика: Выборки # Использование шаблонов в разметке
Кроме использования шаблонизации в разметке, есть возможность использования шаблонов и в прикладном коде, например, формировать текст для html-фреймов.
Точки расширений#
Функционал для исполнения кода в модулях, от которых нет зависимости.
Руководство разработчика: Дополнительные возможности # Точка расширения
Проектное переопределение кода#
С помощью проектного переопределения возможно заменить оригинальные выборки/отображения или исполняемые методы проектными.
Руководство разработчика: Дополнительные возможности # Проектное перекрытие кода Api, Avi, Lib, Pkg
Логирование#
Для логирования существует сразу несколько инструментов:
Логирование через
Btk_LogИспользует специальную коллекцию переменной ссылочности
Btk_Logи пишет данные в базу. Для логирования коллекция подключается как обычно, после чего доступны для использования методы вставки записей через обычные транзакции или автономныеЛогирование сервера приложений
Использует
Loggerсервера для вывода информации в консоль. Для логирования есть методыtrace,debug,info,warnиerror, которые сохраняют в консоли сервера переданные сообщения с соответствующим уровнем.Пример использования -
_logger.info("Пересчет регистра прав ролей")
Логирование в инфо-панель
Использует
InfoLogприложения для записи информации в лог сообщений. Для вывода сообщений создано отображениеBtk_InfoLogAvi#Default, которое принято выводить на отдельной панели для основной выборки приложения в нижней части. Для логирования есть методыinfo,warn,errorиconfirm, которые сохраняют в логере переданные сообщения с соответствующим уровнем.Пример использования -
application.infoLog.error("Отмена загрузки файла")
Пример открытия инфо-панели -
val vMaster = application.mainSelection if (vMaster.form.findSelection(Btk_InfoLogAvi.default()) == null) { vMaster.createPanelBuilder(Btk_InfoLogAvi.default()).align(Align.bottom).toggle() }
Вручную инфо-панель можно открыть/закрыть из меню
Сервис -> Открыть информационную панельЛогирование действий пользователя
Используется для отслеживания процесса выполнения запросов и подстановки параметров, последовательности вызова операций и открытия форм.
Руководство разработчика: Отладка приложений # Логирование на сторону клиента
Мониторинг производительности#
Руководство разработчика: Отладка приложений # Мониторинг производительности
Наиболее часто используется VisualVM для поиска узких мест в части обращений к базе данных. Пример результата мониторинга производительности с использованием VisualVM:

По данным можно определить наличие одинаковых повторяющихся обращений к базе данных или запросы, которые выполняются слишком долго, для дальнейшей оптимизации работы бизнес-логики
SSH-сервис сервера приложений#
Руководство разработчика: Сервисы сервера приложений # SSH консоль сервера
Локализация приложений#
Руководство разработчика: Сервисы сервера приложений # SSH консоль сервера
Миграция данных#
Практическое задание#
Поиск по шаблону#
Для книг добавьте поле «Описание» в перечень полей, по которым будет работать поиск.
Проверьте, что при вводе части описания книги осуществляется подбор книги в ссылочном поле.
Для книг переопределите метод поиска по шаблону, сделайте возможность поиска по автору и году публикации книги.
Например, при вводе значения
Иванов 2002искались книги, чей авторИванови год публикации2002Для этого:
Переопределите метод поиска по шаблону в
ApiклассаКнигаЕсли текст не содержит пробелов, то вызывайте стандартный метод поиска по шаблону.
Входящий текст бейте на 2 части, определяя автора и год выпуска.
Если вторая часть текста - число, то:
осуществите поиск авторов по первой части введенного текста (вызовите метод поиска по шаблону)
если авторы найдены, то запросите книги по этим авторам, чей год публикации подходит под условие поиска.
если записей не найдено, то вызывайте стандартный метод поиска по шаблону
Проверьте, что при вводе автора и года выпуска в ссылочное на книгу поле осуществляется новая логика поиска (в позициях документа).
Примечание
Для проверки, что строка является числом, используйте метод
org.apache.commons.lang3.math.NumberUtils#isCreatable
Универсальный фильтр#
Отключите доступность фильтрации по полю «Описание» для списка книг.
Для книг подключите новую коллекцию универсального фильтра, позволяющую фильтроваться по позициям заказов
Lbr_InOrderDet.Из списка авторов реализуйте операцию открытия книг текущего автора, для этого передайте в открываемый список книг условие универсального фильтра, наложенное по полю
idAuthor
Работа с файлами#
Создайте на диске
Cпапкуstorageи настройте в системе файловые хранилища, указав данный путьc:\storageи тип хранилищаЛокальноеРуководство разработчика: Сервисы класса # Файловое хранилищеВ odm класса
Lbr_InActнастройте сервис прикрепленных файлов в простом режиме.Запустите кодогенерацию, скомпилитесь, обновите код, библиотеки, orm.
В справочнике закладок найдите закладку с системным именем
Btk_AttachItemAvi.List_SimpleAttachи добавьте в детализацию классLbr_InActВ справочнике типов объекта отфильтруйтесь по классу
Lbr_InActи для найденных типов настройте новую закладкуПрикрепленные файлыПосле сброса всех кэшей, переоткройте карточку накладной и на новой закладке попробуйте добавить файлы (например
readme.txt)
Точки расширений#
Добавьте scala class для расширений
Lbr_BtkExt(шаблон для создания Global Ext)Добавьте расширением метода
deleteObjectTypeBefore, в котором будет проверка, что для удаляемого типа объекта нет документов, в которых он был бы указан.
Проектное переопределение кода#
Переопределите в модуле
lbrклассBs_PersonAviСоздайте
avm-файл, и унаследуйте его от базовойavmиспользуя язык шаблонов.Добавьте в переопределенную выборку фильтр-галку «С невыполненными приходными накладными». При включенном фильтре должны выводиться только те записи, на которые есть ссылки в документах
Lbr_InActс состоянием < 300Убедитесь, что при открытии списка физических лиц выводится новый фильтр (список можно открыть из карточки Приходной накладной - атрибута «Библиотекарь»)
Логирование#
В позициях возврата книг
Lbr_InOrderDetна создание записей по мультиселекту добавьте запись в инфо-панель с перечнем книг, добавленных по операции.При создании позиции
Lbr_InOrderDetдолжна открываться инфо-панель, если она закрыта.
Мониторинг производительности#
Подключите
VisualVMк запущенному серверуЗапустите запись отслеживания соединений с БД
Добавьте книги в позиции возврата книг
Lbr_InOrderDetи посмотрите результат мониторинга
SSH-сервис сервера приложений#
Используя Putty подключитесь к SSH-серверу
Подключитесь к базе данных для выполнения сервисных операций
Выполните создание/обновление объектов схемы БД
Миграция данных#
Создайте миграционный пакет для модуля
lbrДобавьте в него
upTask, в котором для всех объектов классаLbr_Publisher, которые не входят не в одну из групп, будет регистрироваться запись вBtk_ObjectGroupи устанавливаться корневая группа класса.Запустите миграцию по модулю
lbrчерезexternal tools-Run Migrations
Создайте миграционные скрипты модуля
lbrНапишите скрипт, который обновит для таблицы
lbr_bookколонкуsDesc. Для всех записей, у которых не заполнена это колонка, установите в него значение колонкиsCaptionЗапустите миграцию по модулю
lbrчерезexternal tools-Run Migrations