emf java
EMF是Eclipse平台的组成部分,也是相关技术和框架的基石,例如Eclipse Visual Editor,SDO,XSD和UML,其中许多已集成到IBM平台中,例如Rational®Application Developer和WebSphere。 ®业务建模器。 今天,EMF已经成长为包含Java技术功能,例如枚举类型,注释和泛型。 如果你是新的EMF,请参阅相关主题的文章,将帮助您开始。
在大多数文档和教程中,EMF用于建模数据和接口 (例如EMF发布文档中的Library and Books ),而非行为 。 当然,有一些为数据对象生成的默认方法实现,但是这些实现涉及模型元素之间的关系。 而且,除了Eclipse Foundation文章“使用EMF建模基于规则的系统”(请参阅参考资料 )外,几乎没有记录的EMF用作“元-元模型”的示例(但只有一个示例展示了如何扩展Ecore元模型。
最后,使用和扩展EMF JET模板的过程没有得到很好的记录。 此外,JET编辑器项目已移至另一个Eclipse项目(M2T)。 本文旨在澄清这些问题,并使您能够在EMF上下文中使用动态模板执行更多操作。 因此,它假定您对EMF基本熟悉。
为什么要扩展Ecore元模型?
Ecore元模型是用于设计模型驱动的体系结构(MDA)的强大工具,可以用作软件开发的起点。 通常,我们将在应用程序域中定义对象(类型为EClass
),它们的属性以及它们之间的关系。 我们还将使用EOperation
模型元素定义属于那些对象的特定操作。 默认情况下,EMF将为这些操作生成框架或方法签名,但是我们必须返回并实现这些操作,通常一次又一次地重新编码类似的逻辑。
但是,如果我们想在模型中指定某种任意的实现行为,该怎么办? 一种方法是将基于文本的注释(类型为EAnnotation
)添加到模型对象,并在代码生成过程中在模板中解释这些注释。 有关此示例,请参阅Eclipse Foundation文章“使用MDT OCL在EMF中实现模型完整性”(请参阅参考资料 )。 但是,我们的目的不是验证本文中描述的模型元素,而是对实现本身进行建模,以便将这些元模型元素与任何具体模型重用。 为此,我们需要扩展Ecore元模型。
扩展元模型
本文随附一个高度简化的编程模型,该模型扩展了Ecore。 它不是一个完整或连贯的元模型或框架; 严格来说,它是一组原型元素,用于说明使用EMF进行元建模代码实现的潜力。 图1显示了称为EcoreX的示例扩展元模型的快照,然后是每个元素的简短描述。
图1. EcoreX模型
EcoreX元素
-
这是Ecore元素
EPackage
的简单“标记”扩展,没有其他属性。 这个元素是必要的,因为默认情况下,EMF编辑器插件的元素EPackage
不会允许的子类EClass
添加为一个子元素(见EClassX
,下同)。 通过提供扩展EPackage
的模型元素,将自动生成代码以允许将EClassX
子元素添加到EPackageX
。
EPackageX
扩展了EPackage
-
同样,这是Ecore元素
EClass
的简单标记扩展,没有其他属性。 与上面类似,此元素是必需的,因为默认情况下,EClass
的编辑器插件不允许添加EOperation
子类-这是本文的目的。
EClassX
扩展了EClass
-
这是向Ecore模型添加具体的元功能的主要实体和切入点。 该元素具有Ecore的基本
EOperation
元素中不存在的属性。 下面描述的所有其他元素都属于EOperationImpl
,用于构成程序实现。 例如,EOperationImpl
具有变量和语句,并且可以返回引用或值。
EOperationImpl
扩展EOperation
-
LocalVariable
是局部范围的变量。 变量具有名称和Java类型(例如String
,Integer
,Object
),并且由于这些属性已经存在于其超超类EParameter
,因此LocalVariable
不需要其他属性。
LocalVariable
扩展ETypedElement
-
在我们的简化逻辑模型中,
EOperationImpl
包含许多statement
s,这些statement
将以给定的顺序求值。Statement
是一个抽象的超类。
Statement
扩展了EClass
-
LiteralAssignment
引用一个变量,并具有String
属性,该属性允许用户输入要解析的值并分配给变量(例如,“ hello”,“ 4.5”可以分别分配给String
或float
)。
LiteralAssignment
扩展Statement
-
Access
表示引用Java字段或操作的动作。
Access
扩展Statement
-
访问字段以分配值(例如
var1 = var2.name
)。
FieldReferenceAssignment
扩展了Access
-
调用操作(Java方法)。 可以将
Invoke
的结果分配给变量(例如,myVar = obj.toString()
)。
Invoke
扩展Access
图2提供了更类似于UML的EcoreX元模型表示。
图2. Ecorex模型图
入门
本文有六个高级步骤:
- 扩展Ecore元模型,添加新的语义
- 为扩展的元模型创建一个
genmodel
。 - 为该元模型生成EMF编辑器,然后安装其插件。
- 使用新的编辑器,建立描述程序行为的具体模型。
- 创建并配置一个
genmodel
的具体型号。 - 根据具体模型生成具体的Java代码。
您可以创建或导入上述元模型。 在这两种情况下,您都应该从现有的EMF项目开始或创建一个新项目(“ 新建”>“其他”>“ Ec