現在表示中:

Sling は、Adaptable インターフェイスを実装するオブジェクトを簡単に変換するための Adapter パターンを提供します。このインターフェイスは、汎用の adaptTo() メソッドを提供しており、このメソッドによってオブジェクトは引数として渡されるクラス型に変換されます。

例えば、次のように実行するだけで、Resource オブジェクトを対応する Node オブジェクトに変換できます。

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

ユースケース

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

  • 実装用のオブジェクトの取得。
    例えば、汎用の Resource インターフェイスの JCR ベース実装では、基盤の JCR Node にアクセスできます。
  • 内部的なコンテキストオブジェクトを渡す必要があるオブジェクトのショートカット作成。
    例えば、JCR ベースの ResourceResolver では、要求の JCR Session への参照を保持しています。この JCR Session は、その要求セッションに基づいて動作する多くのオブジェクト(PageManagerUserManager など)を取得するために必要になります。
  • サービスへのショートカット。
    稀なケース - sling.getService() も簡単に使用できます。

戻り値 Null

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

これには様々な理由がありますが、その一部は次のとおりです。

  • 実装がターゲットタイプをサポートしていない
  • このケースを処理するアダプターファクトリがアクティブでない(サービスの参照が見つからないなどの理由で)
  • 内部的な条件が合わなかった
  • サービスを利用できない

null のケースを問題なく処理することが重要です。JSP レンダリングでは、JSP の問題によってコンテンツの一部が空になる場合に、その問題が受容されることもあります。

キャッシュ

パフォーマンスを改善する目的で、各実装では obj.adaptTo() 呼び出しから返されたオブジェクトを自由にキャッシュできます。obj が同じであれば、返されるオブジェクトも同じです。

このキャッシュ処理は、すべての AdapterFactory ベースのケースで実行されます。

ただし、汎用的なルールは存在せず、オブジェクトが新しいインスタンスである場合も既存のインスタンスである場合もあります。したがって、いずれの動作にも依存することはできません。重要なのは、特に AdapterFactory 内部において、このシナリオでオブジェクトが再利用可能であるということです。

仕組み

Adaptable.adaptTo() の実装には、様々な方法があります。

  • オブジェクト自体による実装(このメソッド自体を実装して特定のオブジェクトにマッピングします)。
  • 任意のオブジェクトをマッピングできる AdapterFactory による実装。
    オブジェクトでは Adaptable インターフェイスを実装して、SlingAdaptable を拡張する必要があります(SlingAdaptable では adaptTo 呼び出しを中央のアダプターマネージャーに渡します)。
    これにより、既存のクラス(Resource など)の adaptTo メカニズムにフックすることができます。
  • これら 2 つの組み合わせ。

1 つ目のケースでは、、adaptTo-targets で実行できることを Javadoc に記載できます。ただし、JCR ベースの Resource などの特定のサブクラスでは、Javadoc への記載ができないこともよくあります。後者のケースでは、AdapterFactory の実装は、通常、バンドルのプライベートクラスに含まれているので、クライアント API では公開されず、Javadoc にも記載されません。理論的には、、OSGi サービスランタイムからすべての AdapterFactory 実装にアクセスして「Adaptable」の(ソースおよびターゲット)設定を探すことはできますが、設定を相互にマッピングすることはできません。最終的に、内部的なロジックに依存するので、このロジックをドキュメントで明示する必要があります。その目的で以下のリファレンスを示します。

リファレンス

Sling

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

Node このリソースが JCR ノードベースのリソースまたはノードを参照する JCR プロパティの場合。
Property このリソースが JCR プロパティベースのリソースである場合。
Item このリソースが JCR ベースのリソース(ノードまたはプロパティ)の場合。
Map このリソースが JCR ノードベースのリソース(または値マップをサポートするその他のリソース)の場合、プロパティのマップを返します。
ValueMap このリソースが JCR ノードベースのリソース(または値マップをサポートするその他のリソース)の場合、使いやすいプロパティのマップを返します。
ResourceUtil.getValueMap(Resource) を使用してより簡単に実現することもできます(null のケースを処理するなど)。
InheritanceValueMap ValueMap の拡張。プロパティを探すときにリソースの階層を考慮することができます。
PersistableValueMap このリソースが JCR ノードベースのリソースであり、ユーザーがそのノードのプロパティを変更する権限を持っている場合。
注意:複数の永続化可能マップでは値は共有されません。
InputStream 「ファイル」リソースのバイナリコンテンツ(このリソースが JCR ノードベースのリソースでありノードタイプが nt:file または nt:resource の場合。このリソースがバンドルリソースの場合。このリソースがファイルシステムリソースの場合はファイルコンテンツ)
またはバイナリ JCR プロパティリソースを返します。
URL リソースの URL を返します(このリソースが JCR ノードベースのリソースの場合は、このノードのリポジトリ URL。このリソースがバンドルリソースの場合は JAR バンドル URL。このリソースがファイルシステムリソースの場合はファイル URL)。
File このリソースがファイルシステムリソースである場合。
SlingScript このリソースが、Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)の場合。
Servlet このリソースが、Sling によってスクリプトエンジンが登録されているスクリプト(JSP ファイルなど)である場合、またはこのリソースがサーブレットリソースである場合。
Authorizable
(Jackrabbit)
このリソースが認証可能なリソースである場合(
/system/userManager 以下にある、org.apache.sling.jackrabbit.usermanager 内の AuthorizableResourceProvider によるリソース)。
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、通常は
/etc/designs 以下)である場合。
Template このリソースが cq:Template ノードリソースである場合。
Blueprint このリソースが cq:Page ノードリソースである場合(今後のリソースで、より具体的なチェックが可能になります)。
Asset このリソースが dam:Asset ノードリソースである場合。
Rendition このリソースが dam:Asset レンディション(dam:Assert の rendition フォルダー以下にある nt:file)である場合。
Tag このリソースが cq:Tag ノードリソースである場合。
Preferences このリソースが、有効なユーザーまたはグループの cq:Preferences ノードリソースである場合。
Profile このリソースが、ユーザーまたはグループノードの下のプロファイル(例:
cq/security/components/profile)である場合。
UserManager このリソースが JCR ベースのリソースであり、ユーザーが UserManager へのアクセス権限を持っている場合の、JCR セッションに基づいたもの。
Authorizable
(cq-security)
このリソースが認証可能なホームノードである場合。
User
(cq-security)
このリソースがユーザーホームノードである場合。
PrivilegeManager  
SimpleSearch このリソースが JCR ベースのリソースである場合、このリソース以下で検索します(または setSearchIn() を使用します)。
WorkflowStatus 特定のページまたはワークフローのペイロードノード用のワークフローステータス。
ReplicationStatus 特定のリソースまたはその jcr:content サブノード(最初にチェックされたもの)のレプリケーションステータス。
ConnectorResource このリソースが JCR ノードベースのリソースである場合、特定のタイプに対する適応後のコネクタリソースを返します。
Config このリソースが cq:ContentSyncConfig ノードリソースである場合。
ConfigEntry このリソースが cq:ContentSyncConfig ノードリソース以下にある場合。

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

Session このリソースリゾルバーが JCR ベースのリソースリゾルバー(デフォルト)である場合の、要求の JCR セッション。
PageManager  
ComponentManager  
Designer  
AssetManager このリソースリゾルバーが JCR ベースのリソースリゾルバーである場合の、JCR セッションに基づいたもの。
TagManager このリソースリゾルバーが JCR ベースのリソースリゾルバーである場合の、JCR セッションに基づいたもの。
UserManager このリソースリゾルバーが JCR ベースのリソースリゾルバーで、ユーザーが UserManager へのアクセス権を持っている場合の、JCR セッションに基づいたもの。
Authorizable  現在のユーザー。
User
現在のユーザー。
PrivilegeManager  
Preferences 現在のユーザーの設定(このリソースリゾルバーが JCR ベースのリソースリゾルバーである場合の、JCR セッションに基づくもの)。
PreferencesService  
PinManager  
QueryBuilder  
Externalizer 要求オブジェクトがない場合でも、絶対 URL を外部化するためのもの。

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

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

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

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

WCM

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

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

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

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

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

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

セキュリティ

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

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

DAM

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

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

タグ付け

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

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

その他

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

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー