Sling アダプターの使用 using-sling-adapters

Sling には、Adaptable インターフェイスを実装するオブジェクトを便利に変換できるアダプターパターンが用意されています。このインターフェイスは、オブジェクトを引数として渡されるクラスタイプに変換する汎用の adaptTo() メソッドを提供します。

例えば、リソースオブジェクトを対応するノードオブジェクトに変換するには、次の操作を実行します。

Node node = resource.adaptTo(Node.class);

ユースケース use-cases

次のようなユースケースがあります。

  • 実装用のオブジェクトの取得

    例えば、汎用の Resource インターフェイスの JCR ベース実装では、基盤の JCR Node にアクセスできます。

  • 内部的なコンテキストオブジェクトを渡す必要があるオブジェクトのショートカット作成。

    例えば、JCR ベースの ResourceResolver では、要求の JCR Session への参照を保持しています。この JCR セッションは、その要求セッションに基づいて動作する多くのオブジェクト(PageManagerUserManager など)を取得するために必要になります。

  • サービスへのショートカット。

    稀なケース - 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 は次の項目に適応します。

Node
このリソースが JCR ノードベースのリソースまたはノードを参照する JCR プロパティの場合。
Property
これが JCR プロパティベースのリソースの場合
Item
これが JCR ベースのリソース(ノードまたはプロパティ)の場合
Map
これが JCR ノードベースのリソース(または値マップをサポートするその他のリソース)の場合、プロパティのマップを返します。
ValueMap
このリソースが JCR ノードベースのリソース(または値マップをサポートするその他のリソース)の場合、プロパティの使用しやすいマップを返します。また、
ResourceUtil.getValueMap(Resource) を使用(null ケースを処理するなど)して達成できます。
InheritanceValueMap
ValueMap の拡張機能。プロパティを探すときにリソースの階層を考慮できるようにします
ModifiableValueMap
ValueMap の拡張機能。そのノードのプロパティを変更できるようにします
InputStream
ファイルリソースのバイナリコンテンツ(これが JCR ノードベースのリソースでありノードタイプが nt:file または nt:resource の場合。これがバンドルリソースの場合。ファイルシステムリソースの場合はファイルコンテンツ)またはバイナリ JCR プロパティリソースのデータを返します
URL
リソースの URL を返します(これが JCR ノードベースのリソースの場合は、このノードのリポジトリ URL。これがバンドルリソースの場合は JAR バンドル URL。これがファイルシステムリソースの場合はファイル URL)
File
これがファイルシステムリソースである場合
SlingScript
このリソースが、Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)の場合
Servlet
このリソースが、Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)である場合、またはこのリソースがサーブレットリソースである場合。
String
Boolean
Long
Double
Calendar
Value
String[]
Boolean[]
Long[]
Calendar[]
Value[]
これが JCR プロパティベースのリソースである(および値が適合する)場合、その値を返します。
LabeledResource
これが JCR ノードベースのリソースである場合
Page
これが JCR ノードベースのリソースであり、ノードが cq:Page(または cq:PseudoPage)である場合
Component
これが cq:Component ノードリソースである場合
Design
これがデザインノード(cq:Page)である場合
Template
これが cq:Template ノードリソースである場合
Blueprint
これが cq:Template ノードリソースである場合
Asset
これが dam:Asset ノードリソースである場合
Rendition
このリソースが dam:Asset レンディション(dam:Assert の rendition フォルダー以下にある nt:file)である場合。
タグ
これが cq:Tag ノードリソースである場合
UserManager
これが JCR ベースのリソースであり、ユーザーが UserManager へのアクセス権限を持っている場合の、JCR セッションに基づいたもの
Authorizable
Authorizable は、User と Group の共通の基本インターフェイスです
User
User は、認証して別のユーザーとして実行可能な特別な Authorizable です
SimpleSearch
これが JCR ベースのリソースである場合、このリソース以下で検索(または setSearchIn() を使用)します
WorkflowStatus
特定のページまたはワークフローのペイロードノード用のワークフローステータス
ReplicationStatus
特定のリソースまたはその jcr:content サブノード(最初にチェックされたもの)のレプリケーションステータス
ConnectorResource
これが JCR ノードベースのリソースである場合、特定のタイプに適応したのコネクタリソースを返します。
Config
これが cq:ContentSyncConfig ノードリソースである場合
ConfigEntry
これが cq:ContentSyncConfig ノードリソース以下にある場合

ResourceResolver は次の項目に適応します。

Session
これが JCR ベースのリソースリゾルバー(デフォルト)である場合の、リクエストの JCR セッション
PageManager
ComponentManager
デザイナー
AssetManager
これが JCR ベースのリソースリゾルバーである場合の、JCR セッションに基づいたもの
TagManager
これが JCR ベースのリソースリゾルバーである場合の、JCR セッションに基づいたもの
UserManager
UserManager は、認証可能なオブジェクト(ユーザーやグループ)へのアクセス権と手段を提供します。UserManager は特定のセッションにバインドされています
Authorizable
現在のユーザー
ユーザー
現在のユーザー
QueryBuilder
Externalizer
リクエストオブジェクトがない場合でも、絶対 URL を外部化する場合

SlingHttpServletRequest は次の項目に適応します。

現時点ではターゲットはありませんが、Adaptable を実装し、カスタムの AdapterFactory 内でソースとして使用することは可能です。

SlingHttpServletResponse は次の項目に適応します。

ContentHandler
(XML)
これが Sling リライター応答である場合

WCM wcm

Page は次の項目に適応します。

Resource
ページのリソース
LabeledResource
ラベル付きリソース(== this)
Node
ページのノード
...
ページのリソースが適応できるすべての項目

Component は次の項目に適応します。

Resource
コンポーネントのリソース
LabeledResource
ラベル付きリソース(== this)。
Node
コンポーネントのノード
コンポーネントのリソースが適応できるすべての項目

Template は次の項目に適応します。

Resource
テンプレートのリソース
LabeledResource
ラベル付きリソース(== this)
Node
このテンプレートのノード
...
テンプレートのリソースが適応可能なすべての項目。

セキュリティ security

Authorizable、**User および Group は以下に適応します。

Node
ユーザーまたはグループのホームノードを返します。
ReplicationStatus
ユーザーまたはホームノードのレプリケーションステータスを返します。

DAM dam

Asset は次の項目に適応します。

Resource
アセットのリソース。
Node
アセットのノード。
アセットのリソースが適応可能なすべての項目。

タグ付け tagging

Tag は次の項目に適応します。

Resource
タグのリソース。
Node
タグのノード。
タグのリソースが適応可能なすべての項目。

その他 other

さらに、Sling、JCR、OCM では、カスタム OCM(オブジェクトとコンテンツのマッピング)オブジェクト用の [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) も提供しています。

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2