Sling アダプターの使用 using-sling-adapters
Sling には、Adaptable インターフェイスを実装するオブジェクトを便利に変換できるアダプターパターンが用意されています。このインターフェイスは、オブジェクトを引数として渡されるクラスタイプに変換する汎用の adaptTo() メソッドを提供します。
例えば、リソースオブジェクトを対応するノードオブジェクトに変換するには、次の操作を実行します。
Node node = resource.adaptTo(Node.class);
ユースケース use-cases
次のようなユースケースがあります。
-
実装用のオブジェクトの取得
例えば、汎用の
Resource
インターフェイスの JCR ベース実装では、基盤の JCRNode
にアクセスできます。 -
内部的なコンテキストオブジェクトを渡す必要があるオブジェクトのショートカット作成。
例えば、JCR ベースの
ResourceResolver
では、要求のJCR Session
への参照を保持しています。この JCR セッションは、その要求セッションに基づいて動作する多くのオブジェクト(PageManager
やUserManager
など)を取得するために必要になります。 -
サービスへのショートカット。
稀なケース -
sling.getService()
も簡単に使用できます。
戻り値 Null null-return-value
adaptTo()
は null を返します。
これには、次のような様々な理由があります。
- 実装がターゲットのタイプをサポートしていない
- このケースを処理するアダプターファクトリがアクティブでない(サービスの参照が見つからないなどの理由で)
- 内部的な条件が合わなかった
- サービスを利用できない
null ケースを適切に処理することが重要です。JSP レンダリングでは、JSP が失敗してもコンテンツが空になる場合は許容される場合があります。
キャッシュ caching
パフォーマンスを改善する目的で、各実装では obj.adaptTo()
呼び出しから返されたオブジェクトを自由にキャッシュできます。obj
が同じであれば、返されるオブジェクトも同じです。
このキャッシュ処理は、すべての AdapterFactory
ベースのケースで実行されます。
ただし、一般的なルールはなく、オブジェクトは新規インスタンスでも既存のインスタンスでもかまいません。したがって、いずれの動作にも依存することはできません。重要なのは、特に AdapterFactory
内部において、このシナリオでオブジェクトが再利用可能であるということです。
仕組み how-it-works
Adaptable.adaptTo()
の実装には、様々な方法があります。
-
オブジェクト自体による実装(このメソッド自体を実装して特定のオブジェクトにマッピングします)。
-
AdapterFactory
を使用。これは、任意のオブジェクトをマッピングできます。オブジェクトは、引き続き
Adaptable
インターフェイスを実装し、SlingAdaptable
を拡張する必要があります(これは、Central Adapter Manager のadaptTo
呼び出しを渡します)。これにより、
Resource
などの既存クラスのadaptTo
メカニズムにフックを組み込むことができます。 -
これら 2 つの組み合わせ。
最初のケースでは、Java™ ドキュメントにどのような adaptTo-targets
が可能であるかが記載されています。ただし、JCR ベースのリソースなどの特定のサブクラスでは、多くの場合、これは不可能です。後者の場合、AdapterFactory
の実装は通常、バンドルのプライベートクラスの一部なので、クライアント API で公開されず、Java™ ドキュメントにも表示されません。理論的には、OSGi サービスランタイムからすべての AdapterFactory
実装にアクセスし、「アダプタブル」(ソースとターゲット)の設定を調べることは可能ですが、相互にマッピングすることはできません。最終的には、これは内部ロジックに依存し、ドキュメントに記載する必要があります。従って、参照はこちらです。
参照 reference
Sling sling
Resource は次の項目に適応します。
ResourceResolver は次の項目に適応します。
SlingHttpServletRequest は次の項目に適応します。
現時点ではターゲットはありませんが、Adaptable を実装し、カスタムの AdapterFactory 内でソースとして使用することは可能です。
SlingHttpServletResponse は次の項目に適応します。
WCM wcm
Page は次の項目に適応します。
Component は次の項目に適応します。
Template は次の項目に適応します。
セキュリティ security
Authorizable、**User および Group は以下に適応します。
DAM dam
Asset は次の項目に適応します。
タグ付け tagging
Tag は次の項目に適応します。
その他 other
さらに、Sling、JCR、OCM では、カスタム OCM(オブジェクトとコンテンツのマッピング)オブジェクト用の [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
も提供しています。