Sling は、Adaptable インターフェイスを実装するオブジェクトを簡単に変換するための Adapter パターンを提供します。このインターフェイスは、汎用の adaptTo() メソッドを提供しており、このメソッドによってオブジェクトは引数として渡されるクラス型に変換されます。
例えば、次のように実行するだけで、Resource オブジェクトを対応する Node オブジェクトに変換できます。
Node node = resource.adaptTo(Node.class);
次のようなユースケースがあります。
実装用のオブジェクトの取得
例えば、汎用の Resource
インターフェイスの JCR ベース実装では、基盤の JCR Node
にアクセスできます。
内部的なコンテキストオブジェクトを渡す必要があるオブジェクトのショートカット作成。
例えば、JCR ベースの ResourceResolver
では、要求の JCR Session
への参照を保持しています。この JCR セッションは、その要求セッションに基づいて動作する多くのオブジェクト(PageManager
や UserManager
など)を取得するために必要になります。
サービスへのショートカット。
稀なケース - sling.getService()
も簡単に使用できます。
adaptTo()
は null を返す場合があります。
これには様々な理由がありますが、その一部は次のとおりです。
null のケースを問題なく処理することが重要です。JSP レンダリングでは、JSP の問題によってコンテンツの一部が空になる場合に、その問題が受容されることもあります。
パフォーマンスを改善する目的で、各実装では obj.adaptTo()
呼び出しから返されたオブジェクトを自由にキャッシュできます。obj
が同じであれば、返されるオブジェクトも同じです。
このキャッシュ処理は、すべての AdapterFactory
ベースのケースで実行されます。
ただし、汎用的なルールは存在せず、オブジェクトが新しいインスタンスである場合も既存のインスタンスである場合もあります。したがって、いずれの動作にも依存することはできません。重要なのは、特に AdapterFactory
内部において、このシナリオでオブジェクトが再利用可能であるということです。
Adaptable.adaptTo()
の実装には、様々な方法があります。
オブジェクト自体による実装(このメソッド自体を実装して特定のオブジェクトにマッピングします)。
AdapterFactory
を使用。これは、任意のオブジェクトをマッピングできます。
オブジェクトは、引き続き Adaptable
インターフェイスを実装し、SlingAdaptable
を拡張する必要があります(これは、Central Adapter Manager の adaptTo
呼び出しを渡します)。
これにより、Resource
などの既存クラスの adaptTo
メカニズムにフックを組み込むことができます。
これら 2 つの組み合わせ。
最初の例では、javadocs に何の adaptTo-targets
が可能かが示されます。ただし、JCR ベースのリソースなどの特定のサブクラスでは、多くの場合、これは不可能です。後者の場合、AdapterFactory
の実装は通常、バンドルのプライベートクラスの一部なので、クライアント API で公開されず、Javadoc にも表示されません。理論的には、OSGi サービスランタイムからすべての AdapterFactory
実装にアクセスし、「アダプタブル」(ソースとターゲット)の設定を調べることは可能ですが、相互にマッピングすることはできません。最終的には、これは内部ロジックに依存し、ドキュメントに記載する必要があります。従って、参照はこちらです。
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 ノードベースのリソースである場合。 |
ページ | このリソースが JCR ノードベースのリソースであり、ノードが cq:Page (または cq:PseudoPage )である場合。 |
コンポーネント | このリソースが cq:Component ノードリソースである場合。 |
デザイン | このノードが設計ノード(cq:Page )である場合。 |
テンプレート | このリソースが cq:Template ノードリソースである場合。 |
ブループリント | このリソースが 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 | 現在のユーザー。 |
User |
現在のユーザー。 |
QueryBuilder | |
Externalizer | 要求オブジェクトがない場合でも、絶対 URL を外部化するためのもの。 |
SlingHttpServletRequest は次の項目に適応します。
現時点ではターゲットはありませんが、Adaptable を実装し、カスタムの AdapterFactory 内でソースとして使用することは可能です。
SlingHttpServletResponse は次の項目に適応します。
ContentHandler (XML) |
この応答が Sling リライター応答である場合。 |
Page は次の項目に適応します。
Resource |
ページのリソース。 |
LabeledResource | ラベル付きリソース(== this)。 |
Node | ページのノード。 |
... | ページのリソースが適応可能なすべての項目。 |
Component は次の項目に適応します。
Resource | コンポーネントのリソース。 |
---|---|
LabeledResource | ラベル付きリソース(== this)。 |
Node | コンポーネントのノード。 |
… | コンポーネントのリソースが適応可能なすべての項目。 |
Template は次の項目に適応します。
Resource |
テンプレートのリソース。 |
LabeledResource | ラベル付きリソース(== this)。 |
Node | このテンプレートのノード。 |
... | テンプレートのリソースが適応可能なすべての項目。 |
Authorizable、User および Group は以下に適応します。
Node | ユーザーまたはグループのホームノードを返します。 |
---|---|
ReplicationStatus | ユーザーまたはホームノードのレプリケーションステータスを返します。 |
Asset は次の項目に適応します。
Resource | アセットのリソース。 |
---|---|
Node | アセットのノード。 |
… | アセットのリソースが適応可能なすべての項目。 |
Tag は次の項目に適応します。
Resource | タグのリソース。 |
---|---|
Node | タグのノード。 |
… | タグのリソースが適応可能なすべての項目。 |
さらに、Sling、JCR、OCM では、カスタム OCM(オブジェクトとコンテンツのマッピング)オブジェクト用の [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
も提供しています。