最終更新日: 2004 年 6 月 29 日
このチュートリアルでは、 EMF モデルを作成し、そのモデルの簡単なモデル・エディターを生成するプロセスを段階的に説明します。 このチュートリアルに従っていくと、 簡単なモデルの定義から、そのモデルの完全な機能エディターの実行までの作業を通して、 EMF がいかに簡単であるかが分かります。
生成するモデルは、UML で表すと次のようになります (このモデルの説明については 、『Eclipse モデリング・フレームワークの概説』を参照してください)。
Rational Rose モデル、または注釈付き Java インターフェースおよびクラスのいずれかの、ソースから EMF モデルを生成する方法について示します。
スクリーン・ショットは、Eclipse SDK のバージョン 3.0 および EMF の バージョン 2.0 を使用したものです。
ステップ 0: | 前提条件 |
ステップ 1: | Rose からのモデルのインポート または 注釈付き Java を使用したモデルの定義 |
ステップ 2: | EMF モデル・コードの生成 |
ステップ 3: | モデルのエディターの生成 |
ステップ 4: | 生成されたエディターの実行 |
EMF ランタイム・パッケージには、EMF 生成プログラムおよび多数の関連プラグインが含まれています。 このパッケージをインストールした後、 Eclipse 環境で、これらが使用可能であることを確認します。
上図で強調表示されていない追加 EMF プラグインは、このチュートリアルでは必要ありません。 これらは、インストールされる EMF パッケージによっては、表示されない場合もあります。
library モデルの Rose ファイルは library.mdl にあります。このファイルを ご使用のワークステーションの任意のロケーションに保管してください。
以下の操作を行い、ワークスペースに新規 EMF プロジェクトを作成します。
Rose ダイアグラムからモデルをインポートする代わりに、クラスおよび列挙型にそれぞれ対応する、library モデル内の一連の Java インターフェースおよびクラスを用いて作業を始めることができます。要求される機能を表すには、このコードが 最低限必要です。それに基づいてコア・モデルおよび生成プログラム・モデルが構成され、 続いて、これらのモデルで残りのコードを生成します。 このコードには、Ecore オブジェクトの属性および参照についてデフォルトではない値を指定するために、javadoc コメント内の「@model」タグで注釈が付けられています。
Library.java
package org.eclipse.example.library; import java.util.List; /** * @model */ public interface Library { /** * @model */ String getName(); /** * @model type="Writer" containment="true" */ List getWriters(); /** * @model type="Book" containment="true" */ List getBooks(); }
Book.java
package org.eclipse.example.library; /** * @model */ public interface Book { /** * @model */ String getTitle(); /** * @model default="100" */ int getPages(); /** * @model */ BookCategory getCategory(); /** * @model opposite="books" */ Writer getAuthor(); }
Writer.java
package org.eclipse.example.library; /** * @model */ public interface Writer { /** * @model */ String getName(); /** * @model type="Book" opposite="author" */ java.util.List getBooks(); }
BookCategory.java
package org.eclipse.example.library; /** * @model */ public class BookCategory { /** * @model name="Mystery" */ public static final int MYSTERY = 0; /** * @model name="ScienceFiction" */ public static final int SCIENCE_FICTION = 1; /** * @model name="Biography" */ public static final int BIOGRAPHY = 2; }
ワークスペースに新規 Java プロジェクトを作成します。
最初の Java インターフェースを作成します。
他に 2 つのインターフェース (Book.java およ び Writer.java) を作成して、同様に クラス (BookCategory.java) も作成する。クラスを作成する場合は、ポップアップ・メニューから、「新規/インターフェース」ではなく「新規/クラス」を選択します。
以下の操作を行って、EMF モデルを作成します。
生成プログラム・モデル genmodel は、モデルの全体を表すルート・オブジェクトを表示します。 このモデル・オブジェクトには、そのパッケージを表す子があります。 パッケージの子には分類 (クラスおよび、列挙型を含むデータ型) が表示されます。 クラスの子は、クラス属性、参照、およびオペレーションで、 列挙型の子は enum リテラルです。
ほとんどの場合、プロパティーはデフォルト値から変更する必要はありませんが、 これらのオプションは、生成されるコードにおいて多くの制御を提供することができます。 このトピックは、将来のチュートリアル資料で、より詳しく検討する予定です。 現在のところは、幾つかの異なる生成プログラム・モデル・オブジェクトを選択し、そのプロパティーを眺めてください。
生成プログラム・モデルは、コード生成を開始する場所でもあります。 モデルのオブジェクトを右クリックすることによって、そのオブジェクトのコードを生成することができます。
生成すると、クラス・インターフェースおよび enum クラスが作成されるか (モデルが Rose からインポートされた場合)、または (モデルが、注釈付き Java を使用して定義された場合)完成されます。また、パッケージそのものおよびそのファクトリーに対するインターフェースのペアが新規に作成されます。 接尾部「impl」および「util」が付いた 2 つの新規パッケージもあり、 これらには、インターフェースおよび追加ユーティリティー・クラスの実装、 および、そのモデル・プラグインの「plugin.xml」マニフェスト・ファイルが含まれます。
注釈付き Java を使用してモデルを定義した場合は、 「問題」ビューに「インポートされた java.util.List は一度も使用されていません」 という警告が表示されます。この警告は、表示されることがあらかじめ予想されているため、 引き続き次のステップに進んで構いません。
モデルを変更する場合は、再生成を行うことができ、 コードに対して行われた手動による変更と、モデルの変更はマージされます。 パッケージ、クラス、または enum オブジェクトを右クリックし、ポップアップ・メニューから 「モデル・コードの生成」を選択することによって、モデル・コードのサブセットだけを選択的に生成することもできます。
任意のモデルに対して、完全機能の Eclipse エディターを生成することもできます。 デフォルトでは、2 つのプラグインに分割されます。「edit」プラグインには、 構造化されたビューを提供してモデル・オブジェクトのコマンド・ベースの編集を実行するアダプターが含まれ、 「editor」プラグインは、エディターおよびウィザードの UI を提供します。
一般的に、モデル、編集、およびエディター・プラグインを一回のステップで生成する場合は、 ポップアップ・メニューから「すべて生成」を選択することによって実行することができます。
このコードは、生成される際に自動的にコンパイルされ、 変更が行われると再コンパイルされます。ワークベンチ設定で自動ビルドを使用不可にした場合は、 手動でコンパイルを開始することができます。
新規プラグインをテストするには、Eclipse の 2 つ目のインスタンス (ランタイム・ワークベンチと 呼ばれます) を起動する必要があります。プラグインはこのワークベンチで実行されます。
これで、「Library Model」ウィザードを使用して、モデルの新規インスタンスを作成することができます。
このエディターのルート・オブジェクトは、「My.library」リソースに対応します。 その下に、ウィザードでモデル・オブジェクトとして選択されたオブジェクトであるライブラリーが一つあります。