Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件
Fixflow引擎解析(二)(模型) - BPMN2.0读写
Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

关于EMF

  EMF(全称Eclipse Modeling Framework),是Eclipse组织推出的建模框架。它能够帮助软件开发人员将模型(UML, XSD等)转换成为健壮且功能丰富的Java代码。通过使用EMF,程序员编写的程序能免费的获得一个健壮的模型层,它通常比程序员自己手工编写的模型层更为健壮。事实上,有很多商业产品都使用了 EMF 来作为其模型层。由于 EMF 的广泛使用,Eclipse 组织为其推出了众多的周边模块。

Fixflow中的EMF

  Fixflow引擎读写BPMN2.0模型文件都是通过EMF来实现,扩展的"fixflow:"的元素也是通过EMF提供的注入技术实现,Eclipse的流程设计器上也使用EMF去读写模型文件,

除此之外,系统里的各种.xml配置文件都是EMF完成读写,同时还涉及到了脱离Eclipse环境在web中使用EMF。

设计模型

假设我们需要通过EMF读写一个这样格式的XML文件:

 <bookRepository>
<book id="1" name="我的奋斗" author="阿道夫·希特勒"></book>
<book id="2" name="闪击英雄" author="海因茨·古德里安"></book>
<book id="3" name="失去的胜利" author="冯·埃里希·曼施泰因"></book>
</bookRepository>

下面就根据上面XML实例来创建一个EMF模型。(当然EMF支持用一个XSD文件来生成模型,这种方式我们这里先不做介绍)

注意:下面的内容我用的是Eclipse Modeling Tools版本的Eclipse

(1) 创建一个空的EMF项目(并不一定非要是EMF项目)

(2) 项目名称EMFTest

  

(3) 在model目录下创建一个Diagram模型设计文件

(4) 给这个Diagram模型设计文件所对应的ecore文件起名: book.ecore

创建完成之后会同时生成两个文件,.ecore文件为模型文件,.ecorediag 为模型的设计文件用来图形化设计器EMF模型。

  

(5) 打开book.ecorediag文件设计模型,这里我们可以修改一下命名空间,EClass 对应到XML的Element,EAttribute对应到XML Element的字段。

(6) 创建两个EClass 分别起名 BookRepository 和 Book ,在Book类的定义中 添加三个 EAttribute id、name、author。

(7) 设置 EAttribute 的属性 ,除了名字,三个 EAttribute 采用相同的设置。

设置为attribute类型

(8)设置两个类之间的关系,添加一个 BookRepository 到 Book 的引用

继续关系设置

这样我们的模型文件设计完毕,下面我们需要来生成java代码。

生成Java代码

要生成java代码光有 .ecore文件和.ecorediag文件还不够,还需要一个.genmodel文件。

(1)创建一个.genmodel 配置文件

(2) 配置.genmodel文件

(3)生成Java模型文件

读写XML文件

模型和java代码创建完毕之后我们来创建测试类,来尝试读写一个XML文件。

创建一个 test.java 带main方法的:

 import java.io.IOException;
import java.util.Collections;
import java.util.Map; import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.fixflow.model.book.Book;
import org.fixflow.model.book.BookFactory;
import org.fixflow.model.book.BookPackage;
import org.fixflow.model.book.BookRepository;
import org.fixflow.model.book.util.BookResourceImpl; public class test { public static void main(String[] args) { // 初始化模型
BookPackage.eINSTANCE.eClass(); // 创建根元素
BookRepository bookRepository = BookFactory.eINSTANCE.createBookRepository(); // 创建书籍1
Book book = BookFactory.eINSTANCE.createBook();
book.setId("1");
book.setName("我的奋斗");
book.setAuthor("阿道夫·希特勒");
// 将创建的书创建到根元素下
bookRepository.getBook().add(book); // 创建书籍2
book = BookFactory.eINSTANCE.createBook();
book.setId("2");
book.setName("闪击英雄");
book.setAuthor("海因茨·古德里安");
// 将创建的书创建到根元素下
bookRepository.getBook().add(book); // 创建书籍3
book = BookFactory.eINSTANCE.createBook();
book.setId("3");
book.setName("失去的胜利");
book.setAuthor("冯·埃里希·曼施泰因");
// 将创建的书创建到根元素下
bookRepository.getBook().add(book); //注册XML扩展
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map<String, Object> m = reg.getExtensionToFactoryMap();
m.put("xml", new XMIResourceFactoryImpl()); // 创建一个资源
BookResourceImpl resource = new BookResourceImpl(URI.createURI("modelfile/book.xml")); //设置文件编码
resource.setEncoding("UTF-8");
//将模型保存到资源中
resource.getContents().add(bookRepository); try {
//保存文件
resource.save(Collections.EMPTY_MAP);
} catch (IOException e) {
e.printStackTrace();
} //加载测试
load(); } public static BookRepository load() {
// 初始化模型
BookPackage.eINSTANCE.eClass(); // 注册XML扩展
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map<String, Object> m = reg.getExtensionToFactoryMap();
m.put("xml", new XMIResourceFactoryImpl()); //创建一个 资源 ResourceSet
ResourceSet resSet = new ResourceSetImpl(); // 获取资源
Resource resource = resSet.getResource(URI.createURI("modelfile/book.xml"), true); //或者根节点
BookRepository bookRepository = (BookRepository) resource.getContents().get(0); return bookRepository;
}
}

下面运行测试类之后生成文件:

至此一个最简单的XML文件通过EMF来读写的功能已经介绍完了,在后面的章节中我还会详细介绍EMF提供的高级功能。

Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件的更多相关文章

  1. Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  2. Fixflow引擎解析(二)(模型) - BPMN2.0读写

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  3. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  4. 在C#程序中,创建、写入、读取XML文件的方法

    一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...

  5. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  6. Spring Framework框架解析(1)- 从图书馆示例来看xml文件的加载过程

    引言 这个系列是我阅读Spring源码后的一个总结,会从Spring Framework框架的整体结构进行分析,不会先入为主的讲解IOC或者AOP的原理,如果读者有使用Spring的经验再好不过.鉴于 ...

  7. Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理

    Fixflow内核运转图v1.0(beta) 未完待续.........

  8. Android开发8——利用pull解析器读写XML文件

    一.基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml.xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自 ...

  9. Idea创建Hibernate bean类和.xml文件

    Idea通过表结构反向生成Hibernate实体类和映射文件 首先:之前通过Eclipse反向生成Hibernate的实体类,很傻瓜式,基本上不用配置.但是Idea通过表结构反向生成hibernate ...

随机推荐

  1. Uva11732(trie)

    题意:给你n个字符串 用strcmp()两两比较 ,求字符比较的总次数 分析: 数据量很大我们考虑用孩子兄弟表示法来表示字典树 #include <cstdio> #include < ...

  2. HDU 1520-Anniversary party(树形dp入门)

    题意: n个人参加party,已知每人的欢乐值,给出n个人的工作关系树,一个人和他的顶头上司不能同时参加,party达到的最大欢乐值. 分析:dp[i][f],以i为根的子树,f=0,i不参加,f=1 ...

  3. codeforces 401D (数位DP)

    思路:很明显的数位dp,设dp[i][j] 表示选取数字的状态为i,模m等于j的数的个数,那么最后的答案就是dp[(1<<n)-1][0].状态转移方程就是,dp[i|(1<< ...

  4. as3+java+mysql(mybatis) 数据自动工具(四)

    现在介绍一下只配置 as3 与 java 公用的数据类,这种配置一般是该数据类只需要在 as3 与 java 之间转换,跟数据库没有关系.比如在客户端与服务端的数据交换中,需要定义一个统一返回请求的数 ...

  5. Poj 1163 The Triangle 之解题报告

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42232   Accepted: 25527 Description 7 3 ...

  6. iPhone更新失败后如何恢复数据

    iPhone5最好不要用wifi下更新ios8.1,因为该固件比较大,很容易中途出问题失败,如果失败也不要怕,想要恢复数据还是有希望的. 如果不幸进入恢复模式,还没有实现备份,千万别点恢复,那就啥都没 ...

  7. DIY 博客全文界面的推荐、反对、加关注、返回顶部、快速评论等小功能的集成

    博客园已经很不错了,但作为比较“挑剔”的用户,在使用的过程中,还是有一些地方不爽的. 我不是一个专业的前台程序员,也只能凭借自己蹩脚的JS和CSS知识完成对页面的小改造(专业的大虾莫要鄙视呀..). ...

  8. 2.3CUDA矩阵乘法

    CPU 矩阵乘法 能相乘的两个矩阵,必须满足一个矩阵的行数和第二个矩阵的列数相同. A(N*P) * B(P*M) = C(N*M). 其中P是行数,N是列数, 从宽高的角度来说,即 A的宽度和B的高 ...

  9. ACM2123(一个简单的问题)

    一个简单的问题 问题说明 在这个问题中,你需要做N * N的乘法表,就像样品.第第i 行和j 个列中的元素i和j的乘积(乘积).   输入 输入的第一行是一个整数C中表示测试用例的数量,然后C的测试用 ...

  10. JavaScript中值的真真假假(true and false)

    值为flase的有: false 0 "" //空串 null undefined NaN 除了以上的之外的都是ture,包括"0" (zero in quot ...