atitit。自定义uml MOF EMF体系eclipse emf  教程o7t

1. 元对象机制(MOF,Meta-Object Facility)and  结构 1

2. 元模型图、模型图、对象图uml自定义建模语言 2

3. 3层结构and 结构中的框架连接 3

4. GEF和EMF 4

5. 建立emf项目--建立一个empty   emf proj
4

6. 建立一个ecore模型 4

7. EMF,Ecore 6

8. 建立genmodel的  jet 生成配置文件 7

9. Ecore和Genmodel。 8

10.  8

11. 生成项目 9

12. 运行插件run  as  eclipse app 11

13.  11

14. 新建自定义模型 11

15. 防止覆盖自定义修改。。@generated标注 13

16. 定制应用程序的基本方法) 13

17. EMF的问题ati总结 14

18. 参考 14

1. 元对象机制(MOF,Meta-Object Facility)and  结构

起源于统一建模语言(UML)。对象管理机构(Object Management Group|OMG)需要一种元模型结构来定义UML。

MOF被设计为4层次的结构。位于顶部的是元元模型层,即M3层。M3模型是MOF建立元模型(被称为M2模型)的语言。M2模型最明显的 例子是UML元模型,该模型描述UML。M2模型描述M1层以及M1层的要素,例如,UML模型。最后一层是M0层或数据层。它描述真实世界的物体。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2. 元模型图、模型图、对象图uml自定义建模语言

MOF的四层模型分别是:元元模型层(M3)、元模型层(M2)、模型层(M1)、运行时(M0)。其中元元模型层包含了定义建模语言所需的元素;元模型 层定义了一种建模语言的结构和语法;模型层定义了一个具体的系统的模型;运行时包含了一个模型的对象在运行时的状态等。

本文涉及到的有M2、M1和M0层,下面给出一个例子,首先是M2层,它可以定义一个建模语言的结构和语法,例如:

本文涉及到的有M2、M1和M0层,下面给出一个例子,首先是M2层,它可以定义一个建模语言的结构和语法,例如:

这是一个简要的元模型图,它表示Class由Property和Operation组成,这张图符合UML2.0的概念,但是我们也可以这样画:

这样一来,Class包含三种元素:Attribute、AssociationEnd和Operation,这样我们就创建了一个新的元模型,也可以说创建了一个小的新建模语言。虽然它不符合UML2.0规范。

M1层模型就是我们通常简称的“模型”,它是系统的标准化表示,一般用建模语言来表示一个软件系统,例如下面的汽车和人的系统:

3. 3层结构and 结构中的框架连接

一个应用系统可以被分为典型的3层结构。在《UML模式与应用》[1]一书中分别称为UI层、领域层、数据层。UI层和领域层的接口通过应用程序和应用框架来连接;领域层和数据层的接口通过持久化框架来连接。

4. GEF和EMF

GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。使用GEF可以方便的实现XML编辑器、UML类图编辑器等应用程序。

EMF(Eclipse Modelling Framework)是Eclipse MDA(Model Driven Architecture)的重要组成部分,可以将模型转换成高效的,正确的,易于定制的Java代码。

基于GEF和EMF可以很方便地进行模型驱动开发(Model-Driven Development,MDD)

。GEF是Eclipse提供的图形编辑框架,GEF可以为用户提供图形化编辑模型,提升用户体验。EMF是Eclipse提供的模型驱动应用程序 开发框架,可以产生代码的框架。EMF可以基于XML Schema,UML或经过注释的Java中指定的模型,创建Java代码,实现图形化的数据编辑、操纵、读取和序列化。

5. 建立emf项目--建立一个empty   emf proj

6. 建立一个ecore模型

默认的只能树形编辑。。

定义ecore模型,我比较喜欢图形化的方式,因为看起来很直观,所以我使用Omondo公司的EclipseUML插件来画类图,这个插件的免费版本在 它们网站下载,注意下载适合你的Eclipse的版本。当然rose也不错而且更加稳定,但它 不是免费的,而且只能在Windows里使用。和Rose不同,EclipseUML对EMF有特别的支 持,安装这个插件后,我就们可以在项目里新建一个“EMF Class Diagram”,这样会同时创建一个.ecd文件和一个.ecore文件,EclipseUML编辑的类图信息会保存在这两个文件里,前者主要是图形方 面的内容,而后者是真正的模型信息,注意这两个文件中的任何一个都不要搞丢了,最好能经常备份一下。

在EclipseUML里编辑类图很简单,需要注意的是,两个对象之间如果有关联,要仔细考虑关联是否为“包含”关系(一般在UML中以黑色菱形表 示),如果一个类没有包含在任何其它类里,则这个类的实例不会被保存到文件。例如图2中Category包含在Shop中,Product包含在 Category中。这样,所有的对象都直接或间接的被Shop对象包含。换句话说,如果以Shop作为“根”,所有的对象都可以被保存到文件里。

EMF对java基本类型和一些常用类做了包装,例如int->EInt,java.lang.Integer->EInteger以 及java.util.List->EList等等,所以在定义类的属性时要使用这些EMF的类型,当然也有办法使用自定义类型(以后会用到)。我 们例子里的模型相当简单,一共只有三种业务对象(为了更加直观,我们增加了一个NamedElement接口),现在网上 商店类图的第一个版本如图2所示。

7. EMF,Ecore

项目的最初目标是要实现OMG(Object Management Group)的MOF规范(Meta Object Facility)。在项目的进行中EMF的开发人员根据大量的实践经验对MOF规范进行了再加工,提取出了一些核心的元素集(MOF 2.0 中称为EMOF(Essential MOF))。可以说EMF 是MOF核心子集的java高效实现,在EMF 中MOF核心子集的实现称为Ecore。

图1.Ecore类层次结构:这个图像显示出Ecore元数据完整的类层次。

EMF用于定义和实现结构化数据模型。所谓数据模型就是用来处理应用中需要处理的数据的一组相关类。

使用EMF的好处

1.          代码生成。根据模型的定义生成可用数据模型的所有代码。EMF依照模板文件生成容易阅读的代码,模板文件可以定制。你可以修改所生成的代码,并且重新生成类时会保留所做的修改。生成代码需要的是Rational Rose模型文件,批注Java接口或XML schema 定义(开发中)

2.          元数据。你可以用程序查询模型结构,得到比标准的Java BeanInfo或反射更多的信息。EMF还支持访问和更新模型。

3.          缺省序列化。EMF可以从XMI文件装载模型实例,也可以保存模型实例到XMI文件(XMI文件是一种XML格式的文件)。你也可以保存到不同格式的文件。文件格式XML schema还在开发中。

4.          文件之间的连接。你可以保存和编辑多个文件中的数据

5.          编辑器。EMF还会生成一个模型编辑器,还有一个反射编辑器,只用模型的元数据就可以浏览和编辑EMF模型文件。

Eclipse建模框架(EMF)是一个Java开源框架与代码生成工具-用于基于结构化的模型来构建工具和其它应用程序。在Eclipse平台在用户界面和文件级上提供一个强有力的集成框架的同时,EMF加强了这种能力来实现工具和应用程序之间良好粒度的数据分享。EMF可以快速为你的模型生成简单、正确、有效的对应JAVA代码。如果给定一个模型,那么EMF能够自动生成Java源代码-该源码允许你创建、查询、更新、串行化、反串行化、检验和追踪你的模型实例的变化。

类似于其它的Java绑定框架,例如JAXB或XMLBeans,给定一个模型后,EMF就能够生成Java源代码-它允许你创建、查询、更新、反串行化以及串行化你的模型的实例。尽管多数Java绑定框架仅支持一个模型类,例如XML模式,而EMF支持从XML模式,UML类图(Rational Rose或UML2)以及被注解的Java接口中生成代码。除了模型代码,EMF还能生成一个完整的应用程序-它包括一个可定制的编辑器。

  用来描述EMF模型的模型叫作Ecore,本质上是UML类图的子集,它是关于应用的类和数据的简单模型。当建立Ecore后,EMF采用实现与接口相分离的设计,将Ecore中的每个类(Eclass)自动生成1个接口和1个实现类。

  其中的接口都会继承EObject这些EMF中的集接口,如同java.lang.Object在Java中的地位。EMF还为每个模型分别生 成一个对应factory和package的接口和实现类。其中,**Factory继承于EFactory,为模型中每个类的创建提供 create***方法。在jStudio中,采用EMF实现业务模型对象建立和代码生成,降低开发人员的工作量,提高效率,而且生成的代码简洁、高 效。

8. 建立genmodel的  jet 生成配置文件

接下来就要生成代码了。EMF使用JET利用模板生成代码(前面曾介绍过JET),所以要把ecore模型转换为可以被JET利用的genmodel模型,具体的操作是按 ctrl+n新建一个EMF Model,在这个向导的第一步指定名称shop.genmodel,第二步选择从ecore模型导入,第三步选择ecore模型文件 (shop.ecore),这样就建立了缺省的genmodel模型,在这个模型的基础上还可以做一些定制工作,例如每个属性的描述信息等等。

有了genmodel模型,离得到可用的java代码就只有一步之遥了。打开shop.genmodel文件,在根节点上点开右键菜单(见图3),如果只想生 成模型代码选择“Generate Model Code”,如果需要.edit的代码(EMF提供的一些ItemProvider和AdapterFactory,帮助实现编辑器)和可用的编辑器,选 择“Generate All”最方便,这也是例子里选择的方式。EMF的代码生成器为模型、.edit、编辑器和测试代码各生成一个插件项目 (com.my.shop/shop.edit/shop.editor/shop.tests),前三个是后者依赖前者的关系。这里插上一句,即使没有 用EMF的项目,也建议把模型和界面使用不同的插件项目分开,这样做有很多好处,主要是灵活性大大提高了。

图3 从菜单里选择生成部分或全部代码

9. Ecore和Genmodel。

10.

EMF是基于两种元模型来构建的,分别是

Ecore:主要用于定义模型结构的相关信息,并对外提供了一个根对象(犹如XML文件的根节点)用来代表要显示的模型,该对象的子节点为 package(包),package的子节点为class(类),class的子节点为attribute(类的属性字段),这样整个树形结构就代表了 所要表示的EMF模型结构。

Genmodel:主要包含有关代码生成的相关信息(如:文件生成路径及文件名),和一些控制参数用来控制代码怎样生成。

11. 生成项目

EMF采用模型驱动开发方法,在无需编码的情况下,我们可以基于模型使用EMF为我们生成以下几样东西。

1,与模型相对应的EMF实体类。

2,基于实体类的各种ItemProvider模型适配器类,通过该适配器类可以很好的将EMF模型绑定到Jface组件中去,稍后具体介绍。

3,editor-plugin项目,可理解为基于EMF应用的一个插件项目。

4,测试bundle。

1实体类:就像Hibernate ORM为我们生成的实体类一样,EMF也会为我们生成这样的实体类,并且这些实体类含有更高级的特性(如:类属性状态发生变化时,实体类具有通知功能)

2适配器类:EMF的模型结构可能非常复杂(如可能含有多个实体类,并且类结构各不相 同),这样当视图组件直接使用这些实体类的时候就变得非常困难(要判断出是哪一个实体类,针对该实体类怎样显示视图等等..),因此EMF针对这些实体类 生成了一些适配器类,通过实现指定的接口,让适配器类来设计实体类的显示,而视图只需要选择合适的适配类便可。

3适配器工厂:上面讲到视图通过适配器类避免了与实体类的直接交互,然而视图又是如何得到合适的适配器类的呢?那便是通过适配器工厂类。

模型定义如下:

从模型定义来看Library便是Ecore所对外提供的用来表示模型的根对象。

首先来看EMF为我们生成的模型实体类(假设这些实体类分布在org.emf.demo这个bundle之中)

EMF会为我们生成3个package,分别是:

org.emf.demo.library:包含实体类的接口;用于创建实体类的工厂(libraryFactory);访问模型元数据的实用类(LibraryPackage)

org.emf.demo.library.impl:实体类接口的实现类;实体类工厂的实现类(LibraryFactryImpl);LibraryPackage的实现类(LibraryPackageImpl)

org.emf.demo.library.util:针对该模型的适配器工厂类(LibraryAdapterFactory)

注:libraryFactory和LibraryPackage都是单例模式的,可通过其成员变量eINSTANCE来得到对象的实例。

12. 运行插件run  as  eclipse app

13.

14. 新建自定义模型

。EMF为我们生成了一个新建向导(New Wizard),利用这个向导可以生成新的Shop实例,注意在第三步要选择以Shop类为根类型。编辑器的运行界面如图4所示,它的外观虽然有待改进,但功能已 经足够我们对网上商店里的类别和产品进行编辑了。在以后的帖子里,我们要对网上商店的ecore模型和编辑器的界面做一些修改。

在EMF自动生成的editor中,只提供了TreeViewer作为编辑控件,自动生成的代码能让TreeViewer处理Redo&Undo操作,

图4 缺省的编辑器界面

15. 防止覆盖自定义修改。。@generated标注

注:EMF所生成的变量或方法都会含有@generated标注,当执行regenerate操作时EMF只会覆盖含有@generated标注的方法,而自己手工添加的方法不会被覆盖。

16. 定制应用程序的基本方法)

编辑器的作用是编辑模型实例,比如你在模型里定义了商店里有商品,编辑器就可以让你创建这些商品(例如佳能数码相机),否则这个模型的作用在哪里体现呢。



如果要求不高的话,你生成好编辑器整个应用程序就完成了,你的项目就可以结束了,因为你已经可以用它来管理你的商店了。



不过大多数情况下我们对生成的应用还是不够满意的,比如认为生成的图标不好看,菜单顺序不合理,甚至整个界面都不满意,等等。所以就需要对生成的应用进行定制,也就是改造,直到完全符合要求为止。

借助EMF的帮助,不用亲自编写一行代码就可以生成一个完整的应用程序,你是不是对EMF有些感兴趣了?不过生成的应用程序看起来都像是从同一个模子里出来的,即 一个多页编辑器,一个大纲视图和属性页,这当然无法满足所有人的需求。不用耽心,只要了解EMF的机制,按照我们的要求修改这个应用程序并不是一件很困难的 事情。

首先大概的看一下EMF为我们生成了哪些东西吧。按照前文的操作,EMF应该一共生成了四个插件项目:com.my.shop、 com.my.shop.edit、com.my.shop.editor和com.my.shop.tests,其中最后一个项目是方便我们编写单元测 试的框架代码,这里我们先不管它,暂时把注意力集中在前三个项目上。

第一个项目是模型部分,主要包含你定义的ecore模型里各类型(EClass,在ecore元模型里类型称为EClass,属性称为 EAttribute)对应的java接口和缺省的实现类代码,例如Product.java和ProductImpl.java,它们分别被放置在 com.my.shop和com.my.shop.impl包里;一个工厂类(ShopFactory)使用工厂模式创建新的模型实例;一个 Package类(ShopPackage)维护关于元模型的信息,提供了一堆静态成员变量;此外还生成了ShopAdapterFactory和 ShopSwitch这两个类,它们是可选的,它们俩的作用这里卖个关子暂时先不说。

第二个项目是.edit部分,这里面包含了一系列ItemProvider类,用来为在jface的各种查看器(Viewer)里显示这些模型对象 提供便利,以CategoryItemProvider为例,它实现了IStructuredItemContentProvider、 ITreeItemContentProvider和IItemLabelProvider这些接口,注意把这些接口名字中的"Item"去掉就是 jface里需要的Provider,可以把这些带有"Item"字样的Provider想象成对jface相应Provider的包装。有了这些 Provider,在应用程序里使用jface的TreeViewer、TableViewer等查看器就很方便了。(前面讲GEF的一个帖子里曾利用 EMF构造模型,当时使用的就仅仅是模型部分,因为并未用到jface查看器。所以视你的应用程序而定,可以只生成模型部分来用,.edit部分依赖模型部分,而反之不然。)

第三个项目是编辑器,这个部分依赖.edit部分,主要包含了几个UI方面的类。EMF为我们生成的这个编辑器有两个用途:一是让我们可以不用从零开始,而是在这个编辑器的基础上进行修改得到自己的编辑器; 二是通过这些代码展示怎样在应用程序里使用前两个项目里的那些类,编辑器包含那么多Tab正是为了演示各种查看器的用法。下面来说一下怎样定制生成的应用 程序。

17. EMF的问题ati总结

Web好像不适用。。

18. 参考

EMF介绍系列(二、从模型生成应用程序) - 八进制 - 博客园.htm

EMF介绍系列(三、定制应用程序的基本方法) - 八进制 - 博客园.htm

EMF介绍系列(八、模型的验证) - 八进制 - 博客园.htm

脱离Eclipse环境使用EMF - 八进制 - 博客园.htm

构建 Eclipse 插件在 EMF 模型中浏览内容.htm

atitit。自定义uml MOF EMF体系eclipse emf 教程o7t的更多相关文章

  1. atitit。自己定义uml MOF EMF体系eclipse emf 教程o7t

    atitit.自己定义uml MOF EMF体系eclipse emf  教程o7t 1. 元对象机制(MOF,Meta-Object Facility)and  结构 1 2. 元模型图.模型图.对 ...

  2. Atitit 项目中的勋章体系,,mvp建设 ,荣典体系建设

    Atitit 项目中的勋章体系,,mvp建设 ,荣典体系建设 1. 荣典体系的标准1 2. 勋章称号1 2.1.1. 授予标准1 3. 政出多门  统一的荣誉制度 2 3.1. 法则规定2 3.2. ...

  3. Atitit.ide代码块折叠插件 eclipse

    Atitit.ide代码块折叠插件 eclipse 1. User Defined Regions  #region  ...  #endregion  插件com.cb.eclipse.foldin ...

  4. Atitit.自定义jdbc驱动  支持jsql

    Atitit.自定义jdbc驱动  支持jsql 1. 为什么需要自定义驱动1 1.1. 透明分库分表1 1.2. 自定义数据库的接口.比如大数据文档文件类型的数据库,数据存储引擎2 2. 整个文章分 ...

  5. Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

    Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8 ...

  6. java 开发基础篇1环境安装--eclipse安装教程

    如何安装java环境 http://jingyan.baidu.com/article/a24b33cd59b58e19fe002bb9.html JDK download http://www.or ...

  7. eclipse 安装教程

    eclipse 安装教程 一:安装包下载: 链接: https://pan.baidu.com/s/1qZtt62o 密码: 4ak2 注:若 下载链接失效,请看本文公告的QQ群,请联系群主. 二:安 ...

  8. Eclipse安装教程

    Eclipse安装教程     (Win7_64bit + Eclipse_64bit + JDK_8u131_64bit + python2.7.8 + PyDev5.7.0插件) 适用操作系统:W ...

  9. Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc

    Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc 1. 服务器方面的维护1 1.1. 默认情况下,已经在系统的启动目录下增加了 个启动项目1 1.2. 后台服务.保 ...

随机推荐

  1. Linux/Unix双机建立信任教程

    Linux/Unix双机建立信任教程 一 需要建立信任关系的2台主机都执行生成密钥输入ssh-keygen -t rsa之后全部默认回车,这样就会在/root/.ssh下生成密钥文件 [root@pl ...

  2. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. jQuery -> bind / live / delegate 的终结者 - on

    Bind()方法: 给元素绑定事件 形式: .bind(eventType[,eventData],handler(eventObject)) eventType,string类型,一个或多个DOM事 ...

  4. 判断闰年的方法以及如何获得单链表的倒数第K个元素

    今天很悲催,心中向往的公司,打电话过来面试,问到我两个问题,结果竟然都没有回答上,伤心了,记录下今天失败,希望以后不要被同样的问题给PASS. 问题1.如何判断是否为闰年 所谓闰年那就是:四年一闰,百 ...

  5. Java写操作

    //:ThinkingInJava/net.mindview.io/write2File.java package net.mindview.io; import java.io.BufferedRe ...

  6. css绘制六边形

    CSS id选择器实现 正六边形 用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: HTML代码: <div id="box1">< ...

  7. 使用 BeanCopier 复制对象

    Cglib是一款比较底层的操作java字节码的框架. BeanCopier是一个工具类,可以用于Bean对象内容的复制. 复制Bean对象内容的方法有很多,比如自己手动get set ,或者使用Pro ...

  8. 扩展Smack Message

    XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性. Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库 因为XMPP是XML,所以进行 ...

  9. jzoj[1438]NOIP2013火柴排队

    读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...

  10. SQl server master

    取一段连续时间,SQl server 2008可用,其他版本暂时没测试.           ),                                      ), )), )      ...