Реализация кастомных модулей системы¶
Методы, используемые модулями¶
Продукты Юниверс работают на модульной архитектуре. Новые функции могут быть добавлены в систему путем реализации нового модуля.
Модуль — это фрагмент кода, упакованный в файл .jar и реализующий интерфейс org.unidata.mdm.system.type.module.Module
. Кроме того, модуль должен иметь специальную запись в файле MANIFEST.MF, обозначающую реализующий класс. Например:
Unidata-Module-Class: org.unidata.mdm.data.module.DataModule
Кастомные модули создаются с использованием набора обязательных методов. Реализованные модули загружаются в продукт Юниверс.
Интерфейс org.unidata.mdm.system.type.module.Module
имеет несколько обязательных для реализации методов:
/**
* Gets module ID, i. e. 'org.unidata.mdm.core'.
* @return ID
*/
String getId();
/**
* Gets module version, consisting of major.minor.rev, i. e. '5.4.3'.
* @return version
*/
String getVersion();
/**
* Gets module localized name, 'Unidata Core'.
* @return name
*/
String getName();
/**
* Gets module localized description, i. e. 'This outstanding module is for all the good things on earth...'.
* @return description
*/
String getDescription();
Если модуль имеет зависимости от других модулей, он также должен реализовать метод:
/**
* Returns the dependencies of this module.
*/
Collection<Dependency> getDependencies()
СModule Service проверит и загрузит зависимости до запуска модуля.
Идентификатор модуля должен соответствовать корневому пакету модуля если модуль использует Spring и внедряет bean-компоненты из других модулей, т.к. корневой пакет модуля будет сканироваться Spring фреймворком для обнаружения классов, аннотированных аннотациями Spring.
Класс, реализующий org.unidata.mdm.system.type.module.Module
, сам не должен быть bean-компонентом, хотя @Autowire или JSR330 @Inject можно использовать внутри реализующего класса.
Независимо от того, как реализован интерфейс модуля — с использованием Spring или нет — аннотацию @ModuleRef можно использовать для внедрения экземпляра модуля в интересующее место, например:
@ModuleRef
private DataModule dataModule;
// or
@ModuleRef("org.unidata.mdm.data")
private Module dataModule;
Также есть ряд других методов, которые могут быть реализованы:
/**
* Runs module's install/upgrade procedure.
* Can be used to init / mgirate DB schema or other similar tasks.
*/
default void install() {
// Override
}
/**
* Runs module's uninstall procedure.
* Can be used to drop schema or similar tasks.
*/
default void uninstall() {
// Override
}
/**
* Runs module's start procedure.
* Happens upon each application startup.
* Should be used for initialization.
*/
default void start() {
// Override
}
/**
* Runs module's stop procedure.
* Happens upon each application shutdown.
* Should be used for cleanup.
*/
default void stop() {
// Override
}
/**
* Runs after platform startup (all modules have successfullty executed method start) in the order of dependency resolution
*/
default void ready() {
// Override
}
Если модуль имеет кастомные настройки, которые модуль должен использовать, то переопределите метод AbstractModule.getConfigurationProperties()
. Работа модуля с базой данных к кастомным настройкам не относится, переопределять метод для этого не требуется.
Добавление кастомных модулей¶
После того, как модуль реализован, его необходимо добавить в продукт Юниверс. Варианты добавления:
поместите модуль в каталог universe-integration в $CATALINA_HOME/universe-integration в Tomcat. Далее необходимо добавить в $CATALINA_HOME/conf/Catalina/localhost файл конфигурации universe-backend.xml.
поместите модуль в каталог universe-integration в Docker.
После этого модуль будет загружен системой.
Примечание
Модуль должен иметь права доступа, необходимые ему для работы. Например, права на создание и редактирование таблиц, расширений, функций. Если прав недостаточно, то будут ошибки. Для внешних модулей (например, реализация LDAP): модуль не запустится, но система будет работать. Для внутренних модулей (например, кастомная реализация поиска): система не запустится.