ContentsとSearch->Helpを通して利用できます。特定の拡張関係において、コールバックの役割を担うオブジェクトは、(プラグインではなく)プレーンな従来のJavaオブジェクトです。このオブジェクトは、拡張ポイント契約で指定された特定のイベントがホスト・プラグインで認識されると、ホスト・プラグインから呼び出されます。コールバック・オブジェクトのインターフェイスはホスト・プラグインで提供され、拡張ポイントのドキュメント内で文書化されます。コールバック・オブジェクトは、通常、独自の拡張機能に固有のカスタム・クラスとして実装され、エクステンダー・プラグインの作成者が用意します。エクステンダー・プラグイン内に実装されるコールバック・オブジェクトは、通常、ホスト・プラグインとともにパッケージ化されるコールバック・インターフェイスを参照するため、エクステンダー・プラグインは、普通、ホスト・プラグインにも依存します。各コールバック・オブジェクトは、拡張機能内で独自の役割を果たします。role)と呼ぶことにします。コールバックの役割は、拡張機能のXML定義の中で子要素または子孫要素を使って定義されます。actionSets拡張ポイントは、actionと呼ばれる子孫要素を使ってコールバックの役割を定義します。複数のコールバック・オブジェクトが、actionSets拡張機能の中でこの役割を担うことがあり、各コールバック・オブジェクトが独自のworkbenchメニューやボタンを提供します。コールバック・オブジェクトのカスタム実装が必要なときは、通常、対応する拡張ポイントのXMLスキーマに、カスタム・コールバックを実装するクラスの完全修飾名を指定する属性を追加します。)で例示されているように、ヘルプUIプラグインでは、actionクラスを指定するXML属性の名前は「class」です。エクステンダー・プラグインは、必要な独自のコールバック・オブジェクトを定義し、そのカスタム実装クラスを宣言しますが、コールバック・オブジェクトが作成されるのは、ホスト・プラグインで特定のアクションが実行されたときだけです(一般に拡張機能のための一部のアクションが実行されて、コールバック・オブジェクトがはじめて必要になるときだけです)。)で、workbenchのSearch->Helpメニューに対するactionコールバック・クラスは、エクステンダー・プラグインorg.eclipse.help.uiでOpenHelpSearchPageAction(org.eclipse.help.ui.internalパッケージにあります)として指定され、関連するコールバック・インスタンスは、ホストプラグインorg.eclipse.uiで作成されます。この場合、コールバック・インスタンスは、Search->Helpメニューがはじめて起動されたときに作成されます。エクステンダー・プラグインの拡張機能の設計者は、拡張機能におけるコールバックの役割について理解し、このような役割を果たす具体的なコールバック・オブジェクトを供給する必要があります。コールバックの役割は、拡張ポイントに関連するXMLスキーマ内で独自の要素として定義され(第2.3.3節を参照)、XMLスキーマのドキュメントに記述されます。ドキュメントは、コールバック・オブジェクトが各役割を果たすのに必要なインターフェイスの記述を含んでいる必要があります。以前に紹介したactionSetsリファレンス・ページには、メニュー項目のアクションに対するコールバック・インターフェイスは、org.eclipse.ui.IWorkbenchWindowActionDelegateであることが記述されています。そのため、ヘルプ・システムのメニュー・アクション・ハンドラーは、このインターフェイスを実装する必要があります。このインターフェイスで実際にメニュー・アクションを実行するメソッドは、以下のように宣言されています。インターフェイスの実装を与えて、その中のrunメソッドがサービスを実施します。実装クラスの完全修飾名は、メニューのコールバック・クラスとしてサービスを提供するプラグインのマニフェスト・ファイルに追加されます。独自ではないサービスを提供するオブジェクト拡張機能定義で使用されるすべてのXML要素が、カスタム・コールバックの役割に対応しているわけではありません。一部の要素は、単に説明のためのものであり、また対応するUI要素を形成したり、拡張機能の一部を表現するカスタムでない内部のホスト・オブジェクトを作成するために、ホスト・プラグインに特定のパラメーターを与えることがあります。例にあるactionSet要素は、それ自体では(子要素は別にして)カスタム・コールバック・オブジェクトを定義しませんが、このような要素によって、内部オブジェクトが、アクション・セットを表現するためにorg.eclipse.uiプラグイン内で作成されます。同様に、actionSets拡張ポイントを使えば、actionSetのmenu要素を通して、新しいトップレベルのworkbenchメニューを宣言できます。トップレベル・メニューに関連するアクションは、「下位レベルのメニュー項目リストを表示する」など汎用的なので、エクステンダー・プラグインが独自のコールバック・オブジェクトをトップレベル・メニューに関連付ける必要はありません。UIオブジェクトによって記述されます。拡張ポイントのユーザーは、ホスト・プラグインが供給するこのような独自でない内部オブジェクトに関心をもつ必要はありません。ホスト・プラグインの設計者は、このような仕組みは複雑な拡張構造を設計する際に柔軟であることを理解する必要があります。拡張構造の一部は、拡張機能で提供されるコールバックとして公開されます。他の部分は、ホスト・プラグインのコード内に汎用的に組み込まれ、拡張機能の対応するXML属性を通してパラメーター化できます。プラグイン・オブジェクトと拡張機能オブジェクトの関係Eclipseでは、拡張機能の動作原理は非常に汎用的な概念で、汎用性の全容を理解するのに、プラグイン・オブジェクト、拡張ポイント、およびコールバック・オブジェクトの間に存在する関係のタイプを要約することは、役に立ちます。複数の拡張ポイントがホスト・プラグイン内に存在することがあります。プラグインは拡張ポイントを公開してホスト・プラグインとして動作し、同時にプラグインを拡張してエクステンダー・プラグインとして動作することがあります。複数のプラグインが特定の拡張ポイントを拡張することがあります。特定のプラグインが特定の拡張ポイントを複数回、拡張することがあります。エクステンダー・プラグインが異なるホスト・プラグインの異なる拡張機能を含むことがあります。特定のプラグインの特定の拡張機能によって、拡張ポイントに対する拡張機能の単一の動作が複数のコールバック・オブジェクトを作成することがあります。プラグインは自己の拡張ポイントに対して拡張機能を定義できます。自分自身を拡張するという考え方は、最初は奇妙に思えるかもしれません。このプラグインは、自己の拡張ポイントを拡張して、自己のUIに、たとえばエディターなどのさまざまな機能を追加します。拡張ポイント・スキーマ独自の拡張機能は、エクステンダー・プラグインでXML構成要素を使って定義します。構成要素によって、拡張機能のコールバック・オブジェクトをインスタンス化し、初期化するのに必要な情報が与えられます。ホスト・プラグインのインターフェイスと動作をカスタマイズするのに必要な情報も提供されます。ホスト・プラグインの設計者が拡張ポイントを作成する際には、プラグイン・マニフェスト・ファイル内で拡張ポイントを宣言することに加え、拡張ポイントへの拡張機能に対して構成上のシンタックスを定義する責任も負っています。このシンタックスはXMLスキーマで定義され、actionSets.exsdのように拡張子が.exsdのファイルに格納されます。スキーマ定義は、ホスト・プラグインのドキュメントの一部になります。(Eclipseには、XMLスキーマ・エディターとドキュメント作成に利用できるフォーマッターが用意されています)拡張ポイント・スキーマを利用することで、エクステンダー・プラグインの設計者は、拡張機能をパラメーター化する方法を知ることができます(Eclipseには、拡張しようとしている拡張ポイントのXMLスキーマを利用する拡張機能用の構成エディターも用意されています)。platformプラグインの拡張ポイント・スキーマにざっと目を通せば、拡張ポイント・スキーマの構造と内容が理解できます。これらのスキーマは、各Eclipseをインストールしたフォルダーの下にあるplugins/org.eclipse.platform.source_<ver>/src(<ver>はEclipseのバージョンです)で利用できます。特定のplatformプラグインの拡張ポイント・スキーマは、このフォルダーの下の<plugin>_<plugin_ver>/schemaフォルダーにあります。<plugin>はプラグインの識別子で、<plugin_ver>はプラグインのバージョンです。2.1の場合、actionSets拡張ポイントのスキーマactionSets.exsdは、platform.sourceフォルダーの下のorg.eclipse.ui_2.1.0/schemaフォルダーにあります。actionSets.exsdのかなり省略したバージョンを、以下に示します。拡張ポイント・スキーマ定義(.exsdファイル)スキーマは、いくつかの属性と連続するactionSetを含む要素として、actionSets拡張機能を定義しています。actionSetは、いくつかの属性と連続するmenuとactionを含む要素として定義されています。このファイルの完全バージョンでは、人間が読めるdocumentation要素を使って各属性に注釈が施されています。拡張ポイント・スキーマのdocumentation要素は、拡張ポイントに対するHTMLリファレンス・ページ(たとえば、この記事で以前に触れたactionSetsリファレンス・ページ)を生成するのに使用されます。APIリファレンス・ページがjavadocによって生成されるのと同じ方法です。このようなリファレンス・ページは、ホスト・プラグインのドキュメントの一部として利用され、workbenchのヘルプ・システムに統合されます。リファレンス・ページは、新規機能を拡張ポイントに組み込むために必要な2つの作業をサポートします。エクステンダー・プラグインのマニフェスト・ファイル内で拡張機能を構成する。リファレンス・ページには、拡張機能に要求されるXMLの構成上のシンタックスが明記されています。拡張ポイントのコールバック・オブジェクトに対してカスタム実装を用意する。リファレンス・ページには、各コールバックの役割に対してホスト・プラグインが要求するコールバック・インターフェイスを文書化したAPIセクションがあります。拡張ポイント・スキーマ定義に何を加えるかは、ホスト・プラグインの設計者次第です。ANYとして定義されています。その定義は一般的すぎます。extensionの仕様は、常に、要素の(可能な限り退化する)シーケンスです。member)と呼ぶことにします。actionSets拡張機能は、actionSetメンバーのシーケンスです。拡張機能メンバーは同じ要素タイプをもちます。シーケンスは同種のメンバーのリストを表わしています。XMLでは、シーケンス内の各タイプの要素の数は、要素の定義内でminOccurs属性とmaxOccurs属性を使って制限されます。)でこの用法を示します。ここでは、actionSets拡張機能は、少なくとも1つの、さもなければ無制限の数のactionSet要素を含むことができると指定されています。拡張ポイントが同種のメンバーのシーケンスを定義し、拡張機能が複数のメンバーをもてるとき、拡張ポイントには複数形の名前が割り当てられます。このような拡張ポイントと拡張機能を、複数形式(plural-form)と呼ぶことにします。通常、複数形式は、複数の単独メンバーからなる拡張機能を表現するための略称として使われます。element)の概念と対照をなします。構成要素は、拡張機能のXML仕様の中で任意の要素(トップレベルの要素または下位レベルの子孫要素)として定義されています。両方の用語は、ここではXMLの要素自体と、その構文解析されたプログラム表現に対して使用します。第2節でEclipse拡張モデルを高レベルで示し、拡張機能とそのコールバック・オブジェクトの宣言的仕様を紹介しました。本節では、拡張ポイントの契約下でホスト・プラグインの責務をサポートするために、このような宣言をプログラムでどのように処理するのかを説明します。ホスト・プラグインの設計者が定義しようとする各拡張ポイントに対して記述する必要があるコードを考えます。org.eclipse.uiプラグインとactionSets拡張ポイントを、再び取り上げます。このプラグインがアクティブになると、このプラグインを拡張するすべてのプラグインにある拡張機能宣言を処理する必要があります。そのため、UIはメニューとボタン、および対応するメニューとボタンのイベントが発生したときに呼び出すコールバック・オブジェクトの作成方法を知っています。platformで用意されているAPI呼び出しを示します。これらのAPI呼び出しを使って拡張機能を処理するために、プラグインの開発者が使用する慣用句を例示します。特定の拡張ポイントに対して拡張機能宣言をどのように処理するのでしょうか。一般に、拡張機能はまったく自由に構成できます。この構成についての知識をもつシステムの一部がホスト・プラグインであり、その設計時に拡張ポイントのスキーマ定義が作成されます。UIヘルプ・プラグインorg.eclipse.help.uiにあるactionSets拡張機能の処理方法についての知識は、actionSets拡張ポイントを定義しているプラグイン、すなわちorg.eclipse.uiプラグインに備わっています。runtimeから、拡張機能のリストと各拡張機能に対して拡張機能メンバーの構文解析されたバージョンを取得する必要があります。プラグイン・レジストリーAPIが、すべての利用可能なプラグイン仕様の構文解析された表現へのプログラムからのアクセスを提供することを思い出してください。このAPIは、プラグイン、プラグイン・コンポーネント、およびプラグイン間の関係に関する情報を取得するためのメソッドを提供しています。レジストリーAPIの構成要素(IConfigurationElementインターフェイス)は、エクステンダー・プラグインのマニフェスト・ファイル内にある拡張機能要素の構文解析されたバージョンを表現します。以下のサンプルコードでは、拡張ポイントに対する全拡張機能の全メンバーに繰り返しアクセスするためのプラグイン・レジストリーAPIの使用方法を示します。