Eclipse GMF を 15 分で学ぶ

Eclipse 流のモデル駆動開発入門

この記事では、GMF (Graphical Modeling Framework) プロジェクトを紹介し、単純な EMF (Eclipse Modeling Framework) モデルの開発方法について説明します。そしてこのモデルを、GMF のツールを使って本格的なグラフィカル・エディターに変換します。

Chris Aniszczyk, Software Engineer, IBM

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



2006年 9月 12日

背景

はっきり言いましょう。これまで、Eclipse の中で GEF (Graphical Editor Framework)を使ってグラフィカル・エディターを作成することは、動作が遅くて、苦しいものでした。複雑なフレームワークを理解しなくてはならず、コードは極めて冗長になりがちでした。とは言っても、GEFはモデルに無関係なため、グラフィカル・エディターを作成するためには素晴らしいフレームワークであることは事実です。しかしその一方、モデルに無関係であることによって、特有の問題も起きてきます。

GMF についてのトリビア (雑学)

GMF のランタイム・コンポーネントは、IBM® が Eclipse Foundation に寄贈したものです。それまでは IBM Rational® モデリング製品でサポートされていました。

GEF では、MVC (Model-View-Controller) の精神に従い、ユーザー独自のモデルを持ち込むことができます。GEF の初期には、ほとんどの人はカスタム・モデルを使っていました (POJO (Plain Old Java™ Object) のことを考えてみてください)。カスタム・モデルでの問題は、自分のモデルをサポートするために、一般的なコード (シリアルライゼーションや、モデルの変化をリッスンする機能など) まで書く羽目になることです。

GEF でモデルを使うための次の論理的なステップは、EMF (Eclipse Modeling Framework) を使うことでした。EMF は何も手を加えなくても、様々なフォーマットにモデルをシリアライズするための機構や、モデル変化をリッスンする機能など、すべてを持っています。

EMF についてさらに知りたい場合は

もし皆さんが、自分には EMF (Eclipse Modeling Framework) に関する基本的な知識が欠けていると思った場合、あるいは EMF に関する全体的な知識を強化したいと思った場合には、素晴らしい資料がいくつかあります。1 つは本であり、もう 1 つは developerWorks に用意された一連の入門記事です。これらについて、また EMF に関する他の資料について詳しくは、「参考文献」を参照してください。

しかし、GEF フレームワークに EMF モデルを統合するには技術的な困難 (コマンド・スタックが異なるなど) があり、そのため GEF ベースのエディターへの EMF モデルの採用が遅れていました。そして結局、これらに対する欲求不満から、そしてグラフィカル・エディターを迅速に生成したいという要求から、GMF プロジェクトが生まれました。GMF と同様に、EMF も 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 注釈の付いた Java インポーター

EMF モデルを生成する

もし EMF モデルの生成がうまくいかない場合には、「Generating an EMF Model」というタイトルの素晴らしいリュートリアルが役に立つはずです。「参考文献」を参照してください。

EMF genmodel を作成したら、ファイルの上で右クリックし、Model コンポーネントと Edit コンポーネントを生成します (単純に Generate All を選択すれば簡単です)。

GMF モデルを作成する

GMF では、グラフィカル・エディターを生成するために、一連のモデルを作成する必要があります。図 3 は、こうしたモデルの作成プロセスを示しています。最初に作るべきモデルは、生成されるエディターの視覚面を定義する、グラフィック定義です。次はエディター・パレットやメニューなどに関連したもので構成される、ツール定義です。そして必要なモデルの最後は、マッピング定義です。このモデルは、(ご想像どおり) ビジネス・ロジック (EMF 形状モデル) と視覚モデル (グラフィック定義とツール定義) との間のマッピングを定義します。

図 3. GMF の概要 (GMF の wiki より)
GMF の概要

GMF には、GMF ダッシュボードという、素晴らしいユーティリティーがあります(Window > Show View > Other > GMF Dashboard)。ダッシュボードを使うことによって、グラフィカル・エディターの生成プロセスが非常に容易になります。この段階で、既にドメイン・モデルとドメインgenmodel が選択されているはずです。

図 4. GMF ダッシュボード
GMF ダッシュボード

GMF グラフィック定義モデル

GMF のcheat sheet (虎の巻)

GMF には、GMF で生成されるエディターの作成プロセスを順を追ってガイドしてくれる、素晴らしいcheat sheet があります。これを GMF ダッシュボードと一緒に使うようにお勧めします。cheatsheet を利用するには、メニュー・アイテムの Help > Cheat Sheets.... を選択します。

最初に作るモデルは、グラフィック定義モデルです (ダッシュボードの Graphical Def Model の下にある create ハイパーリンクをクリックします)。モデル・オブジェクトとして、Canvas を選択します。このモデルは下記の手順で簡単に作ることができます。

  1. 形状図上に表示したい図形を作成します。このためには、エディターに新しいFigure Gallery エントリーを作成し、様々な図形を作成します。
  2. 形状図上に見える予定のノード (四角い形状と楕円の形状) を作成します。
  3. 形状図上での接続を作成します。
  4. 各ノードが figure gallery で作成された図形と一致することを確認します。

注意: この作業がうまくいかない場合は、すべてのモデルが既に作られた、サンプルのプラグインをダウンロードすることができます。

図 5. GMF のグラフ・モデル
GMF のグラフ・モデル

GMF のツール定義モデル

このステップでは、ツール定義モデルを定義する必要があります。このモデルを使うと、情報風のパレットと、グラフィカル・エディター用のメニューを定義することができます。ツール定義モデルを定義するには、GMFのダッシュボードを開き、create をクリックします。私達の単純なモデルでは、単にパレットと、モデル作成を補助する作成ツールを定義するだけです(図 6)。

図 6. GMF ツール・モデル
GMF ツール・モデル

GMF マッピング定義モデル

マッピング定義モデルでは、すべてのものが一緒にまとまります。このモデルでは、視覚(グラフ) モデルをビジネス・ロジック (ドメイン・モデル) にマップします。GMFには、マッピング定義の作成に役立つ、よくできたウィザード・セットがあります。これを呼び出すには、File > New > Graphical Modeling Framework > Guide GMFMap Creation を使います。最初のステップは、すべての GMF モデルを選択することです (図7) 。

図 7. GMFMap ガイド (ウィザード 1)
GMFMap ガイド (ウィザード 1)

次に、このインテリジェントなウィザードは、形状図のルート要素としてどのモデル要素を使うのか、を選択するように要求してきます。この場合は、ShapesDiagram モデル要素です。

図 8. GMFMap ガイド (ウィザード 2)
GMFMap ガイド (ウィザード 2)

最後に、GMF は、ちょっとした魔術を披露してくれます。どのモデル要素をどの視覚要素にマップすべきかを判断してくれるのです。

図 9. GMFMap ガイド (ウィザード 3)
GMFMap ガイド (ウィザード 3)

GMF マッピングのカスタマイズ

GMF のマッピング定義ファイルは、基本的なエディターを使って編集することができ、より高度なカスタマイズが可能です。恐れず、いろいろ試してみてください。

GMF が進化するにつれ、こうしたウィザードは変更されるかもしれないことに注意してください。GMF が、GMF 自体にブートストラップされるグラフィカル・エディターを使ってマッピング定義ファイル (や、他の GMF モデル) の作成を補助する、という噂があります。


GMF エディターを生成する

このプロセス全体で最後の、そして最も楽しいステップは、グラフィカル・エディターの生成です。そのためには、マッピング定義モデルからGMFGen モデルを作成し、さらにそのためには、マッピング定義ファイルを右クリックし、Create generator model... を選択します。グラフィカル・エディターでの作業対象となるすべてのコードを含んだ、新しいプロジェクトが生成されるはずです。グラフィカル・エディターを使うためには、新しい Eclipse ランタイム・ワークベンチを起動し、File > New > Examples > Model Diagram を選択します (図 10)。

図 10. Model ウィザード
Model ウィザード

モデル・ファイルが作成されると、生成されたエディターで作業できるはずです (図 11)。悪くありませんよね。

図 11. Shapes エディター
Shapes エディター

GMFGen モデルのカスタマイズ

マッピング定義ファイルから得られる GMFGen モデルは、必要に応じて厳密に調整することができます。例えば GMFGen モデルは、プロパティー・ビューを使って編集が可能なプロパティーを持っています。また、生成されるコードの命名規則や、生成されるエディターに印刷機能が必要かどうか、その他数多くのカスタマイズ可能な機能をコントロールするプロパティーを持っています。こうしたオプションを試し、皆さんの必要に合わせてカスタマイズしてください。

GMF の機能

このプロセスで生成されたエディターは、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-inos-ecl-gmf.zip41KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

  • EMF に関する疑問を議論する場として、まず Eclipse Foundation の EMF newsgroups があげられます。
  • そして Eclipse Foundation の GMF newsgroups では、GMF をさらに詳細に学ぶことができます。
  • Eclipse newsgroups には、Eclipse を利用し、拡張することに関心を持つ人達のために、様々な資料が用意されています。
  • developerWorks blogs から developerWorks のコミュニティーに加わってください

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=236847
ArticleTitle=Eclipse GMF を 15 分で学ぶ
publish-date=09122006