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

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

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

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

ユースケース use-cases

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

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

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

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

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

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

    稀なケース - sling.getService() も簡単に使用できます。

戻り値 Null null-return-value

adaptTo() は null を返す場合があります。

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™ docs に何の adaptTo-targets が可能かが示されます。ただし、JCR ベースのリソースなどの特定のサブクラスでは、多くの場合、これは不可能です。後者の場合、AdapterFactory の実装は通常、バンドルのプライベートクラスの一部なので、クライアント API で公開されず、Java™ docs にも表示されません。理論的には、OSGi サービスランタイムからすべての AdapterFactory 実装にアクセスし、「アダプタブル」(ソースとターゲット)の設定を調べることは可能ですが、相互にマッピングすることはできません。最終的には、これは内部ロジックに依存し、ドキュメントに記載する必要があります。従って、参照はこちらです。

参照 reference

Sling sling

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

ノード
JCR ノードベースのリソースまたはノードを参照する JCR プロパティの場合
プロパティ
JCR プロパティベースのリソースである場合
項目
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)。
ファイル
ファイルシステムリソースである場合
SlingScript
リソースが Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)の場合
サーブレット
リソースが、Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)である場合、またはリソースがサーブレットリソースである場合
String
Boolean
Long
Double
Calendar
Value
String[]
Boolean[]
Long[]
Calendar[]
Value[]
リソースが JCR プロパティベースのリソースである(および値が適合する)場合、その値を返します
LabeledResource
リソースが JCR ノードベースのリソースである場合
ページ
リソースが JCR ノードベースのリソースであり、ノードが cq:Page(または cq:PseudoPage)である場合
コンポーネント
リソースが cq:Component ノードリソースである場合
デザイン
リソースがデザインノード(cq:Page)である場合
テンプレート
リソースが cq:Template ノードリソースである場合
ブループリント
リソースが cq:Template ノードリソースである場合
アセット
リソースが 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

AuthorizableUser および Group は次に適応します。

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

DAM dam

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

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

タグ付け tagging

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

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

その他 other

さらに、Sling、JCR、OCM では、カスタム OCM(AdapterFactoryObject Content Mapping)オブジェクト用の も提供しています。

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab