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

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

Ниже приведен пример модуля 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.10'
    * @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.

После этого модуль будет загружен системой.

Примечание

Модуль должен иметь права доступа, необходимые ему для работы. Например, права на создание и редактирование таблиц, расширений, функций. Если прав недостаточно, то возникнут ошибки. Для внешних модулей (например, реализация LDAP): модуль не запустится, но система будет работать. Для внутренних модулей (например, кастомная реализация поиска): система не запустится.