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() 方法。