Пример создания DIS краулера¶
Статья содержит пример создания краулера DIS на основе сборщика gradle и среды разработки IntelliJ IDEA.
Создание проекта в IntelliJ IDEA¶
Нажмите File → New → Project.
Создайте проект gradle на Java 11.
Подключение зависимостей¶
Создайте каталог 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. Запросите библиотеки у менеджера компании Юниверс Дата
В файле 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()
Создание краулера¶
Для создания краулера создайте класс и наследуйте его от абстрактного класса AbstractDisCrawler:
package com.unidata.dg.dis.crawlers.oracle;
import com.universe.dg.dis.integration.service.AbstractDisCrawler;
public class OracleCrawler extends AbstractDisCrawler {
}
Имплементируйте методы абстрактного класса:
Метод 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 схема модели представлена в файле: udg-model-schema.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");
}
Сборка проекта¶
Для сборки проекта соберите jar архив с помощью команды gradle jar
или с помощью среды разработки.
Загрузка в систему Юниверс DG¶
Полученный jar-архив загрузите в систему Юниверс DG путем добавления краулера в разделе "Краулеры".