Reflective Ecore Model Diagram Editor 0.1.1をリリースしました!

リリース0.1.1のダウンロード:
http://sourceforge.net/project/showfiles.php?group_id=203088&package_id=241965&release_id=536642

このリリースの大きな変更点は、複数の.xml_diagramファイルを同時に開いて編集可能になったことです。

その他の変更点としては、GMFを使って作成した他のグラフィカルエディタを開いた際に、Reflective Ecore Model Diagram Editorに含まれるGMF関係のプロバイダ(ViewProviderやIconProvider等)がNullPointerExceptionを投げていたバグを修正しました。

上記のように、今回のリリースでは複数の.xml_diagramファイルを同時に開いて編集可能にする、という表面的には地味なものですが、技術的にはなかなか難しいものでした。今回のリリースにおける少し詳細な修正内容を以下に示します。

  • .xsdファイルから動的にEMFモデルを生成する際に、もし既にEMFのグローバルパッケージレジストリにそのEMFモデルが登録されている場合にはEMFモデルを新たに生成せずに既登録のものを使うように修正しました。この修正を実現するには、.xmlおよび.xml_diagramファイルのSAXハンドラ(XMLHandler)に対し、EMFのグローバルパッケージレジストリに既に.xsdに対応するEMFモデルが登録されていないか確認する処理を追加しました。具体的には、DynamicGMFResourceFactoryがXMLResourceを生成する際に与えるXMLOptionsとして、上記の処理を行うカスタムEcoreBuilderを追加しました。
  • EMFのグローバルパッケージレジストリにEMFモデルが登録されていない場合、.xsdファイルから動的に生成したEMFモデルを同パッケージレジストリに登録するよう修正しました。
  • 現在編集中のEMFモデルを管理するMetamodelManager(シングルトンなstaticクラス。各エディタで共有される)について、複数のEMFモデルを管理可能なように修正しました。
  • 上記MetamodelManagerや、EMFモデルとそれを図形で表示するEditPartの対応関係を管理するEcoreModelElementTypes(シングルトンなstaticクラス。各エディタで共有される)について、エディタが閉じられたとしてもそれらの内容を破棄しないように修正しました。

以前のリリースではMetamodelManagerやEcoreModelElementTypesの内容を破棄してしまっていたために、同時に編集していた他のエディタのキャンバスが壊れてしまっていました。しかし、以前のリリースではエディタが起動されるたびに.xsdファイルから動的にEMFモデルを毎回生成していましたために、同じ内容であっても新しいEMFモデルとしてメモリ上に展開されていました。したがって次回の起動に備え、エディタが閉じられる際にそれらを破棄せざるを得なかったのです。しかし、今回のリリースでは、上記のようにグローバルに管理されているEMFモデルを共有できるようにしたため、破棄する必要性がなくなりました。

なお、エディタを閉じても破棄しないということで、Javaにおけるメモリリークのような感じになりますが、GMFで作成した一般的なエディタが扱うEMFモデルやElementTypesもすべて上記のようなシングルトンなstaticクラスで管理されるため、Eclipseワークベンチが終了するまでそれらもずっとメモリ内に留まることになります。したがって、Reflective Ecore Model Diagram Editorも、GMFで作成したエディタと同じメモリ管理レベルと言えます。