使用EMF生成模型代码时,通常Eclipse会有一个缺省的保存格式。
在保存模型时,EMF会把根据模型生成一个EMF的Resource,然后用这个Resource来进行保存与加载。
在EMF中通常使用的Resource类型有:XML和XMI。在使用genmodel生成代码之前,我们可以设置要使用的Resource类型:
- None
- Basic
- XML
- XMI
- 如果选择None,则没有Resource类会被生成,可以看util包下的类;
- 如果选择的是一个Basic的类型,则会生成一个直接继承ResourceImpl的类;
- 如果选择的是XML类型,则会生成一个继承XMLResourceImpl的类;
- 如果选择的是XMI类型,则会生成一个继承XMIResourceImpl的类;
模型的加载与保存就是在Resource类的doSave()和doLoad()方法中完成的。在继承之前,先介绍一些简单的修改方法
一、修改Annotation
对于XML的Resource类型,这个比较简单,在ecore文件里,我们可以给每个元素加个若干个annotation。可以通常定义一些annotation来达到修改的目的。例如,如果想把结果保存为一个元素类型,并且元素名为myElement,则可以定义如下的annotation:
<details key="name" value="myElement"/>
<details key="kind" value="element"/>
二、修改Options
当我们使用annotation去修改保存过程的时候,实际是是使用XSD的插件去生成一个XMLMap来指定模型和它的保存类型之间的映射。因此,在XMI的情况下,我们也可以通过直接构建XMLMap来达到修改的目的。
在Editor(如果有一个的话)的doSave()方法中,在Resource保存前,我们可以指定XMLMap。例如:
XMLMapImpl xmlMapImpl = new XMLMapImpl();
XMLInfoImpl infoImpl = new XMLInfoImpl();
infoImpl.setName("contentName");
infoImpl.setXMLRepresentation(XMLInfoImpl.ATTRIBUTE);
xmlMapImpl.add(PurchasePackage.eINSTANCE.getItemType_Comment(), infoImpl);
saveOptions.put(XMLResource.OPTION_XML_MAP, xmlMapImpl);
这个意思就是说把comment这个元素修改为一个属性,并且保存的属性名为contentName。