EMFにプチ貢献

以下の記事に書いてある内容で一部間違いがあったので,EMFのNewsgroupに投稿して指摘したところ,Ed Merks氏が受け付けてくださり,以下の記事が修正されました。

本当に些細なことですが,EMFに貢献できてちょっとうれしかったです。僕にとっては大きな一歩となりそう。

EMF/Generating Dynamic Ecore from XML Schema - Eclipsepedia

修正前:

For these loaded Ecores to be available, we need to register them to the global package registry.

修正後:

For these loaded Ecores to be available, we need to register them to the package registry.

"global"というところが間違いだったんです。グローバルなパッケージレジストリにEPackageを登録するには

EPackage.Registry.INSTANCE.put(element.getNsURI(), element);

とします。修正内容としては英単語一個(global)が削除されただけですが,プログラム的には大きな違いがあります。

EMFでは,モデルインスタンスをメモリ内にロードする際,同インスタンスメタモデルをパッケージレジストリから検索します。そのとき,まずローカルなパッケージレジストリを検索し,見つからなければグローバルなパッケージレジストリを検索します。

なお,ローカルなパッケージレジストリとは,あるプログラム内でnewしたResourceSetクラスのオブジェクト内に存在するパッケージレジストリのことを言います。一方,グローバルなパッケージレジストリとは,Eclipseが起動中ずっと存在するもので,一般には拡張ポイント"org.eclipse.emf.ecore.generated_package"を介してパッケージが登録されます。EMFモデルからModelコードを生成すると,生成先プロジェクトのplugin.xmlに上記拡張ポイントへの拡張の定義が追加されるはずです。プログラム中で動的に登録する場合は,上記EPackage.Registryインタフェースを使用します。

ローカルなパッケージレジストリとグローバルなものを区別することにより,EMFモデルの名前空間の競合を避けることができます。つまり,グローバルなパッケージレジストリ内で既にある名前空間が使われてしまっているが,あるプログラムでも同じ名前空間を使って異なるEMFモデルを使用したい場合,同EMFモデルを同プログラム内のローカルなパッケージレジストリに登録すればよいわけです。