他のプラグインが、使用中のプラグインの機能性を拡張またはカスタマイズできるようにしたい場合は、拡張ポイントを定義する必要があります。 拡張の場合、拡張ポイントを定義する最初のステップは、使用中のプラグインの plugin.xml ファイルにマークアップを追加することです。 以下に例を示します。
<?xml version="1.0" ?> <plugin name="Simple Extension Point Plugin" id="org.eclipse.sample" version="1.0"> <runtime> <library name="extpt.jar" /> </runtime> <extension-point name="Sample Extension Point" id="sampleExtensionPoint"/> </plugin>
独自の拡張ポイントを定義する作業は以上ですべてです。 この拡張ポイントに接続する拡張の構造は、プラットフォームでは解釈されませんが、拡張ポイント・プロバイダーによって定義されたスキーマに従います。 唯一の制約事項は、拡張マークアップが有効な XML でなければならない点です。 拡張ポイントを定義したら、ランタイムにプラットフォームのプラグイン・レジストリーを照会して、存在する拡張を照会および処理できます。 実行時には、拡張が IExtension オブジェクトとして明示されます。 さらに拡張は、拡張マークアップ内の各エレメントごとに、IConfigurationElement オブジェクトのツリーで構成されます。 以下のコードの断片は、上記で定義した拡張ポイントに関連付けられた拡張のプラグイン・レジストリーを照会します。
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); if (point != null) { IExtension[] extensions = point.getExtensions(); System.out.println("Found " + extensions.length + " extensions"); }
単純なケースでは、拡張ポイントとその拡張の唯一の対話が、拡張マークアップに含まれています。 拡張は、拡張マークアップの XML 内に直接データや設定を提供することができ、拡張ポイントのプラグインはその情報を読み取って処理し、 カスタマイズされた動作を提供します。
さらに高度な拡張ポイントを使うと、実行時に、拡張によって定義されたオブジェクトと対話を行うことができます。 ここでは、拡張ポイントを定義するプラグインが、一般的には拡張内のクラスとパッケージの名前を認識しないため、インターフェースを定義して、必要とするクラス構造を記述します。 これで、IExecutableExtension を使用して、拡張のプラグイン内のクラスをインスタンス化でき、実行時にオブジェクトと対話するためのインターフェースを使用できます。
例を示すため、plugin.xml ファイルからの以下のコードの断片は、事前に定義されていたサンプルの拡張ポイントに フックを挿入する拡張を定義しています。
<extension name="Sample Extension" id="myExtension" point="org.eclipse.sample.sampleExtensionPoint"> <someObject> <run class="org.eclipse.examples.SomeClass"/> </someObject> </extension>
この拡張には、実行可能な拡張用のマークアップが組み込まれており、これにはインスタンス化されるクラスの名前が含まれています。 このクラスは、拡張ポイントを定義したプラグインによって定義されたインターフェースに準拠している必要があります。 上で説明したように、この例のタグの名前 ("someObject" および "run") は任意です。 これらのタグは、拡張ポイント・スキーマによって定義されます。
この例の場合は、実行可能拡張のインターフェースに ISomeInterface という名前を付けます。 拡張ポイントのプラグイン内の以下のコードの断片は、プラグイン・レジストリーを照会し、拡張ポイント "sampleExtensionPoint" のすべての実行可能拡張をインスタンス化します。
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); IExtension[] extensions = point.getExtensions(); for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { if ("someObject".equals(elements[j].getName())) { ISomeInterface object = (ISomeInterface)elements[j].createExecutableExtension("run"); System.out.println("Found an executable extension: " + object); } } }
これで終了です。詳細については、org.eclipse.core.runtimeパッケージについて Javadoc を参照するか、または『README ツール』に定義されている拡張ポイントを参照してください (インストール手順については『Examples Guide』を参照してください)。 参照するために最も良い例は、Eclipse プラットフォームそのものによって定義されている拡張ポイントです。