LDIF 解析

LDAP Directory Interchange Format (LDIF) ファイルは、ディレクトリデータをフラットファイル形式で記述するための標準的な媒体です。この形式の最も一般的な用途には、情報の転送とアーカイブが含まれます。ただし、標準では、格納されたデータへの変更をフラットファイル形式で記述する方法も定義されています。この後者の型の LDIF は、通常、changetype または modify LDIF と呼ばれます。

org.springframework.ldap.ldif パッケージは、LDIF ファイルを解析して具体的なオブジェクトに逆直列化するために必要なクラスを提供します。LdifParser は org.springframework.ldap.ldif パッケージのメインクラスであり、RFC 2849 に準拠するファイルを解析できます。このクラスは、リソースから行を読み取り、LdapAttributes オブジェクトにアセンブルします。

LdifParser は現在、changetype LDIF エントリを無視します。これは、アプリケーションのコンテキストでの有用性がまだ決定されていないためです。

オブジェクト表現

org.springframework.ldap.core パッケージの 2 つのクラスは、LDIF をコードで表す手段を提供します。

  • LdapAttribute: RFC2849 で定義されている LDIF オプションのサポートを追加して、javax.naming.directory.BasicAttribute を拡張します。

  • LdapAttributes: DN の特殊なサポートを追加して javax.naming.directory.BasicAttributes を拡張します。

LdapAttribute オブジェクトは、オプションを Set<String> として表します。LdapAttributes オブジェクトに追加された DN サポートは、javax.naming.ldap.LdapName クラスを採用しています。

パーサー

Parser インターフェースは操作の基盤を提供し、次の 3 つのサポートポリシー定義を採用しています。

  • 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

これら 4 つのクラスが一緒になって、リソースを 1 行ずつ解析し、データを LdapAttributes オブジェクトに変換します。

SeparatorPolicy は、ソースファイルから読み取られた個々の行がどのように解釈されるかを決定します。これは、LDIF 仕様によって属性が複数の行にまたがることが許可されているためです。デフォルトのポリシーは、考慮されている行の性質を判断するために、読み取られた順序のコンテキストで行を評価します。control 属性と changetype レコードは無視されます。

DefaultAttributeValidationPolicy は REGEX 式を使用して、解析された各属性が (RFC 2849 に従って) 有効な属性形式に準拠していることを確認します。属性が検証に失敗すると、InvalidAttributeFormatException がログに記録され、レコードはスキップされます (パーサーは null を返します)。

スキーマ検証

解析されたオブジェクトをスキーマに対して検証するメカニズムは、org.springframework.ldap.schema パッケージの Specification インターフェースを通じて利用できます。DefaultSchemaSpecification は検証を行わず、レコードが有効であることがわかっていてチェックする必要がない場合に使用できます。このオプションは、検証が課すパフォーマンスの低下を防ぎます。BasicSchemaSpecification は、DN およびオブジェクトクラス宣言が提供されていることを確認するなど、基本的なチェックを適用します。現在、実際のスキーマに対する検証には、Specification インターフェースの実装が必要です。

Spring Batch Integration

LdifParser は、LDIF ファイルの解析を必要とするアプリケーションで使用できますが、Spring は、CSV などの区切りファイルを解析するための多くのファイル処理ユーティリティを提供するバッチ処理フレームワークを提供します。org.springframework.ldap.ldif.batch パッケージは、Spring Batch フレームワークで有効な構成オプションとして LdifParser を使用するために必要なクラスを提供します。このパッケージには 5 つのクラスがあります。これらを組み合わせることで、次の 3 つの基本的な使用例が提供されます。

  • ファイルから LDIF レコードを読み取り、LdapAttributes オブジェクトを返します。

  • ファイルから LDIF レコードを読み取り、レコードを Java オブジェクト (POJO) にマッピングします。

  • ファイルへの LDIF レコードの書き込み。

最初の使用例は LdifReader で達成されます。このクラスは Spring Batch の AbstractItemCountingItemStreamItemReader を継承し、その ResourceAwareItemReaderItemStream を実装します。これはフレームワークに自然に適合し、ファイルから LdapAttributes オブジェクトを読み取るために使用できます。

MappingLdifReader を使用して、LDIF オブジェクトを任意の POJO に直接マップできます。このクラスでは、RecordMapper インターフェースの実装を提供する必要があります。この実装は、オブジェクトを POJO にマッピングするためのロジックを実装する必要があります。

RecordCallbackHandler を実装し、その実装をいずれかのリーダーに提供できます。このハンドラーを使用して、スキップされたレコードを操作できます。詳細については、Spring Batch API ドキュメントを参照してください。

このパッケージの最後のメンバーである LdifAggregator を使用して、LDIF レコードをファイルに書き込むことができます。このクラスは、LdapAttributes オブジェクトの toString() メソッドを呼び出します。