XML スキーマ (XSD) を使用した EMF モデルの生成
最終更新日: 2004 年 6 月 29 日
このチュートリアルでは、XML スキーマから EMF モデルを作成して、
そのモデル用の単純なモデル・エディターを生成するプロセスを段階的に説明します。
このチュートリアルに従うと、XML スキーマによる単純なモデル定義から
そのモデルの完全な機能エディターに至るまで、EMF がいかに簡単かが分かります。
スクリーン・ショットは、Eclipse SDK のバージョン 3.0 および EMF の
バージョン 2.0 を使用したものです。
このチュートリアルで使用する XML スキーマ・ファイルは、
こちら (library.xsd) にあります。後で使用するために、
このファイルをご使用のワークステーションの任意のロケーションに保管してください。
XML スキーマから Ecore への基本的なマッピング規則は、以下の通りです。
- スキーマは EPackage にマップする。別のターゲット・ネームスペースを宣言する、
組み込み済みのスキーマは、それ自身の EPackages にマップします。
- 複雑な型定義は EClass にマップする。
- 単純型定義は EDataType にマップする。
- 属性宣言またはネストされたエレメント宣言は、
その型に応じて EAttribute または EReference にマップする。
- DocumentRoot という名前の EClass は、
トップレベルのエレメント宣言または属性宣言を保持するために作成される。
モデリングの観点から見ると、XML スキーマは Ecore ほど表現力はありません。XML スキーマでは、
参照ターゲットの型を指定できず、双方向の参照を定義することもできません (ただし、EMF
の独自の方法を用いてこれらの制限を解消することが可能です)。
目次
目次
ステップ 0: 前提条件
このチュートリアルでは、EMF ランタイム・パッケージ (EMF 生成プログラムと関連プラグインを含む)
と、XML スキーマ Infoset モデル (XSD) ランタイム・パッケージの両方が必要となります。 この
XSD ランタイム・パッケージには XML スキーマの EMF モデルが用意されており、EMF
はスキーマを読み込む場合にこのモデルに依存します。手順を簡略化するために、EMF と XSD を結合した
SDK パッケージが用意されています。これらのパッケージ (複数可)
をインストールした後、Eclipse 環境で、それらのパッケージが使用可能であることを確認します。
- 「ヘルプ/Eclipse プラットフォームについて」ダイアログを表示する。

- 「プラグインの詳細」をクリックする。

- 「プラグイン ID」列見出しをクリックし、
このフィールドの順序によってプラグインを表示する。
その後、以下に強調表示されているプラグインのセットが存在していることを確認する。



上図では強調表示されていない追加 EMF プラグインおよび XSD プラグインは、
このチュートリアルでは必須ではありません。
これらは、インストールするパッケージによっては、表示されない場合もあります。
目次
ステップ 1: XML スキーマからのモデルのインポート
以下の操作を行い、ワークスペースに新規 EMF プロジェクトを作成します。
- 「ファイル/新規/プロジェクト...」ダイアログを表示する。

- 「Eclipse モデリング・フレームワーク」を展開して、「EMF プロジェクト」を選択する。「次へ」ボタンをクリックします。

- プロジェクトに、例えば「library」という名前を付ける。次に「次へ」ボタンをクリックします。

- 「XML スキーマからロード」を選択し、「次へ」ボタンをクリックする。

- 「参照」ボタンをクリックして、スキーマ・ファイルを見付ける。

- 以下のエラーが発生した場合、Eclipse を終了して XML パーサーを修正する必要が
あります。このエラーの原因は、Sun JDK の一部のバージョンで使用されている Crimson DOM
実装のバグにあります。詳細に
ついては EMF Web サイトを参照してください。

- このスキーマが調べられ、デフォルトの生成プログラム・モデル名が
提案されます。必要に応じて、エントリー・ボックスのこの名前は変更できます。また、
「Ecore マップに XML スキーマを作成」を選択して、
スキーマで使用するマッピングのモデルを生成することもできます。次に「次へ」ボタンをクリックします。

- 通常、単一のスキーマから複数のパッケージが作成されます
(スキーマに、別のターゲット名前空間を宣言する他のスキーマが含まれている場合)。EMF モデルを生成するための
対象となるパッケージ (この場合は「library」パッケージのみ) を選択します。「終了」ボタンをクリックします。

- コア・モデル (library.ecore) および生成プログラム・モデル (library.genmodel) が作成されます。
前のステップで「Ecore マップに XML スキーマを作成」にチェックマークを付けた場合、マッピング・モデル
(library.xsd2ecore) も作成されます。このモデルを開いて、Ecore
にスキーマがマップされた方法を正確に確かめることができます。生成プログラム・モデルは、
自動的にメイン・ビューに開かれます。

目次
ステップ 2: EMF モデル・コードの生成
生成プログラム・モデル genmodel は、モデルの全体を表すルート・オブジェクトを表示します。
このモデル・オブジェクトには、そのパッケージを表す子があります。
パッケージの子には分類 (クラスおよび、列挙型を含むデータ型) が表示されます。
クラスの子は、クラス属性、参照、およびオペレーションで、
列挙型の子は Enum リテラルです。
- 生成プログラム・モデルを展開して、さまざまなエレメントを表示することができます。

- 各オブジェクトには関連するプロパティーがあります。「プロパティー」ビューが
まだ表示されていない場合は、「Library」モデル・オブジェクトを右マウス・ボタンでクリックして、
ポップアップ・メニューから「「プロパティー」ビューの表示」を選択します。

- これらのプロパティーは、コード生成プログラムの振る舞いを制御します。

ほとんどの場合、プロパティーはデフォルト値から変更する必要はありませんが、
これらのオプションは、生成されるコードにおいて多くの制御を提供することができます。
現在のところは、幾つかの異なる生成プログラム・モデル・オブジェクトを選択し、そのプロパティーを眺めてください。
生成プログラム・モデルは、コード生成を開始する場所でもあります。
モデルのオブジェクトを右クリックすることによって、そのオブジェクトのコードを生成することができます。
- 「Library」モデル・オブジェクトを右マウス・ボタンでクリックして、
ポップアップ・メニューから「モデル・コードの生成」を選択する。

- 生成されたファイルを確認する。

生成した後、クラス・インターフェースおよび Enum クラスが作成されるか、
パッケージ自体およびそのファクトリーに対してインターフェースの新規ペアが作成されます。
接尾部「impl」および「util」が付いた 2 つの新規パッケージもあり、
これらには、インターフェースおよび追加ユーティリティー・クラスの実装、
および、そのモデル・プラグインの「plugin.xml」マニフェスト・ファイルが含まれます。
モデルを変更する場合は、再生成を行うことができ、
コードに対して行われた手動による変更と、モデルの変更はマージされます。
パッケージ、クラス、または enum オブジェクトを右クリックし、ポップアップ・メニューから
「モデル・コードの生成」を選択することによって、モデル・コードのサブセットだけを選択的に生成することもできます。
目次
ステップ 3: モデルのエディターの生成
任意のモデルに対して、完全機能の Eclipse エディターを生成することもできます。
デフォルトでは、2 つのプラグインに分割されます。「edit」プラグインには、
構造化されたビューを提供してモデル・オブジェクトのコマンド・ベースの編集を実行するアダプターが含まれ、
「editor」プラグインは、エディターおよびウィザードの UI を提供します。
- 生成プログラム genmodel で、「Library」モデル・オブジェクトを右マウス・ボタンでクリックして、ポップアップ・メニューから「編集コードの生成」を選択する。

- モデル・オブジェクトを再度右マウス・ボタンでクリックし、
ポップアップ・メニューから「エディター・コードの生成」を選択する。

- 「パッケージ・エクスプローラー」ビューで、
接尾部が「edit」および「editor」の生成済みプロジェクトを確認する。

一般的に、モデル、編集、およびエディター・プラグインを一回のステップで生成する場合は、
ポップアップ・メニューから「すべて生成」を選択することによって実行することができます。
このコードは、生成される際に自動的にコンパイルされ、
変更が行われると再コンパイルされます。ワークベンチ設定で自動ビルドを使用不可にした場合、
手動でコンパイルを開始することができます。
- 「プロジェクト」メニューから「すべてビルド」を選択する。

- 「問題」ビューを確認する。ライブラリー (library.edit) および library.editor プロジェクトではエラーが発生しないはずです。

目次
ステップ 4: 生成されたエディターの実行
新規プラグインをテストするには、Eclipse の 2 つ目のインスタンス (ランタイム・ワークベンチと呼ばれます)
を起動する必要があります。プラグインはこのワークベンチで実行されます。
- 「実行」ツールバー・ドロップダウンから「次を実行/ランタイム・ワークベンチ」を選択します。

- Eclipse プラットフォームの 2 番目のインスタンスが起動するまで待つ。
「ヘルプ/Eclipse プラットフォームについて」ダイアログを表示し、
「プラグインの詳細」ボタンをクリックし、生成済みプラグインが存在することを検査します。

これで、「Library Model」ウィザードを使用して、モデルの新規インスタンスを作成することができます。
- 「ファイル/新規/プロジェクト...」ダイアログを表示する。

- 「シンプル」を展開し、「プロジェクト」を選択する。「次へ」ボタンをクリックします。

- プロジェクトに名前を付け、「終了」ボタンをクリックする。

- プロジェクトを右マウス・ボタンでクリックし、ポップアップ・メニューから「新規/その他...」を選択する。

- 「サンプル EMF モデル作成ウィザード」を展開し、「Library Model」を選択する。
「次へ」ボタンをクリックします。

- library モデルのファイル名を入力する。名前が、
拡張子「.library」で終わるようにします。次に「次へ」ボタンをクリックします。

- モデル・オブジェクトとして「Library」を選択し、「終了」ボタンをクリックする。

- 新規に作成した library モデルが、メイン・ビューに開かれる。

このエディターのルート・オブジェクトは、「My.library」リソースに対応します。
その下に、ウィザードでモデル・オブジェクトとして選択されたオブジェクトであるライブラリーが一つあります。
- 「platform:/resource/librarytest/My.library」リソースを展開し、「Library」オブジェクトを表示する。
それを選択します。

- 「プロパティー」ビューがまだ表示されていない場合は、「Library」オブジェクトを右マウス・ボタンでクリックして、ポップアップ・メニューから「「プロパティー」ビューの表示 (Show Properties View)」を選択します。

- 「プロパティー」ビューで、「Name」プロパティーの「値」列をクリックし、
ライブラリーに名前を付ける。メイン・ビューのラベルは、
Enter を押すと更新されます。

- ライブラリーを右マウス・ボタンでクリックし、ポップアップ・メニューから
「新規の子/著者 (New Child/Writer)」を選択する。ライブラリーに新規の Writer が追加されます。

- 「プロパティー」ビューで Writer の名前を入力する。

- 同様に、ライブラリーに本を追加することができます。

- すべての Book の属性および参照は、「プロパティー」ビューで編集することができます。

- スキーマ・ベースの XML 直列化表現を表示したい場合は、テキスト・エディターを使用して
モデルを保管し、閉じてから、もう一度開くことができます。

目次