EMF importer.Rose

本文探讨了如何使用EMF将Rose的*.mdl模型文件转换为genmodel。重点介绍了RoseImporterWizard类及其doPerformFinish方法,以及RoseImporter和RoseUtil类的关键功能,如RoseEcoreBuilder的使用,RoseUtil的资源创建和保存,以及模型信息的解析和构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想看看EMF中把rose的模型文件*.mdl转换生成genmodel的这块功能。 边看边记,继续保持杂乱的风格

先找到入口...在新建emf model file时,如下图:

对照source中的importer可以找到importer.rose.ui.RoseImporterWizard.

RoseImporterWizard继承了ModelImporterWizard,ModelImporterWizard有个doPerformFinish.如下:

protected  Diagnostic doPerformFinish(Monitor monitor) throws Exception
  
{
    getModelImporter().prepareGenModelAndEPackages(monitor);//構建一個genmodel,裏面調用了很多其他的method.
    getModelImporter().saveGenModelAndEPackages(monitor);//保存genmodel(resource.save())
    
return
 Diagnostic.OK_INSTANCE;
  }

一个genmodel的根是一个GenModel object,它包含了用于全局model 的generator options,并还有两个GenPackage object set 的引用:1>一个修饰(decorate)了EPackage Objects,它们是将要生成代码的core models的 根s;2>另一个decorate referenced core models的roots.[prepareGenModelAndEPackages]

getGenModel().initialize(ePackages);// 里面调用 getGenPackage (),得到其中的一个set,里面存储了要生成代码的model的epackages,并将该genModel里面的genpackages与epackages一一对应.如果没有,就新建一个与之对应的genpackage,add 到该set(getGenPackage())中.
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中执行,底层提供细节.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值