想看看EMF中把rose的模型文件*.mdl转换生成genmodel的这块功能。 边看边记,继续保持杂乱的风格
先找到入口...在新建emf model file时,如下图:
对照source中的importer可以找到importer.rose.ui.RoseImporterWizard.
RoseImporterWizard继承了ModelImporterWizard,ModelImporterWizard有个doPerformFinish.如下:







一个genmodel的根是一个GenModel object,它包含了用于全局model 的generator options,并还有两个GenPackage object set 的引用:1>一个修饰(decorate)了EPackage Objects,它们是将要生成代码的core models的 根s;2>另一个decorate referenced core models的roots.[prepareGenModelAndEPackages]
getGenModel(). getUsedGenPackages().addAll(referencedGenPackages);// getUsedGenPackages()那些被引用的model的根
traverseGenPackages(getGenModel().getGenPackages());// 对那些要生成代码的package设置两个属性,一个是setBasePackage,还有一个是setPrefix.这可以从XXX.genmodel找到对应的属性.
adjustGenModel(monitor);// 设置genmodel一些信息,如Modelname,pluginId等.
adjustUsedGenPackages();
genmodel classes 就是Ecore classes 的decorators,这里用到了Decorator模式:GenClass decorates EClass, GenFeature decorates EAttribute and ERerference.继承关系:GenClass-->GenClassifier-->GenBase-->EObject.如:GenPackage 是那些组成genmodel 的类 的remainder,它decorate这些组成genmodel的类对应的Ecore classes,也包含了相关的generator options.
RoseImporter是ModelImporter的子类,继承了ModelImporter的prepareGenModelAndEPackages方法.RoseImporter裏面并用到了importer.rose中一個重要class:RoseUtil.
拣出几个重要的方法:
- RoseUtil.getRoseEcoreBuilder()-->得到一个RoseEcoreBuilder对象。
- RoseUtil.createRoseUnitTreeAndTable()-->使用RoseLoader将文件内容读到buffer中,再用RoseLexer从rose文件中解析出token放到vector中,再RoseParser根据rose的语法解析出模型信息.
- RoseUtil.createResource()
- RoseUtil.saveEcoreFiles(ResourceSet)
- RoseEcoreBuilder遍历rose file,然后在memory中建立一个ecore object(RoseEcoreBuilder.build())
在importer.rose中,parse包下都是解析rose file用的,builder就是建立树型的ecore对象用的,都是独立的模块,暂时还没深入研究.rose->genmodel的转换在高层abstract class ModelConverter中执行,底层提供细节.