Реализация кастомных модулей системы¶
Продукты Юниверс работают на модульной архитектуре. Новые функции могут быть добавлены в систему путем реализации нового модуля.
Ниже приведен пример модуля com.universe.mdm.sdk.spring
.
Обязательные элементы модуля¶
Модуль — это фрагмент кода, упакованный в файл .jar.
Модуль реализует обязательные интерфейсы, например,
org.unidata.mdm.system.type.module.Module
.Имеющий запись в файле MANIFEST.MF, обозначающую реализуемый класс. Например:
Universe-Module-Class: 'com.universe.mdm.sdk.spring.module.SDKSpringModule
Примечание
Если у вас система сборки gradle, в файл build.gradle добавьте следующую секцию:
jar {
manifest {
attributes 'Universe-Module-Class': 'Путь до вашей реализации интерфейса Module'
}
}
Интерфейс
org.unidata.mdm.system.type.module.Module
имеет несколько обязательных для реализации методов:/** * Получает идентификатор модуля, важное системное значение * </br>ex: 'com.universe.mdm.sdk.spring'. * @return ID */ String getId(); /** * Получает версию модуля, состоящую из major.minor.rev </br>ex: '6.11' * @return version */ String getVersion(); /** * Получает локализованное имя модуля, предназначенное для отображения или информирования * <br>ex: 'Universe SDK Spring module' * @return name */ String getName(); /** * Получает локализованное описание модуля для отображения или информативных целей * <br>ex: 'This outstanding module is just example' * @return description */ String getDescription();
Если модуль имеет зависимости от других модулей, он также должен реализовать метод
getDependencies
, это позволяет выстраивать порядок старта модулей:
@Override
public Collection<Dependency> getDependencies() {
return Arrays.asList(
new Dependency("org.unidata.mdm.core", "6.0"),
new Dependency("org.unidata.mdm.search", "6.0"),
new Dependency("org.unidata.mdm.meta", "6.0"),
new Dependency("com.universe.mdm.core", "6.8"),
);
}
Примечание
Необходимость явного указания зависимостей в методе getDependencies
обусловлена использованием bean-компонентов из других модулей. Например, SecurityUtils требует наличие контекста org.unidata.mdm.core
.
СModule Service проверит и загрузит зависимости до запуска модуля.
Идентификатор модуля должен соответствовать корневому пакету модуля в случае использования Spring и внедрения bean-компонентов из других модулей. Это необходимо, поскольку Spring фреймворк сканирует корневой пакет модуля для обнаружения классов, аннотированных аннотациями Spring.
Класс, реализующий org.unidata.mdm.system.type.module.Module
, сам не должен быть bean-компонентом, хотя @Autowire или JSR330 @Inject можно использовать внутри реализующего класса.
Также есть ряд других методов, которые могут быть реализованы:
/**
* Запускает процедуру установки/обновления модуля.
* Может использоваться для инициализации / миграции схемы БД и других подобных задач.
*/
default void install() {
// Override
}
/**
* Запускает процедуру деинсталляции модуля.
* Может использоваться для сброса схем и других подобных задач.
*/
default void uninstall() {
// Override
}
/**
* Запускает процедуру старта модуля.
* Происходит при каждом запуске приложения.
* Должен использоваться для инициализации.
*/
default void start() {
// Override
}
/**
* Запускает процедуру остановки модуля.
* Происходит при каждом завершении работы приложения.
* Следует использовать для очистки.
*/
default void stop() {
// Override
}
/**
* Запускается после старта системы (все модули успешно выполнили метод start) в порядке разрешения зависимостей
*/
default void ready() {
// Override
}
Если модуль имеет кастомные настройки, которые он должен использовать, то переопределите метод AbstractModule.getConfigurationProperties()
. Также см. подробнее о переменных системы. Работа модуля с базой данных к кастомным настройкам не относится, переопределять метод для этого не требуется - см. подробнее об использовании базы данных.
Добавление кастомных модулей¶
Готовые пользовательские модули возможно добавить в продукт Юниверс двумя способами:
Поместите модуль в каталог universe-integration в $CATALINA_HOME/universe-integration в Tomcat. Далее необходимо добавить в $CATALINA_HOME/conf/Catalina/localhost файл конфигурации universe-backend.xml.
Поместите модуль в каталог universe-integration в Docker.
После этого модуль будет загружен системой.
Совет
Используйте пример файла universe-backend.xml
Примечание
Модуль должен иметь права доступа, необходимые ему для работы. Например, права на создание и редактирование таблиц, расширений, функций. Если прав недостаточно, то возникнут ошибки. Для внешних модулей (например, реализация LDAP): модуль не запустится, но система будет работать. Для внутренних модулей (например, кастомная реализация поиска): система не запустится.