Пример создания DIS краулера

Статья содержит пример создания краулера DIS на основе сборщика gradle и среды разработки IntelliJ IDEA.

Создание проекта в IntelliJ IDEA

  1. Нажмите File → New → Project.

  2. Создайте проект gradle на Java 11.

Подключение зависимостей

  1. Создайте каталог libs в корне проекта и добавьте в него jar. Примеры имен файлов:

    • com.universe.dg.dis.integration-2.4.0-SNAPSHOT.jar

    • org.unidata.dg.meta-2.4.0-SNAPSHOT.jar

    • org.unidata.mdm.core-6.8.0-SNAPSHOT.jar

Примечание

Используйте актуальные библиотеки для конкретной версии Юниверс DG. Запросите библиотеки у менеджера компании Юниверс Дата

  1. В файле build.gradle в dependencies укажите:

dependencies {
// UD dependencies
implementation files('libs/com.universe.dg.dis.integration-2.4.0-SNAPSHOT.jar')
implementation files('libs/org.unidata.mdm.core-6.8.0-SNAPSHOT.jar')
implementation files('libs/org.unidata.dg.meta-2.4.0-SNAPSHOT.jar')

implementation 'org.springframework:spring-context:5.2.1.RELEASE'
implementation 'com.google.code.findbugs:jsr305:3.0.2'
implementation 'org.apache.commons:commons-lang3:3.9'
}

Описания параметров краулера

Описания параметров краулера можно выделить в отдельный класс.

Каждый параметр должен иметь тип CrawlerParameterDescriptor, который имеет интуитивно понятный builder.

Пример описания:

public class OracleDisCrawlerParameters {

 public static final CrawlerParameterDescriptor ORACLE_SCANNER_USER = CrawlerParameterDescriptor.string()
         .name("oracleScannerUser")
         .required(true)
         .displayName("Пользователь")
         .description("Описание")
         .build();

 /**
  * Constructor.
  */
 private OracleDisCrawlerParameters() {
     super();
 }

 /**
  * Get Oracle crawler connection parameters.
  *
  * @return oracle crawler connection parameters
  */
 public static List<CrawlerParameterDescriptor> getOracleParameters() {
     return List.of(ORACLE_SCANNER_USER);
     }
}

Свойства параметра

Список:

  • name - имя параметра.

  • displayName - отображаемое имя параметра.

  • description - описание параметра.

  • required - флаг, указывает на то, является ли параметр обязательным.

  • defaultValue - значение параметра по умолчанию.

  • isEditable - флаг, указывает на то, является ли параметр редактируемым.

  • condition - принимает пару значений (название параметра от которого зависит, значение параметра от которого зависит). Если условие выполняется, то параметр будет отображен на UI.

  • type - тип параметра (сейчас используется SECRET для скрытия пароля на UI).

  • selector - используется для определения значения параметра из списка.

Скрытие зависимых параметров краулера

Некоторые зависимые параметры краулера можно скрыть. Если в строке "condition" указано определенное имя, то появится и значение параметра. Ниже можно ознакомиться с описанием примера.

Пример описания:

CrawlerParameterDescriptor.string()
     .condition(Pair.of("host", "localhost"))
     .name(PROPERTY_PASSWORD)
     .required(true)
     .type(CrawlerParameterType.SECRET)
     .displayName(() -> TextUtils.getText(CoreModule.MODULE_ID + ".crawler.base.jdbc.param.password"))
     .build()

CrawlerParameterDescriptor.string()
    .condition(Pair.of("boolParamName", true))
    .name(PROPERTY_PASSWORD)
    .required(true)
    .type(CrawlerParameterType.SECRET)
    .displayName(() -> TextUtils.getText(CoreModule.MODULE_ID + ".crawler.base.jdbc.param.password"))
    .build()

Создание краулера

  1. Для создания краулера создайте класс и наследуйте его от абстрактного класса AbstractDisCrawler:

package com.unidata.dg.dis.crawlers.oracle;
import com.universe.dg.dis.integration.service.AbstractDisCrawler;
public class OracleCrawler  extends AbstractDisCrawler {
}
  1. Имплементируйте методы абстрактного класса:

  • Метод getStartProperties возвращает Map, где key - название параметра краулера; value - значение параметра:

    @Override
    @Nonnull
    protected Map<String, Object> getStartProperties() {
    return this.startProperties;
    }
    
  • Метод getCrawlerUrlSegment возвращает часть пути, которая характеризует конкретный краулер:

    @Override
    @Nonnull
    protected String getCrawlerUrlSegment() {
    return "oracle";
    }
    
  • Метод descriptor возвращает CrawlerDescriptor, который описывает краулер (имя, отображаемое имя, описание, параметры подключения, поддерживаемый тип: метаданные/данные):

    @Override
    @Nonnull
    public CrawlerDescriptor descriptor() {
    
        CrawlerDescriptor crawlerDescriptor = new CrawlerDescriptor();
        crawlerDescriptor.setName(CRAWLER_NAME);
        crawlerDescriptor.setDisplayName(() -> "Тестовый краулер Oracle");
        crawlerDescriptor.setDescription(() -> "Описание краулера");
        crawlerDescriptor.setConnectParameters(OracleDisCrawlerParameters.getOracleParameters());
        crawlerDescriptor.setSupported(Collections.singletonList(CrawlerExecutionScope.META));
    
        return crawlerDescriptor;
    }
    
  • Метод configure принимает на вход CrawlerConfiguration, который позволяет получить значения параметров краулера, указанные пользователем:

    @Override
    public void configure(CrawlerConfiguration configuration) {
        super.configure(configuration);
    
        CrawlerParameters connectParameters = configuration.getConnectParameters();
    
        OracleDisCrawlerParameters.getOracleParameters().stream()
                .map(param -> Pair.of(param.getName(), connectParameters.getSingle(param.getName())))
                .forEach(param -> startProperties.put(
                        param.getKey(),
                        Objects.isNull(param.getValue()) ? StringUtils.EMPTY : param.getValue())
                );
    
        this.startProperties.put("oracleScannerAgentOption", "");
        this.startProperties.put("oracleScannerTrackSourceChanges", false);
        this.startProperties.put("resourceTypeId", "Oracle");
        this.startProperties.put("oracleScannerScannerExecutionMode", "offline");
    }
    
  • Метод getXmlModel возвращает XML модель данных (типы активов, типы связей и связей), необходимую для работы краулера. XML-файл (например, relational_dg_model.xml) должен быть валидной моделью данных DG, которую можно успешно импортировать через UI. Пример метода:

    @Override
    @Nullable
    protected byte[] getXmlModel() {
        try {
            return StreamUtils.copyToByteArray((new ClassPathResource("relational_dg_model.xml")).getInputStream());
        } catch (IOException e) {
            return new byte[0];
        }
    }
    

XSD схема модели представлена в файле: dg-model-schema-2.5.xsd.

Скачать dg-model-schema-2.5.xsd

Примечание

В модели DIS могут возникать коллизии, когда тип связи и тип актива имеют одинаковые названия (Name). Юниверс DG не позволяет сохранить такую модель с одинаковыми названиями элементов модели, поэтому необходимо настроить маппинг между дублирующими элементами модели DIS и элементами модели DG. В примере тип связи DIS com_infa_ldm_relational_ViewColumn будет иметь название com_infa_ldm_relational_ViewColumnViewColumn

  • Метод getModelNameCollisions возвращает Map, где key - пара (название элемента, тип элемента); value - новое название элемента. Этот метод помогает решить коллизии имен в модели данных:

    @Override
    @Nonnull
    protected Map<Pair<String, DisCrawlerElementType>, String> getModelNameCollisions() {
    
        Map<Pair<String, DisCrawlerElementType>, String> collisions = new HashMap<>();
        Pair<String, DisCrawlerElementType> viewColumn = Pair.of("com_infa_ldm_relational_ViewColumn", DisCrawlerElementType.RELATION);
        collisions.put(viewColumn, "com_infa_ldm_relational_ViewColumnViewColumn");
    
        return collisions;
    }
    
  • Метод topLevelAssetTypeNames возвращает список имен верхнеуровневых типов активов, которые будут автоматически связаны с информационной системой. Например, активы типов com_infa_ldm_relational_Database и com_infa_ldm_relational_HiveModel будут автоматически связаны с информационной системой.

Пример метода:

@Override
public List<String> topLevelAssetTypeNames() {
    return List.of("com_infa_ldm_relational_Database", "com_infa_ldm_relational_HiveModel");
}

Скачать пример краулера OracleCrawler.java

Сборка проекта

Для сборки проекта соберите jar архив с помощью команды gradle jar или с помощью среды разработки.

Загрузка в систему Юниверс DG

Полученный jar-архив загрузите в систему Юниверс DG путем добавления краулера в разделе "Краулеры".