LDIF 解析

LDAP Directory Interchange Format (LDIF) 文件是描述目录数据的一种标准平面文件格式。这种格式最常见的用途包括信息传输和归档。然而,该标准也定义了一种描述存储数据修改的方式,同样采用平面文件格式。后者的 LDIF 文件通常被称为 changetypemodify LDIFs。

org.springframework.ldap.ldif 包提供了用于解析 LDIF 文件并将其反序列化为具体对象所需的类。LdifParserorg.springframework.ldap.ldif 包中的主要类,能够解析符合 RFC 2849 规范的文件。这个类从资源中读取行,并将它们组装成一个 LdapAttributes 对象。

LdifParser 当前会忽略 changetype LDIF 条目,因为它们在应用环境中的用途尚未确定。

对象表示

org.springframework.ldap.core 包中的两个类提供了在代码中表示 LDIF 的方式

  • LdapAttribute: 扩展了 javax.naming.directory.BasicAttribute,并根据 RFC2849 添加了对 LDIF 选项的支持。

  • LdapAttributes: 扩展了 javax.naming.directory.BasicAttributes,并添加了对 DN 的专门支持。

LdapAttribute 对象将选项表示为一个 Set<String>。添加到 LdapAttributes 对象的 DN 支持使用了 javax.naming.ldap.LdapName 类。

解析器

Parser 接口提供了操作的基础,并采用了三个支持策略定义

  • SeparatorPolicy: 建立了将行组装成属性的机制。

  • AttributeValidationPolicy: 确保属性在解析之前结构正确。

  • Specification: 提供了一种在组装后验证对象结构的机制。

这些接口的默认实现如下

  • org.springframework.ldap.ldif.parser.LdifParser

  • org.springframework.ldap.ldif.support.SeparatorPolicy

  • org.springframework.ldap.ldif.support.DefaultAttributeValidationPolicy

  • org.springframework.ldap.schema.DefaultSchemaSpecification

这些类协同工作,逐行解析资源,并将数据转换为 LdapAttributes 对象。

SeparatorPolicy 决定了如何解释从源文件读取的每一行,因为 LDIF 规范允许属性跨多行。默认策略根据行的读取顺序来评估行,以确定当前行的性质。control 属性和 changetype 记录将被忽略。

DefaultAttributeValidationPolicy 使用 REGEX 表达式来确保每个属性在解析后符合有效的属性格式(根据 RFC 2849)。如果属性验证失败,则会记录一个 InvalidAttributeFormatException,并且该记录会被跳过(解析器返回 null)。

模式验证

通过 org.springframework.ldap.schema 包中的 Specification 接口,可以提供一种针对 schema 验证已解析对象的机制。DefaultSchemaSpecification 不执行任何验证,适用于已知记录有效且无需检查的情况。这个选项可以避免验证带来的性能开销。BasicSchemaSpecification 执行基本检查,例如确保提供了 DN 和对象类声明。当前,针对实际 schema 进行验证需要实现 Specification 接口。

Spring Batch 集成

虽然任何需要解析 LDIF 文件的应用程序都可以使用 LdifParser,Spring 提供了一个批处理框架,为解析 CSV 等分隔文件提供了许多文件处理工具。org.springframework.ldap.ldif.batch 包提供了在 Spring Batch 框架中使用 LdifParser 作为有效配置选项所需的类。这个包中有五个类。它们共同提供了三种基本用例

  • 从文件中读取 LDIF 记录并返回一个 LdapAttributes 对象。

  • 从文件中读取 LDIF 记录并将其映射到 Java 对象(POJOs)。

  • 将 LDIF 记录写入文件。

第一个用例通过 LdifReader 实现。这个类扩展了 Spring Batch 的 AbstractItemCountingItemStreamItemReader 并实现了其 ResourceAwareItemReaderItemStream。它自然地融入到框架中,你可以使用它从文件中读取 LdapAttributes 对象。

你可以使用 MappingLdifReader 将 LDIF 对象直接映射到任何 POJO。这个类要求你提供一个 RecordMapper 接口的实现。这个实现应该包含将对象映射到 POJO 的逻辑。

你可以实现 RecordCallbackHandler 并将实现提供给任一读取器。你可以使用这个 handler 来处理被跳过的记录。更多信息请参阅 Spring Batch API 文档

这个包的最后一个成员,LdifAggregator,可用于将 LDIF 记录写入文件。这个类调用 LdapAttributes 对象的 toString() 方法。