2011年8月22日月曜日

XtextやEMFをスタンドアロンで使用する

XtextやEMFで作成した成果物を、Eclipse外のスタンドアロン環境で使用する方法についてメモします。

XtextやEMFの成果物をEclipseアプリケーションとして実行する場合は、拡張ポイントメカニズムによってそれらは自動的に初期化されるので、その仕組みについて細かく意識する必要はありません。
しかし、Eclipse外のスタンドアロン環境で使用する場合には、そうした自動的な初期化は行われないため、自分で初期化呼び出しを実装する必要があります。

とは言え、複雑なことは何もありません。
以下のようにとても簡単に行うことができます。 

Xtex DSLパーサのスタンドアロン初期化
MyDslStandaloneSetup.doSetup();
このクラスは、Xtextアーティファクト生成時に作られているので、確認しましょう。
この呼び出しだけで以下のことが行われ、パーサやモデルを使用できるようになります。
  • DSL用EMFモデルの初期化
  • DSLパーサのためのGuiceインジェクタの構築
  • EMFリソースファクトリへのDSLパーサの登録

EMFモデルのスタンドアロン初期化
MymodelPackage.eINSTANCE.getMymodelFactory();
EMFリソースAPIにアクセスする前に、モデルパッケージがEMFパッケージレジストリに登録されている必要があります。
EMFのパッケージクラスやファクトリクラスにアクセスしていれば、そのインスタンス作成時の初期化処理で、その登録処理が行われるので、それらになんらかの方法でアクセスしていればOKです。

EMFジェネレータオプションによっては、上記パッケージインタフェースが生成されないことがあるので、その場合はなんらかの代替アクセス処理を行えば初期化されます。
例えば、以下のようにインプリクラスを使って直接的に初期化する方法もあります。
MymodelPackageImpl.init();

EMFモデルを参照するXtext DSLパーサの
スタンドアロン初期化
MymodelPackageImpl.init(); 
MyDslStandaloneSetup.doSetup();
DSL開発を、EMFモデル定義から始めて、後からそのEMFモデルに対してXtextグラマーを定義した場合の、スタンドアロン初期化方法です。
別定義されたEMFモデルを参照している場合は、Xtext DSLパーサの初期化処理では、EMFモデルは初期化されません。そのため、DSLパーサ初期化前に、EMFモデルの初期化を行わなければなりません。
ただこの場合も、それぞれの初期化を順に行うだけです。


このように、EMFやXtextは、Eclipse外のスタンドアロン環境でも簡単に使用できます。

0 件のコメント:

コメントを投稿