org.eclipse.ui.elementFactories

エレメント・ファクトリーは、ワークベンチのシャットダウン時に保管されたデータから、 ワークベンチ・モデル・オブジェクトを再作成するために使用します。

エレメント・ファクトリー拡張について詳しく説明する前に、 プラグインの特定の振る舞いを共通プラットフォーム・モデル・オブジェクトへ追加するために プラットフォーム全体を通して使用される一般的な手法を検討する必要があります。

IAdaptables およびワークベンチ・アダプター

さまざまなワークベンチ・クラスを見ると、多くのワークベンチ・インターフェースが IAdaptable インターフェースを 拡張していることに気が付くでしょう。

プラグインは、アダプターを使用して特定の振る舞いをシステム内の既存のタイプへ追加します。 たとえば、リソースがラベルおよびイメージに応答して UI 内で自らを表示することができるように、 ワークベンチは振る舞いをリソースへ追加することができます。UI 特定の振る舞いを 低レベル・オブジェクトへ追加することはあまり良い設計ではありません。 では、この振る舞いをリソース・タイプへどのように追加できるのでしょうか。

プラットフォームは、特定インターフェースのインプリメンテーションのためにオブジェクトを動的に照会する技法を定義します。 プラグインは、振る舞いを既存のタイプへ追加するアダプターを登録することができます。これにより、 アプリケーション・コードは、後で、オブジェクトを特定コンテキストで使用しているときに、 そのオブジェクトの特定アダプターを照会することができます。 オブジェクトに登録されたアダプターが 1 つしかない場合は、 そのアダプターを入手し、アダプターに定義された新規振る舞いを使用することができます。

オブジェクトのアダプターを動的に照会する機能を提供することによって、 システムが進化するときにシステムの柔軟性も改善することができます。 プラットフォーム・タイプ用の新規アダプターは、元のタイプの定義を変更しなくても、 新規プラグインによって登録が可能です。このパターンでは、 特定アダプターのオブジェクトを必要とします。

//given an object o, we want to do "workbench" things with it.
if (!(o instanceof IAdaptable)) {
    return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
    return null;
// now I can treat o as an IWorkbenchAdapter
...

オブジェクトに登録されたアダプターが手元にない場合、NULL 値がアダプターとして戻されます。 クライアントは、このような事例に対処する準備を整える必要があります。これにより、 クライアントは、予期していたアダプターが登録されていない場合に、うまく対処することができます。

ワークベンチは、アダプターを使用して、 IResource など、 基本プラットフォーム・タイプから UI 情報を入手します。 これにより、UI の特定知識から基本タイプがシールドされ、ワークベンチは基本の定義を変更することなく、 インターフェースを進化させることができます。

アダプターがない場合、ワークベンチ API 内で次々に渡されるクラスは、 UI インターフェースをインプリメントしなければならないでしょう。 これにより、クラス定義が乱れ、堅固な結合が導入されます。つまり、コアと UI クラス間の循環依存が導入されます。 アダプターがある場合、各クラスは、 IAdaptable をインプリメントし、 プラグインが基本タイプの振る舞いを拡張できるようにアダプター登録を使用します。

ワークベンチ・コード全体を見ると、アダプターに対してタイプが照会される事例があることがわかります。これは、 プラットフォーム・コア・タイプについての UI 指向情報に対応する方法を知るオブジェクトを入手する目的で発生しています。

エレメント・ファクトリー

ワークベンチは、ユーザーによってシャットダウンされると、ワークベンチに表示される IAdaptable オブジェクトの 現在の状態を保管します。これは、ファイル・システム内に簡単に保管される特別形式 IMemento の オブジェクトの基本的なデータ・パラメーターを保管することによって実行されます。 また、IMemento から オブジェクトを再作成できるファクトリーの ID も保管されます。

プラットフォームが再始動すると、ワークベンチは、Memento でのファクトリー ID と関連付けられた エレメント・ファクトリーを検出します。これは、 org.eclipse.ui.elementFactories 拡張のための プラグイン登録を検査することによって、ファクトリーを検出します。

マークアップは、非常に単純です。ファクトリー ID およびファクトリーをインプリメントする対応クラスを指定するだけです。

以下のコードの断片は、ワークベンチ plugin.xml からのものです。

<extension
    point = "org.eclipse.ui.elementFactories">
    <factory id ="org.eclipse.ui.internal.model.ResourceFactory"
        class="org.eclipse.ui.internal.model.ResourceFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.model.WorkspaceFactory"
        class="org.eclipse.ui.internal.model.WorkspaceFactory">
    </factory>
    <factory id ="org.eclipse.ui.part.FileEditorInputFactory"
        class="org.eclipse.ui.part.FileEditorInputFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
        class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
    </factory>
</extension>