LDIF Parsing

LDAP 目录交换格式 (LDIF) 文件是用于以扁平文件格式描述目录数据标准介质。此格式最常见的用途包括信息传输和归档。但是,此标准还定义了以扁平文件格式描述对存储数据的修改方法。此后类型的 LDIF 通常称为 changetypemodify LDIF。 org.springframework.ldap.ldif 包提供了解析 LDIF 文件并将它们反序列化为切实对象的所需的类。LdifParserorg.springframework.ldap.ldif 包的主要类,并且能够解析符合 RFC 2849 的文件。此类从资源中读取行并将它们组装到 LdapAttributes 对象中。

LdifParser 目前忽略 changetype LDIF 条目,因为它们在应用程序上下文中的实用性尚未确定。

Object Representation

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 类。

The Parser

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)。

Schema Validation

验证针对模式的已解析对象的机制通过`org.springframework.ldap.schema`包中的 `Specification`接口提供。`DefaultSchemaSpecification`不执行任何验证,针对已知有效且无需检查的记录的实例提供。此选项消除了验证施加的性能损失。`BasicSchemaSpecification`应用基本检查,例如确保已提供 DN 和对象类声明。当前,对实际模式的验证需要实现 `Specification`接口。

Spring Batch Integration

尽管 `LdifParser`可以被任何需要解析 LDIF 文件的应用程序使用,但 Spring 提供了批量处理框架,该框架为解析分隔文件(如 CSV)提供许多文件处理实用程序。`org.springframework.ldap.ldif.batch`包提供了所需的类,以将`LdifParser`用作 Spring Batch 框架中的有效配置选项。此包中有五个类。它们共同提供了三个基本用例:

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

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

  • 将 LDIF 记录写入文件。

第一个用例由`LdifReader`完成。此类扩展 Spring Batch 的`AbstractItemCountingItemStreamItemReader`并实现了它的`ResourceAwareItemReaderItemStream`。它自然地适合框架,你可以使用它从文件中读取`LdapAttributes`对象。

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

你可以实现 RecordCallbackHandler,并将实现提供给读者。可以使用此处理程序来操作跳过的记录。参见 Spring Batch API documentation 了解更多信息。

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