LDIF 解析
LDAP Directory Interchange Format (LDIF) 檔案是描述目錄資料的一種標準平面檔案格式。這種格式最常見的用途包括資訊傳輸和歸檔。然而,該標準也定義了一種描述儲存資料修改的方式,同樣採用平面檔案格式。後者的 LDIF 檔案通常被稱為 changetype 或 modify LDIFs。
org.springframework.ldap.ldif
包提供了用於解析 LDIF 檔案並將其反序列化為具體物件所需的類。LdifParser
是 org.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()
方法。