はっきり言いましょう。これまで、Eclipse の中で GEF (Graphical Editor Framework)を使ってグラフィカル・エディターを作成することは、動作が遅くて、苦しいものでした。複雑なフレームワークを理解しなくてはならず、コードは極めて冗長になりがちでした。とは言っても、GEFはモデルに無関係なため、グラフィカル・エディターを作成するためには素晴らしいフレームワークであることは事実です。しかしその一方、モデルに無関係であることによって、特有の問題も起きてきます。
GEF では、MVC (Model-View-Controller) の精神に従い、ユーザー独自のモデルを持ち込むことができます。GEF の初期には、ほとんどの人はカスタム・モデルを使っていました (POJO (Plain Old Java™ Object) のことを考えてみてください)。カスタム・モデルでの問題は、自分のモデルをサポートするために、一般的なコード (シリアルライゼーションや、モデルの変化をリッスンする機能など) まで書く羽目になることです。
GEF でモデルを使うための次の論理的なステップは、EMF (Eclipse Modeling Framework) を使うことでした。EMF は何も手を加えなくても、様々なフォーマットにモデルをシリアライズするための機構や、モデル変化をリッスンする機能など、すべてを持っています。
しかし、GEF フレームワークに EMF モデルを統合するには技術的な困難 (コマンド・スタックが異なるなど) があり、そのため GEF ベースのエディターへの EMF モデルの採用が遅れていました。そして結局、これらに対する欲求不満から、そしてグラフィカル・エディターを迅速に生成したいという要求から、GMF プロジェクトが生まれました。GMF と同様に、EMF も EMF モデルのための基本的なエディターを生成します。
私達の冒険の第 1 歩は、作業の対象となる EMF モデルを定義することです。私の目標は、単にモデルの定義プロセスを示すことであり、EMF の持つモデル操作機能の詳細を説明することではありません。この例で使う例は、単純な形状モデルです。まず、このモデルがどのように見えるのかを視覚化する図を示すことにしましょう。
図 1. 視覚化された形状モデル
この図からもわかるように、それぞれがどのように動作するのかの理解を助ける上で、モデルは非常に単純な方法なのです。モデルは、形状や接続、そして形状図といった概念を持っています。
EMF では、複数の方法でモデルを定義することができます。私は、単純であるという理由で、注釈付きの Java 技術を使うことにしました。下記のコード・リストは、EMF を使ったモデル定義の方法を示しています。最初のモデル・オブジェクトは、名前属性、ソース、そして (Connection型の) ターゲット接続を持つ形状です。これは抽象 EMF クラスであることに注意してください。
リスト 1. Shape.java
/**
* @model abstract="true"
*/
public interface Shape {
/**
* @model
*/
String getName();
/**
* @model type="com.ibm.model.shapes.model.Connection" containment="true"
*/
List getSourceConnections();
/**
* @model type="com.ibm.model.shapes.model.Connection"
*/
List getTargetConnections();
}
|
次に、すべての形状のリストを持つ形状図を定義します。
リスト 2. ShapesDiagram.java
/**
* @model
*/
public interface ShapesDiagram {
/**
* @model type="com.ibm.model.shapes.model.Shape" containment="true"
*/
List getShapes();
} |
次に、このモデルを少し具体的なものにするため、ある特別な形状を定義します。
リスト 3. RectangularShape.java
/**
* @model
*/
public interface RectangularShape extends Shape {}
|
リスト 4. EllipticalShape.java
/**
* @model
*/
public interface EllipticalShape extends Shape {}
|
最後に、少し接続の概念も持てるとよいので、実際に形状同士を接続します。
リスト 5.
Connection.java
/**
* @model
*/
public interface Connection {
/** @model */
Shape getSource();
/** @model */
Shape getTarget();
} |
Java プログラミング言語でモデルを定義したら、新しい EMF genmodel を、File > New > Eclipse Modeling Framework > EMF Model を使って定義します (図 2)。注意: もし EMF プロジェクトがない場合には、まずプロジェクトを作成します。
図 2. EMF 注釈の付いた Java インポーター
EMF genmodel を作成したら、ファイルの上で右クリックし、Model コンポーネントと Edit コンポーネントを生成します (単純に Generate All を選択すれば簡単です)。
GMF では、グラフィカル・エディターを生成するために、一連のモデルを作成する必要があります。図 3 は、こうしたモデルの作成プロセスを示しています。最初に作るべきモデルは、生成されるエディターの視覚面を定義する、グラフィック定義です。次はエディター・パレットやメニューなどに関連したもので構成される、ツール定義です。そして必要なモデルの最後は、マッピング定義です。このモデルは、(ご想像どおり) ビジネス・ロジック (EMF 形状モデル) と視覚モデル (グラフィック定義とツール定義) との間のマッピングを定義します。
図 3. GMF の概要 (GMF の wiki より)
GMF には、GMF ダッシュボードという、素晴らしいユーティリティーがあります(Window > Show View > Other > GMF Dashboard)。ダッシュボードを使うことによって、グラフィカル・エディターの生成プロセスが非常に容易になります。この段階で、既にドメイン・モデルとドメインgenmodel が選択されているはずです。
図 4. GMF ダッシュボード
最初に作るモデルは、グラフィック定義モデルです (ダッシュボードの Graphical Def Model の下にある create ハイパーリンクをクリックします)。モデル・オブジェクトとして、Canvas を選択します。このモデルは下記の手順で簡単に作ることができます。
- 形状図上に表示したい図形を作成します。このためには、エディターに新しいFigure Gallery エントリーを作成し、様々な図形を作成します。
- 形状図上に見える予定のノード (四角い形状と楕円の形状) を作成します。
- 形状図上での接続を作成します。
- 各ノードが figure gallery で作成された図形と一致することを確認します。
注意: この作業がうまくいかない場合は、すべてのモデルが既に作られた、サンプルのプラグインをダウンロードすることができます。
図 5. GMF のグラフ・モデル
このステップでは、ツール定義モデルを定義する必要があります。このモデルを使うと、情報風のパレットと、グラフィカル・エディター用のメニューを定義することができます。ツール定義モデルを定義するには、GMFのダッシュボードを開き、create をクリックします。私達の単純なモデルでは、単にパレットと、モデル作成を補助する作成ツールを定義するだけです(図 6)。
図 6. GMF ツール・モデル
マッピング定義モデルでは、すべてのものが一緒にまとまります。このモデルでは、視覚(グラフ) モデルをビジネス・ロジック (ドメイン・モデル) にマップします。GMFには、マッピング定義の作成に役立つ、よくできたウィザード・セットがあります。これを呼び出すには、File > New > Graphical Modeling Framework > Guide GMFMap Creation を使います。最初のステップは、すべての GMF モデルを選択することです (図7) 。
図 7. GMFMap ガイド (ウィザード 1)
次に、このインテリジェントなウィザードは、形状図のルート要素としてどのモデル要素を使うのか、を選択するように要求してきます。この場合は、ShapesDiagram モデル要素です。
図 8. GMFMap ガイド (ウィザード 2)
最後に、GMF は、ちょっとした魔術を披露してくれます。どのモデル要素をどの視覚要素にマップすべきかを判断してくれるのです。
図 9. GMFMap ガイド (ウィザード 3)
GMF が進化するにつれ、こうしたウィザードは変更されるかもしれないことに注意してください。GMF が、GMF 自体にブートストラップされるグラフィカル・エディターを使ってマッピング定義ファイル (や、他の GMF モデル) の作成を補助する、という噂があります。
このプロセス全体で最後の、そして最も楽しいステップは、グラフィカル・エディターの生成です。そのためには、マッピング定義モデルからGMFGen モデルを作成し、さらにそのためには、マッピング定義ファイルを右クリックし、Create generator model... を選択します。グラフィカル・エディターでの作業対象となるすべてのコードを含んだ、新しいプロジェクトが生成されるはずです。グラフィカル・エディターを使うためには、新しい Eclipse ランタイム・ワークベンチを起動し、File > New > Examples > Model Diagram を選択します (図 10)。
図 10. Model ウィザード
モデル・ファイルが作成されると、生成されたエディターで作業できるはずです (図 11)。悪くありませんよね。
図 11. Shapes エディター
このプロセスで生成されたエディターは、GMF の持つ機能の、ほんの一部でしかないことに注意してください。このフレームワークの高度な機能を活用すると、さらに様々な細工ができるのです。
例えば、GMF は検証機能をサポートしています。つまり、こういうことです。例えば形状モデルを、モデル要素 1 つに 1 つの接続しか許さないように制限したい場合にはどうすべきでしょう。あるいは、似た要素同士しか接続を許さない場合や、形状に使用できる名前の型をコントロールしたい場合にはどうするのでしょう。GMF には、こうした種類の検証や、他の検証も行える機能が完璧に備わっているのです。GMF は検証に関して EMFT (Eclipse Modeling Framework Technology) を利用しており、Java コードと OCL (Object Constraint Language) を使ったバリデーター定義に関するシナリオをサポートしています。GMF は、検証をパスしないファイルに対してエラー・マーカーを付けます。これは、コンパイルできない Java ファイルに対して Eclipse がすることと似ています。GMF がサポートする機能に関して詳しくは、「参考文献」を参照してください。
この記事での私の目標は、2 つありました。モデル駆動開発をサポートする Eclipse Callisto リリースの、新しくてエキサイティングな部分を示すこと、そして、たった 15 分間で Eclipse でグラフィカル・エディターを生成できる素晴らしさを示すことでした。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample plug-in | os-ecl-gmf.zip | 41KB | HTTP |
学ぶために
- Eclipse の Graphical Modeling Framework (GMF) を訪れ、GMF の全般に関して学んでください。
-
Graphical Modeling Framework wiki には、GMF の高度な機能に関するチュートリアルや豊富な情報が用意されています。
- Frederic Plante は、GMF ランタイムの高度な機能を詳述した素晴らしい記事、「Introducing the GMF Runtime」を書いています。
-
Eclipse Modeling Framework (EMF) を調べてみてください。EMF の初心者に役立つチュートリアルや記事が用意されています。
- EMF チームは、「Generating an EMF Model」という、入門者向きのチュートリアルを用意しています。
- EMF に関する決定的な資料が必要であれば、Eclipse Modeling Framework がお勧めです。
-
Eclipse Modeling Project は、Eclipse の新しい最上位レベルプロジェクトであり、一連のモデリング・フレームワークやツール、標準の実装などを1 つにまとめて提供することによって、Eclipse コミュニティーでモデルベース開発技術を推進することを目的としています。EMFプロジェクトと GMF プロジェクトは、将来このプロジェクトの下に置かれる予定です。
-
Eclipse Modeling Framework Technology (EMFT) Project は、EMF 関連の新技術を育成するための、新しい Eclipse プロジェクトです。
-
Eclipse Foundation と、そのプロジェクトの数々について学んでください。
- Eclipse プラットフォームへの素晴らしい入門記事として「Eclipse Platform入門」を読んでください。
- IBM developerWorks の Eclipse project resources を訪れ、皆さんの Eclipse スキルを磨いてください。
- developerWorks には、他にも Eclipse に関する資料が豊富に用意されています。
-
developerWorks technical events and webcasts で最新情報を入手してください。
製品や技術を入手するために
-
IBM alphaWorks の Eclipse technology downloads を調べてみてください。
- 皆さんの次期オープンソース開発プロジェクトを、IBM trial software を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
議論するために
- EMF に関する疑問を議論する場として、まず Eclipse Foundation の EMF newsgroups があげられます。
- そして Eclipse Foundation の GMF newsgroups では、GMF をさらに詳細に学ぶことができます。
-
Eclipse newsgroups には、Eclipse を利用し、拡張することに関心を持つ人達のために、様々な資料が用意されています。
-
developerWorks blogs から developerWorks のコミュニティーに加わってください

Chris AniszczykはIBM Lotusのソフトウェア技術者であり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。オープンソースの信奉者であり、現在はGentoo Linux (http://www.gentoo.org) ディストリビューションに取り組んでいます。またEMFT(Eclipse Modeling Framework Technology)プロジェクトのコミッターでもあります。