简介
IBM i2® Analyze 是一个可扩展可缩放面向服务的分析环境, 旨在为组织提供在需要的时间和地点获得智能的能力, 使组织能够制定更快更明智的决策它通过一个为集成到现有企业基础架构而设计的可扩展面向服务的环境, 帮助分析大量数据
该产品提供了一些直观的可视分析工具, 利用从各种来源收集的数据获取洞察获取数据并将其转换为适合分析的信息是项目取得成功的关键 Data Access on Demand (DAOD) 连接器扩展了 i2 的功能, 使用户能可视化并调查来自第三方提供者的数据在通过 web 服务 (REST 或 SOAP) 提供数据时, 或者在信息源太大时(比如数据仓库), 需要使用此方法
IBM i2 Analyze 从实体链接和属性方面来建模数据, 其中:
实体表示真实对象
链接将两个实体相互关联
属性存储描绘了实体或链接的特征值
数据模型声明了数据中可以出现哪些实体和链接, 这些项可以具有哪些属性, 以及不同类型的项之间可以存在的关系开发 i2 连接器涉及到确定搜索条件; 获取输入信息来组成对外部数据源的请求; 检索响应; 以及将它们从原始格式转换为实体链接和属性, 以便能够进行可视调查通过数据连接器将数据提供给 i2 Analyze 后, 不会修改外部数据源, 并保持完整和不变
本教程将展示一种创建 IBM i2 Analyze 连接器的循序渐进的方法
设置开发环境
要设置开发环境, 需要做的第一件事是按照这里的 GitHub 操作说明安装 Developer Essentials 开发工具包
创建用于开发的新连接器的框架:
通过复制一个类似的现有示例项目目录, 创建一个项目目录作为示例的对等节点请参阅配置 data access on-demand 示例项目, 了解部署示例项目的操作说明
将新目录重命名为该项目的名称避免空格和特殊字符
删除新项目中从旧项目复制过来的所有临时目录(例如 bin 和 build)
在新项目目录中, 在所有目录 / 文件名 / 内容中找到旧项目名称并替换为新项目名称, 比如
.settings\org.eclipse.wst.common.component
和 .project
如果新项目并不依赖于旧项目所依赖的某个资源, 则在所有文件内容中删除对该依赖项的所有引用, 例如
.settings\org.eclipse.wst.common.component
和 .classpath
将新项目名称添加到
master\settings.gradle
的末尾
如果该项目依赖于另一个资源, 比如 JAR 文件(即使它与旧项目的依赖项相同), 则在 master\build.gradle 中为新项目创建一个项目依赖项块(紧挨现有的类似块之后)
运行旧项目必需的 commands/follow 设置指令(对于 DAOD, 该指令为 addDaodDataSource, 用于设置拓扑结构标志和部署), 然后在指令中根据需要修改项目名称
测试新项目是否与建模它时所基于的项目同样有效
如果项目的目录结构发生更改, 则更新 Eclipse 部署集合
添加一个依赖项
- project(":$daSubsetRestConnector") {
- dependencies {
- compile fileTree(dir: "$sdkDir/sdk-projects/onyx-da-subset-mydaod/fragment/WEB-INF/lib", includes: ['**/*.jar'])
- }
- }
将 JAR 文件添加到 WEB-INF/lib 文件夹, 以确保它们包含在连接器的 WAR 文件中
在将连接器的代码移植到新版本时, 上述指令也适用项目框架准备就绪后, 可以开始自定义您的模型和代码了
部署自定义模型
在一个典型项目上, 您可能会创建自己的 IBM i2 自定义模型 IBM i2 模型是一种实体 - 链接 - 属性模型, 它将包含 DAOD 连接器将提供的实体和链接
按照下面的操作说明, 将自己的模型部署到 Developer Essentials 中在下面的示例操作说明中, model.xml 是模型文件,
model - ChartingSchemes.xml
是图表模式文件作为一种最佳实践, 应该删除 XML 文件名中的空格 部署您的模型:
如果在安装 Developer Essentials 时接受了所有默认设置, 部署工具包会安装到 C:\IBM\i2analyze
受运行命令
buildt deployExample
的影响, gradle 在路径 C:\IBM\i2analyze\SDK\sdk-projects\master 下生成一个 build 文件夹将 XML 模型文件(例如 model.xml 和
model - ChartingSchemes.xml
)复制到 C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\fragments\common\WEB-INF\classes 中
编辑文件 ApolloServerSettingsMandatory.properties 以更新对 XML 模型文件的引用:
SchemaResource = model.xml
和
ChartingSchemesResource = model - ChartingSchemes.xml
使用具有管理特权的 Windows 命令提示符, 运行 deploy 命令从 C:\IBM\i2analyze\SDK\sdk-projects\master 中, 运行:
- build -t clearData --all -s onyx-server
- build -t deploy -s onyx-server
启动 i2 Analyze 服务器并登录到 IBM i2 Intelligence Portal, 以验证模型是否反映了您的更改
自定义代码
1
确定需要实现哪些方法
根据客户的用例, 您需要确定想要实现哪些方法需要实现的重要接口包括:
IExternalDataAdapter
, 它允许使用以下方法搜索外部数据源:
dumbbellSearch(), 它搜索数据源中是否存在哑铃(与特定条件匹配的链接实体对)
expand(), 不得实现它(它的存在仅出于遗留原因)
fullTextSearch(), 它基于某个关键词来搜索所有实体
networkSearch(), 它提供了可视查询行为
search(), 它在外部数据源中搜索满足一系列条件的信息(它是一种属性搜索)
IExternalDataItemRetriever
, 它允许搜索链接到特定实体的数据:
getContext(), 它查找实体的上下文
getLatestItems(), 它检索最新数据
Developer Essentials 示例中提供的
IExternalDataItemEditor
通常无需修改即可使用, 但您可能需要编辑它来更改生成卡时间戳的方式
典型的客户场景需要实现某种搜索 (全文搜索或属性搜索) 结果显示在 Intelligence Portal 上之后, 您可能想要将它们发送到一个 IBM i2 Analyst's Notebook Chart 如果您选择 Add selection to chart, 则会调用 getLatestItems 方法如果您选择 Add result list to chart, 则会再次调用 fullTextSearch 方法
当选中的项显示在图表上后, 通常会通过后续扩展来继续调查, 所以您可能还需要实现 getContext 方法因此, 要实现的最小的方法集包含 searchfullTextSearchgetContext 和 getLatestItems
在拓扑结构文件中设置将实现的功能例如, 编辑目录 C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\environment\ 下的文件 topology.xml, 如下所示:
- <i2-data-source ar="false" id="daod5">
- <DataSource SCSSearchSupported="true"
- EdrsGetContextSupported="true"
- ScsNetworkSearchSupported="false"
- EdrsGetLatestItemsSupported="true"
- Version="0"
- ScsPresent="true"
- ScsFilteredSearchSupported="true"
- ScsBrowseSupported="false"
- Id=""ScsDumbbellSearchSupported="false"SesPresent="true"EdrsPresent="true">
- <Shape>DAOD</Shape>
- <Name>myDAOD</Name>
- </DataSource>
- </i2-data-source>
为名称标签添加一个有意义的标签, 因为它是将出现在 IBM i2 Intelligence Portal 中来标识您的数据源的名称 编辑 WEB-INF\classes 下的文件 ApolloServerSettingsDaodMandatory.properties, 以反映实现接口的类型 (属性 IExternalDataItemRetriever 和 IExternalDataAdapter) 另外检查 WEB-INF\classes 下的文件 ApolloServerSettingsDaod.properties 中的
ExternalDataCreateStandardEDRSRetrievalBlock = true
, 以便正确调用 getContext 方法
2
生成包含新模式的映射 JAR
现在需要创建一个 JAR 文件来映射您的自定义 IBM i2 模式, 使它能够被 IBM i2 Analyze 服务器使用
从主文件夹 C:\IBM\i2analyze\SDK\sdk-projects\master 运行
build - t generateMappingJarx < model - file > -o < jar - file >
, 以生成该 JAR 文件:
build -t generateMappingJar -x C:\IBM\i2analyze\SDK\sdk-projects\onyx-da-subset-mydaod\common- fragment\classes\model.xml -o C:\IBM\i2analyze\SDK\sdk- projects\master\build\toolkit\configuration\fragments\onyx-da-subset-mydaod\WEB-INF\lib model_schema.jar
该命令创建一个名为 model_schema.jar 的文件(在命令中使用您自己的有意义的名称), 其中包含 4 个 XSD 文件(名为
schema1.xsdschema2.xsdschema3.xsd
和 schema4.xsd), 这些文件以 XML 形式定义 IBM i2 数据模型
确保将这个 JAR 文件生成或复制到您的连接器的 lib 文件夹中:
- C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\fragments\onyx-da-subset-mydaod\WEB-INF\lib
- 3
生成从新模式的 XSD 启动的 JAXB 类
XSD 文件很有用, 因为您可以使用它们轻松获得表示 IBM i2 对象的 Java 类做法如下:
将连接器文件夹内的 XSD 文件复制到 data 目录中(例如: C:\IBM\i2analyze\SDK\sdk-projects\onyx-da-subset-mydaod\src\data)
在 Eclipse 中, 右键单击 schema4.xsd, 然后选择 Generate JAXB Classes 按照向导面板进行操作, 您需要定义想要用哪个 Java 包来保存生成的类
排除 JAXB 生成故障:
如果获得了
IllegalArgumentException: Illegal pattern character 'g'... (SimpleDateFromat.compile)
, 可以尝试将
- Duser.language = en - Duser.country = US
添加到默认 JRE 的默认 VM 参数中 (Preferences > Java > Installed JREs > default JRE)
如果生成失败并抛出
Could not find or load main class com.sun.tools.internal.xjc.XJCFacade
, 则需要将 Workspace default JRE 设置为 JRE System library(Java 构建路径 > Libraries > JRE System library)
将方法 equals() 和 hashCode() 添加到连接器将要使用的每个生成的类例如, 在一个 Vehicle 类中, 您将添加以下代码:
- @Override
- public int hashCode()
- { final int prime = 31;
- int result = 1;
- result = prime * result + ((itemId == null) ? 0 : itemId.hashCode());
- result = prime * result + (int) (itemVersion ^ (itemVersion >>> 32));
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Vehicle other = (Vehicle) obj;
- if (itemId== null) {
- if (other.itemId != null)
- return false;
- } else if (!itemId.equals(other.itemId))
- return false;
- if (itemVersion != other.itemVersion)
- return false;
- return true;
- }
打开 QueryResult 类并在
@XmlRootElement(name = "QueryResult")
前面添加
@XmlAccessorType(XmlAccessType.FIELD)
如果没有添加此注释, 将会发生以下错误: Unable to marshal type
- "com.connector.jaxb.QueryResult"
- as an element because it is missing an @XmlRootElement annotation.
一定要修复自动生成相应的 JAXB 类时获得的所有问题, 以避免在图表上显示结果时出现错误
4
查询数据源
如果您想要连接的数据源是 SOAP Web 服务, 可以使用它的 WSDL 文件为从该 Web 服务检索的每个对象生成 Java 类使用 Eclipse 工具, 通过 Web Services/Generate > Java Bean Skeleton 菜单中的 Generate serializable JAXB classes 命令生成这些类
使用这些生成的类, 可以将 Web 服务对象映射到特定于域的 IBM i2 对象, 并为每个查询构建响应
想进一步了解 SSL?
在这里查找我们的所有有关库 SSL 的文章
如果您的 Web 服务使用了 SSL, 您可能需要将 Web 服务证书添加到应用服务器中的密钥库中
如果数据源是数据库, 您需要为应用服务器配置相应的数据源我们建议您创建一个实用程序类来管理 JDBC 连接数据源应添加到 server.xml 文件, 并在 web.xml 文件中作为一个 resource-ref 标签, 如下面样本代码所示:
清单 1. 示例: server.xml
- <dataSource id="Test" jndiName="ds/Test">
- <jdbcDriver libraryRef="DB2JCC4Lib" />
- <properties.db2.jcc currentSchema="DBSCHEMA" databaseName="DBNAME" password="myPwd"
- portNumber="50000" serverName="localhost" user="db2admin" />
- </dataSource>
- <library id="DB2JCC4Lib">
- <fileset dir="C:\IBM\SQLLIB\java" includes="db2jcc4.jar
- db2jcc_license_cu.jar" />
- </library>
清单 2. 示例: web.xml
- <resource-ref>
- <description>DataSource</description>
- <res-ref-name>ds/Test</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
对于 REST Web 服务, 管理连接的实用程序类很有用
我们还建议将连接器的特定属性文件放在 WEB-INF 下, 并使用以下声明来访问它们:
- private static final String PROPERTY_FILE_NAME = "WEB-INF/myProperty.properties";
- 5
构建响应
每次在 Java 中查询某个数据源, 都会获得一个可以映射到 Java 对象的结果集这些对象需要转换为 IBM i2 对象, 以便为 IBM i2 图表构建响应(将它们添加到 QueryResult)
我们发现遵循 Builder GoF 设计模式很有用, 所以我们定义了一个 QueryResultBuilder 类来处理响应的创建和 XML 串行化这个类公开了以下方法:
addMyObject(), 它允许使用以下算法添加一个从结果集启动的对象(一个实体或链接):
从 QueryResult 实例检索一个实体或链接集合
如果 QueryResult 实例为 null(这是对该方法的第一次调用), 那么可以创建一个包含实体 / 链接类型的对象集 新的 Set<MyObject>(以便能在本地删除重复元素)
如果集合的大小不为 null, 则将内容复制到 Set<MyObject> 中
迭代结果集来构建实体 / 链接实例
如果该元素的构建顺利完成(itemId 字段不为 null), 则将它添加到 Set<MyObject>
在方法 clear() 和 addAll() 上调用该集合
将新集合设置为 QueryResult 实例
startBuilding(), 它可以执行以下操作:
创建一个 QueryResult 实例
创建一个
Set < ContextResultMapping >
, 它允许使用扩展结果的图形化表示(它是一个将 QueryResult 映射到 IBM i2 上下文的 IBM i2 Java 对象)
保存 ProvenanceGroupIds(一个 ProvenanceGroup 是一个 IBM i2 对象, 它包含表示来源数据源的元数据)
stopBuildingForSearch()
, 它将 QueryResult 对象编组为 StreamSource(一种 IBM i2 能理解的特定格式)
stopBuildingForExpand()
, 它:
将 QueryResult 编组为 StreamSource
迭代 ProvenanceGroupIds 以创建
ContextResultMappings
元素 (实体或链接) 的实际构建委托给了 QueryResultBuilderHelper 类, 以保持高凝聚性和低耦合
6
缓存数据以避免多次相同的调用
您调用的 Web 服务可能不是免费的 对于您执行的每次调用, 可能需要支付费用通常, 仅对 Web 服务执行一次调用来检索所有数据但是, 一次 IBM i2 搜索通常仅需要检索一个实体如果您需要扩展该实体的上下文, 可以对 Web 服务执行一次新调用
此外, 我们已经指出, 在我们将结果列表添加到图表时, 会调用一个新的 fullTextSearch 为了避免没有必要地多次调用 Web 服务, 应考虑将数据缓存在数据库中供后续扩展使用 (即获取上下文), 这样做可能很有用只有在执行新搜索时, 或者需要最新数据(例如, 可以为缓存的数据设置有效期) 时, 才对 Web 服务执行新调用
7
管理多个连接器
IBM i2 允许管理多个外部连接如果您正在开发的自定义项目需要连接多个数据源(在它需要多个连接器时), 而且数据模型包含接触点(更多数据源中通用的项), 可以通过这些简单步骤来管理多个连接:
更改为 IBM i2 对象生成的 JAXB 类, 从类
CardProvenance.RetrievalBlocksRetrievalBlock.RetrievalData
和 RetrievalDatum 中删除 namespaces 引用
在与数据源间的接触点相关的
QueryResultBuilderHelper
方法中, 创建一个或多个 RetrievalBlocks, 其中属性 i2.EDRS.DS 的值是可从中检索该元素的其他数据源的 dataSourceGUID 我们建议, 使用一个属性文件来保存 GUID, 因为它们在不同环境中会发生变化, 而且在部署到生产中时必须为它们设置正确的值
当这些 GUID 发生更改时, 可以通过选择要查询哪个数据源 (右键单击实体) 来扩展笔记本内的实体, 或者可以将一个实体扩展到所有数据源中 (Show context)但是, 此方法可能破坏与 Intelligence Portal 的兼容性
要删除 RetrievalBlock 类内的名称空间, 可以将
@XmlElement(name = "RetrievalBlock", namespace = "http://www.i2group.com/Schemas/2013-10-03/ModelData/Provenance")
替换为
@XmlElement(name = "RetrievalBlock")
对于 CardProvenance 类, 请保留以下行:
- @XmlType(name = "CardProvenance", namespace =
- "http://www.i2group.com/Schemas/2013-10-03/ModelData/Provenance", propOrder =
- {})
对于 RetrievalDatum 类, 请将
- @XmlType(name = "RetrievalDatum", namespace =
- "http://www.i2group.com/Schemas/2013-10-03/ModelData/Provenance", propOrder =
- {
- "value"
- })
替换为
@XmlType(name = "RetrievalDatum", propOrder = { "value" })
对于 RetrievalBlock 类, 请将
@XmlElement(name = "RetrievalDatum", namespace = "http://www.i2group.com/Schemas/2013-10-03/ModelData/Provenance")
替换为
@XmlElement(name = "RetrievalDatum")
备注: 请检查连接器的属性文件 C:\IBM\i2analyze\SDK\sdk-projects\onyx-da-subset-mydaod\fragment\WEB-INF\classes\ApolloServerSettingsDaodMandatory.properties 中的属性 ValidateXml 是否已设置为 false
要在文件中找到数据源的 GUID, 请检查以下文件:
C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\scripts\gradle\build\autogenFragments\onyx-da-subset-mydaod\WEB-INF\classes\DataSourceDaod.properties 或检查目录 C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\environment\dsid 下的属性文件
将自定义连接器部署到生产环境
按照以下操作说明, 将连接器部署到生产环境
从目录 C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\fragments 复制开发机器的连接器子目录(比如 onyx-da-subset-mydaod)
如果已经在您的应用服务器中设置了一个数据源, 还需要将 web.xml 描述符文件复制到 C:\IBM\i2analyze\SDK\sdk-projects\onyx-da-subset-mydaod\fragment\WEB-INF 下我们建议您也使用此目录保存属性文件, 因为包含到此目录中的所有文件都被构建到要部署到 Liberty 服务器的 WAR 文件中
另外, 请检查 WEB-INF\classes 下的文件 ApolloServerSettingsDaod.properties 中的
ExternalDataCreateStandardEDRSRetrievalBlock
是否设置为 true
1
创建 DAOD 连接器的结构
现在可以开始将连接器部署到生产中了
创建表示您的 DAOD 连接器的结构为此, 请从 C:\IBM\i2analyze\toolkit\scripts 运行以下命令:
setup - dn < connector - dir > -t addDaodDataSource
例如:
- C:\IBM\i2analyze\toolkit\scripts>setup -dn onyx-da-subset-mydaod -t addDaodDataSource
- 2
复制连接器的代码段
现在需要将您从开发机器复制的文件夹粘贴到 C:\IBM\i2analyze\toolkit\configuration\fragments 中
例如, 将
onyx - da - subset - mydaod
从
开发机器的 C:\IBM\i2analyze\SDK\sdk-projects\master\build\toolkit\configuration\fragments
复制到
C:\IBM\i2analyze\toolkit\configuration\fragments 下
3
修改 i2 拓扑结构
编辑 topology.xml 文件, 根据连接器实现的特性来更改 DataSource 标签可以选择将在门户中显示的连接器名称例如:
- <DataSource
- ScsSearchSupported="true" EdrsGetContextSupported="true"
- ScsNetworkSearchSupported="false" EdrsGetLatestItemsSupported="true"
- Version="0" ScsPresent="true" ScsFilteredSearchSupported="true"
- ScsBrowseSupported="false" Id=""ScsDumbbellSearchSupported="false"SesPresent="true"EdrsPresent="true">
- <Shape>DAOD</Shape>
- <Name>MyConnector</Name>
- </DataSource>
备注: 如果有多个连接器要部署, 可以在为前一个连接器完成第 1-3 步后, 对其他连接器依次执行这些步骤
4
停止应用服务器
停止 Liberty 服务器以允许部署, 方法是运行:
- setup - t stopLiberty - s onyx - server
- 5
将数据源添加到 Liberty 配置文件中
如果已设置数据源, 您需要手动将它们添加到 server.xml 中例如:
- <dataSource id="Test" jndiName="ds/Test">
- <jdbcDriver libraryRef="DB2JCC4Lib" />
- <properties.db2.jcc currentSchema="DBSCHEMA" databaseName="DBNAME" password="myPwd"
- portNumber="50000" serverName="localhost" user="db2admin" />
- </dataSource>
- <library id="DB2JCC4Lib">
- <fileset dir="C:\IBM\SQLLIB\java" includes="db2jcc4.jar
- db2jcc_license_cu.jar" />
- </library>
备注: 检查是否可以在 C:\IBM\i2analyze\toolkit\configuration\fragments\onyx-da-subset-mydaod\WEB-INF 下找到 web.xml
如果需要的话, 可以自定义您的连接器的属性文件
6
部署并重新启动应用服务器
运行以下命令:
- setup - t deploy - s onyx - server
- setup - t startLiberty - s onyx - server
故障排除和调试
根据我们的经验, 以下是一些与排除自定义连接器的故障相关的建议
更改连接器日志的日志级别
此假设基于您遵循了良好的开发实践来增强可服务性和写入日志跟踪的事实如果您选择使用 log4j, 要更改日志级别, 需要编辑 C:\IBM\i2analyze\deploy\wlp\usr\servers\i2analyze\apps\onyx-da-subset-mydaod.war\WEB- INF\classes 下的文件 log4j.properties
附加
log4j.logger.yourpackage=DEBUG, APOLLOLOG
, 其中 yourpackage 是包含连接器的源代码的 Java 包
重新启动 Liberty 服务器
可以在 C:\IBM\i2analyze\deploy-dev\wlp\usr\servers\i2analyze\logs\onyx-da-subset-mydaod.war 下找到包含 DEBUG 级别的跟踪记录的日志文件
如果执行一次搜索, 但没有向门户呈现结果, 可以检查以下方面:
在 XML 结果中包含一个 QueryResult 对象
您根据安全模式正确设置了您的项的安全标签, 而且它们允许用户查看这些项
映射了您的自定义 IBM i2 模式的 jar 文件是最新的
放入 DAOD 属性文件 ApolloServerSettingsDaod.properties 中的辅助搜索属性 ExternalDataSourceSearchMode 和 ExternalDataSourceFilteredSearchMode 被设置为 1 如果它们被设置为 0, 则在搜索结果上执行第二次搜索, 以便在结果集中突出显示搜索字符串如果没有在结果中返回搜索字符串本身, 那么第二次搜索不会找到任何结果, 也不会显示任何项
如果您注意到门户上禁用了 show context 特性, 可以检查 ApolloServerSettingsDaod.properties 文件中的 ExternalDataCreateStandardEDRSRetrievalBlock 属性是否被设置为 true 如果 show context 特性已启用但无法看到预期的结果, 请检查同一个属性更改此属性的值后, 需要再执行一次搜索, 以便正确设置检索块
通过 SSL 调用 Web 服务时, 可能在连接期间获得一个 NullPointerException, 或者一个由 SSLHandshakeException 和 CertificateException 导致的 WebServiceException 在本例中, 您需要将 Web 服务证书添加到应用服务器的密钥库中
结束语
连接器的开发扩展了 i2 Analyze 的功能, i2 Analyze 是 Security 系列的一款产品该产品使用户能对其数据执行可视调查, 而且可以通过连接器集成 Security 系列的多款产品
总之, i2 Analyze 通过提供可视分析工具从数据中获取洞察, 使您能够制定智慧明智的业务决策通过开发 i2 连接器, 可以通过来自第三方数据源的信息来扩充您的调查结果
来源: http://www.ibm.com/developerworks/cn/security/se-ibm-i2-analyze-data-aod-connector/index.html