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モデルを同プログラム内のローカルなパッケージレジストリに登録すればよいわけです。