现在来讨论一下emf所生成的几个plugin。一般通过ecore模型可以生成三个插件分别是emf模型,emf.edit和emf.editor。
让我们现在看模型插件
对于所有的EPackage,都会生成两个或三个java package,本别是base package(*),implemention package(*.impl),tool package(*.util)。其中,第三个包是可选的,这取决于生成属性的设置,默认是生成。包名(*)也是在生成属性中设置的。
对于所有EClass,在base package中生成相应的interface,而其java实现则在impl包中,如果一个EClass继承于另一个EClass,那么生成的interface和implemention都继承于相应的超类的interface和implemention。如果这个类有多个超类,那么在eSuperTypes中的第一个class将作为主超类(primary supertype)。对于这个子类的实现它将继承主超类的实现,并且实现其他超类接口中的方法。
对于Feature,getter和setter方法在类和接口中被定义。如果一个一个feature(成员变量)不是volatile,那么它的值会被存储在一个量值(field)中。如果一个feature是只读的,那么只生成它对应的getter方法。对于多值属性一般使用EList表示,而单值就用那个属性的类型表示。EList的类型取决于模型的约束,例如,一个non-containment reference将会使用EObjectWithInverseResolvingEList,对于一个containment reference将会使用EObjectContainmentWithInverseEList表示。
对于Operation,在包含类(containing class)的接口中生成一个公共方法标签,在对应的实现中生成实现骨架。
对于DataType,其中EEnum产生于一个继承了org.eclipse.common.util.AbstractEnumerator的实现。对于其他的EDataType,是没有接口和实现生成的,它们的实例化类就是直接使用了EAttribute的类型。
再来看看edit插件:
对于edit插件provider package中的所有类都有相应的ItemProviders类生成。更进一步,对于整个插件有一个EMFPluginClass生成。ItemProvider类继承于org.eclipse.emf.edit.provider.ItemProviderAdaptor,用于适配模型中相应的EObject(所有emf类的基类)。当模型对象由于fireNotifyChanged()改变,ItemProvider会传送相应的通知,并过滤其他的。当你生成插件时,你可以控制哪些通知被过滤。
ItemProvider也管理属性描述(property descriptors)对于所有的featur of the class,通过getImage和getText方法来管理类的icon和descrition。
对于所有的ItemProvider都有一个ItemProviderAdaptorFactory。
最后时editor插件:
对于所有的模型都会再presentation package中生成三个类。
一个多页编辑器,它给模型创建几个不同的jface viewer,包含一个TreeViewer,使用edit插件中的ItemProvider作为这个treeviewer的content和label的provider。这个editor还创建outline和property来显示在viewer中选中对象的属性。
一个ActionBarContributor,它被用于对编辑器视图中选中的item所创建的context menu添加选项。
最后是一个向导,允许你创建一个包含模型对象的一个实例的资源(resource)。