Реализация кастомных модулей системы

Методы, используемые модулями

Продукты Юниверс работают на модульной архитектуре. Новые функции могут быть добавлены в систему путем реализации нового модуля.

Модуль — это фрагмент кода, упакованный в файл .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): модуль не запустится, но система будет работать. Для внутренних модулей (например, кастомная реализация поиска): система не запустится.