エレメント・ファクトリーは、ワークベンチのシャットダウン時に保管されたデータから、 ワークベンチ・モデル・オブジェクトを再作成するために使用します。
エレメント・ファクトリー拡張について詳しく説明する前に、プラグインの特定の振る舞いを共通プラットフォーム・モデル・オブジェクトに追加するため、 プラットフォーム全体を通して使用される一般的な手法を検討する必要があります。
さまざまなワークベンチ・クラスを見ると、多くのワークベンチ・インターフェースが IAdaptable インターフェースを 拡張していることに気が付くでしょう。
プラグインは、アダプターを使用して特定の振る舞いをシステム内の既存のタイプへ追加します。 例えば、ワークベンチは、表示する目的で、リソースをラベルおよびイメージに応答させることができます。 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 も保管され、データはファイル・システムに保管されます。
プラットフォームが再始動すると、ワークベンチは、IMemento のファクトリー ID と関連付けられた、エレメント・ファクトリーを検出します。 これは、 org.eclipse.ui.elementFactories 拡張のための プラグイン・レジストリーを検査することによって、ファクトリーを検出します。
マークアップは、非常に単純です。ファクトリー ID およびファクトリーを実装する対応クラスを指定するだけです。
以下のコードの断片は、ワークベンチ plugin.xml からのものです。
<extension point="org.eclipse.ui.elementFactories"> <factory class="org.eclipse.ui.internal.model.ResourceFactory" id="org.eclipse.ui.internal.model.ResourceFactory"> </factory> <factory class="org.eclipse.ui.internal.model.WorkspaceFactory" id="org.eclipse.ui.internal.model.WorkspaceFactory"> </factory> <factory class="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.ui.part.FileEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory" id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.WorkingSetFactory" id="org.eclipse.ui.internal.WorkingSetFactory"> </factory> </extension>