使用 EMF Query 查询 EMF 模型

EMF圖片查看器(Delphi) Delphi 查看 EMF 文件 說明:解壓即可,emfview.exe為編譯後文件 立即下载
 
EMF 是 Eclipse 组织推出的建模框架。它能够帮助我们将模型(UML, XSD等)转换成为健壮且功能丰富的Java 代码。通过使用 EMF,我们编写的程序能免费的获得一个健壮的模型层,它通常比我们自己手工编写的模型层更为健壮。事实上,有很多商业产品都使用了 EMF 来作为其模型层。由于 EMF 的广泛使用,Eclipse 组织为其推出了众多的周边模块。本文将要介绍的是一个基于 EMF 的 Query 库的使用,它属 Eclipse Modeling Framework Technology 项目的一部份。通过使用 EMF Query,我们能方便的对 EMF 模型进行查询。即使面对复杂的模型,我们也能够方便的获得我们关注的部分。

1 介绍

由于EMF(全称Eclipse Modeling Framework)在Java阵营中的广泛使用,用户迫切的需要更多基于EMF的功能。因而,Eclipse组织为其推出了众多的周边模块。例如目前已经较为成熟的GEF(Graphical Editing Framework)和GMF (Graphical Modeling Framework)就能帮助用户开发基于EMF的图形编辑器。事实上,基于EMF的新技术远不止GEF和GMF。EMFT (Eclipse Modeling Framework Technology) 是Eclipse专门用来发展基于EMF的新技术的专门项目。今天我们将要介绍的EMF Query就是EMFT的一个子组件。我们可以使用它来对EMF模型进行查询,从而降低了处理复杂模型的难度。





回页首


2 建立Library模型

在介绍EMF的文章中,最常用的例子是Library样例。Library模型的UML图如下所示: (本文中用到的ecore model和源代码在附件emfquery.zip中)


图 1 Library模型
图 1  Library模型

正如我们所看到的,Library例子相当简单,它仅仅包含三个类:Library, Writer, Book,以及一个BookCategory枚举类型。在使用EMF时,我们首先需要获得一个ECore模型,这个Ecore模型将用于定义用户模型(例如Library模型)的metadata。我们可以从头开始创建一个ECore模型,也可以通过别的模型导入。如果使用Rational家族中的产品进行UML建模,那么我们能够在Rational产品中直接将UML模型导出为ECore模型。另外,我们也可以通过创建XSD文档或者Annotated Java文件,并且利用EMF自带的向导转换为ECore模型。

在获得了Ecore模型之后,我们在Eclipse中创建一个Java项目。在"New Java Project"向导中,我们将工程的名称设置为test.emf.query,并且我们应当选择分离源代码目录和输出目录。我们在新建好的test.emf.query项目中建立一个新的model目录,并将library.ecore文件保存到这个目录中。

为了生成模型的Java实现,我们首先需要利用EMF提供的向导将.ecore模型转化为.genmodel模型。这可以通过如图 2所示的"New EMF Model"向导来进行。


图 2 使用"New EMF Model"向导建立新项目
图 2  使用New EMF Model向导建立新项目

我们将Library.genmodel生成到model目录下,并双击其进行编辑。在.genmodel的编辑器中,我们选择Library包,并修改其"Base Package"属性为emf.model。这个属性会影响生成的Java代码的包名称。


图 3 使用"New EMF Model"向导建立新项目
图 3  使用New EMF Model向导建立新项目

接下来,我们就可以生成Library模型的Java实现了。在Library包上单击右键,并在弹出菜单中选择Generate Model Code项,在test.emf.query项目中生成Library的Java实现。经过这一步之后,我们的test.emf.query将会变成一个插件项目,这并不意味着EMF只能作为插件被使用。对于插件项目而言,我们可以更为方便的设置对插件的依赖关系。现在我们通过双击打开plugin.xml,然后进入Dependencies标签页,并添加对org.eclipse.emf.query插件的依赖,如图 4所示。


图 4 添加对EMF Query的依赖
图 4  添加对EMF Query的依赖

在进行完迄今为止的这些步骤之后,我们可以开始编写代码来测试EMF Query的功能了。





回页首


3 使用EMF Query查询

EMF Query是一个非常容易使用的框架,Query框架将遍历模型中的每个元素,而用户需要做的工作是编写一个继承自Condition的类来判断模型中的元素是否应该出现在查询的结果中。在EMF Query框架中,已经提供了大量我们立刻可用的Condition子类。


图 5 使用Hierachy视图查看Condition类型
图 5  使用Hierachy视图查看Condition类型

通常情况下,我们既可以使用已有的Condition类也可以创建新的Condition类。对于在EMF模型中进行查询而言,我们最常用到的是EObjectCondition类及其子类。


表 1 用于EMF的一些Condition类
类名用途
EObjectCondition所有用于检查EMF模型的条件类都应该继承EObjectCondition类。这个条件类接收一个PruneHandler类的对象。PruneHandler用于判断是否需要处理当前正在比较的EMF对象的子对象。
EObjectAttributeValueCondition这个条件类用于判断当前正在处理的EMF对象的属性是否满足特定的条件。这个条件类接收一个PruneHandler对象和另一个Condition对象。传入的Condition对象将被用于对属性的值进行判断。
EObjectReferencerCondition这个条件类用于判断当前正在处理的EMF对象是否引用了一个特定的EMF对象。

当我们了解了一些常用的Condition之后,我们就可以开始编写代码来对我们的EMF模型进行查询了。下面的代码演示了如何利用EObjectAttributeValueCondition和EObjectReferencerCondition来进行模型的查询。


代码 1 查询超过500页的书籍
	
	public Collection queryLargeBook(EObject root) {
		SELECT select = new SELECT(new FROM(root), new WHERE(
				new EObjectAttributeValueCondition(LibraryPackage.eINSTANCE

     						.getBook_Pages(), new NumberCondition.IntegerValue(

     						new Integer(500), new Integer(Integer.MAX_VALUE)))));

     
		return select.execute();
	}
	

在上面的代码中,我们检查每个Book对象的Pages属性。对于Pages属性的检查是通过一个NumberCondition对象进行的。


代码 2 查询某个作者创作的所有书籍
	
	public Collection queryBookByWriter(EObject root, Writer writer) {
		SELECT select = new SELECT(new FROM(root), new WHERE(
				new EObjectReferencerCondition(writer)));

		return select.execute();
	}
	

在上面的代码中,我们查询了一个作者所写的所有书籍。除了使用已有的条件类之外,我们也可以创建新的条件类,例如,如果希望查询所有具有三个作者的书籍,那么我们可以编写如下的条件类:


代码 3 查询拥有三个作者的所有书籍
	
	private class ThreeWriterCondition extends EObjectCondition {
		public ThreeWriterCondition() {
			super(PruneHandler.NEVER);
		}

		@Override
		public boolean isSatisfied(EObject eObject) {
			if (eObject instanceof Book) {
				Book book = (Book) eObject;
				List writers = book.getWriter();
				if (writers.size() == 3)
					return true;
			}
			return false;
		}

	}
	

自己编写的Condition类并没有什么特殊之处,其使用方法与库中的条件类是完全一样的:


代码 4 使用新建的Condition类
	
	public Collection queryBookWithThreeWriters(EObject root) {
		SELECT select = new SELECT(new FROM(root), new WHERE(
				new ThreeWriterCondition()));

		return select.execute();
	}
	





回页首


4 测试结果

最后,我们可以使用JUnit来测试我们的查询代码。由于我们的项目基于JDK 5.0开发,因而我们可以使用JUnit 4.0来进行测试。JUnit 4.0充分利用了JDK 5.0中引入的Annotation机制,在代码编写方面与之前的版本有着相当大的区别。当然,它还是一样的简单易用。下面就是我们用于测试三个Query函数的测试方法。


代码 5 使用JUnit 4.0测试查询
	
	@Test
	public void testQueryLargeBook() {
		Collection books = query.queryLargeBook(library);
		if (books.size() < 1)
			fail("No large book is found");
		for (Iterator iter = books.iterator(); iter.hasNext();) {
			Book element = (Book) iter.next();
			if (element.getPages() < 500)
				fail("Small book is found in the result");
		}
	}

	@Test
	public void testQueryBookByWriter() {
		Collection books = query.queryBookByWriter(library, writer);
		if (books.size() < 1)
			fail("No book is found");
		for (Iterator iter = books.iterator(); iter.hasNext();) {
			Book book = (Book) iter.next();
			if (!book.getWriter().contains(writer))
				fail("Found a book which is not authored by "
						+ writer.getName());
		}
	}

	@Test
	public void testQueryBookWithThreeWriters() {
		Collection books = query.queryBookWithThreeWriters(library);
		if (books.size() < 1)
			fail("No book is found");
		for (Iterator iter = books.iterator(); iter.hasNext();) {
			Book book = (Book) iter.next();
			if (book.getWriter().size() != 3)
				fail("Found a book which has less than three authors");
		}
	}
	

在编写测试用例时,JUnit 4.0不再强制要求我们遵守方法的命名规则。相反,只要用@Test标注过的方法,就是测试方法。另外,在测试执行之前,我们首先需要生成一个测试用的模型,这可以通过下面的代码来完成:


代码 6 生成测试用Library模型
	
	@Before
	public void setUp() throws Exception {
		lp = LibraryPackage.eINSTANCE;
		lf = LibraryFactory.eINSTANCE;

		library = lf.createLibrary();
		writer = lf.createWriter();
		writer.setName("James Gan");

		Writer writer1 = lf.createWriter();
		writer1.setName("Ping Hao");
		library.getWriters().add(writer1);

		Writer writer2 = lf.createWriter();
		writer2.setName("Qiu Qiu");
		library.getWriters().add(writer2);

		Book book = lf.createBook();
		book.setTitle("How to Query with EMF Query");
		book.setPages(1000);
		book.getWriter().add(writer);
		library.getBooks().add(book);

		Book book1 = lf.createBook();
		book1.setTitle("How to play basketball");
		book1.setPages(1000);
		book1.getWriter().add(writer);
		book1.getWriter().add(writer1);
		book1.getWriter().add(writer2);
		library.getBooks().add(book1);

		library.getWriters().add(writer);

		query = new QueryLibrary();
	}
	

和@Test一样,@Before也是JUnit中的Anotation类,它表示被标注的方法将会在测试方法之前执行,用于进行测试场景的设置等工作。最后,我们运行JUnit进行测试,可以获得如所图 6示结果,所有方法均通过测试。


图 6 查看测试结果
图 6  查看测试结果




回页首


5 结论

本文通过一个简单的例子介绍了使用EMF Query进行模型查询的基本过程。EMF Query是EMF Technology项目的一个重要的子项目。除了本文介绍的Query组件之外,EMF Technology还包含了其他一些有趣的主题,例如OCL,Teneo,Transaction,Validation和Net4J等。对模型驱动开发感兴趣的朋友不妨访问http://www.eclipse.org/emft 已获得更进一步的信息。

三运放仪表放大器电路设计全解析:从原理到PCB布局避坑指南 本文深度解析三运放仪表放大器电路设计,从差分放大器原理演进到经典三运放架构,详细阐述了其高共模抑制比(CMRR)和高输入阻抗的核心优势。文章重点剖析了电阻匹配、PCB布局对称性等关键设计要点对性能的影响,并提供了基于LTspice的仿真分析与从原理图到PCB布局、焊接调试的全流程实战避坑指南,助力实现高精度信号调理。 阅读详情

相关推荐

Origin2018(汉化版)在使用科学计数法的时候如何将坐标刻度的0.0改成0

文章目录1 问题2 解决方法 1 问题 先看下面这张图,当我使用科学计数法时,纵坐标出现了0.0的字样,这样看起来很不美观。有些期刊还会有要求,不能出现0.0的格式。 图1 那么该怎么将它改成0呢?首先让我们尝试着用Origin自带的属性,看看能不能设置。 2 解决方法 解决方法一: step1: 双击坐标轴,打开坐标轴属性设置。 step2: 在刻度线标签选项中设置左轴的显示 图2 会发现,按照图2的方式改好之后,其它的小数位也全没了,如果但是有些数字就被覆盖了,这显然不是我

qq_40077565的博客 2万+

使用EMF建立模型并生成Java代码

接上文:http://blog.youkuaiyun.com/qinjienj/article/details/6851112   EMF实际上定义了2种meta model,分别称为Ecore和Genmodel。Ecore包含了模型的定义,我们在创建EMF模型的时候,也是通过新建和编辑Ecore文件来进行。Genmodel包含了自动生成Java代码(模型的POJO类)的信息,比如怎样生成POJO,生成的...

广告业的程序员 626

用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异

本文通过Python 3D可视化技术,详细解析了硅晶体生长中<100>、<110>、<111>三种关键晶向的差异及其在半导体工业中的应用。从密勒指数转换到原子密度计算,结合交互式3D模型展示不同晶向的原子排列特性,帮助读者深入理解晶向对芯片性能的影响。

weixin_42567752的博客 568

Eclipse Modeling Framework, 2nd Edition. (EMF)学习笔记(一)——EMF介绍

EMF介绍 统一JavaXML和UML 建模vs编程 定义模型 Ecore元模型 创建和编辑模型 XMI序列化 Java注释 Ecore蓝图EMF介绍 为了理解EMF究竟是什么,你只需要知道一件事:“模型”(model)是什么?“模型”的目的是什么? EMF不要求全新的方法论亦或是任何复杂的建模工具。只需要从Eclipse的Java开发工具着手开始。 EMF将建模概念直接与其实现相关联,所以上手比较

司马如若搬砖处 4548

超详细!动态规划详解分析(典型例题分析和对比,附源码)

为啥要使用动态规划?什么时候使用动态规划?以下是我的一些理解和心得,如果你感兴趣,就接着往下看吧。 对您有帮助的话记得给我点个赞哟! 动态规划的基本思想 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中 得到原有问题的解。与分治法不同的是,动态规划经分解后得到的子问题

qq_44398094的博客 8万+

Hermes Dashboard Web 端部署完整说明

通过反向代理(nginx)使用公网域名访问时,会遇到 Host 头校验、CORS 跨域、WebSocket 连接拒绝三个核心问题。本文档记录了完整的源码修改方案和部署步骤。确保 nginx 主配置加载了 WebSocket map(宝塔默认为。路径的公开访问(无需登录),其他路径仍受 Cookie 认证保护。Hermes Dashboard 默认绑定。访问站点时会先弹出浏览器密码框,输入用户。在 nginx 反向代理配置中的。环境变量动态读取允许的域名。nginx 配置中已添加。

大白菜代码的博客 804

EMF总述

1.   EMF解释EMF全称Eclipse Model Framework,顾名思义,就是用来建模的。这里我们可以用一些类比的概念来进行理解。从操作系统的角度,我们写了一个程序,但是程序在操作系统中运行时就是一个进程,所以程序和进程就是静态和动态的概念;又如在面向对象编程中,我们写的是类,在系统运行的时候,我们操作的是对象,所以,类和对象就是静态和动态的概念。同样,在使用UML进行建模的时候,我

技术源于生活 2842

完美解决LBP2900打印机安装驱动提示无法识别USB及连接错误等问题(附Win11全新安装支持及卸载方案)

LBP2900打印机虽然经典老旧,但在Win11上依然可以完美使用!许多网上教程都无视安装失败后的问题,在此分享一种全新、100%有效的方法来解决驱动连接错误和无法识别USB设备的问题。无论是新安装还是卸载重装,这个方法都适用。本文整合了通用驱动包,支持Win2000到Win11系统,操作简单,轻松摆脱安装困扰,享受无忧打印体验!

心开始の未来~的博客 2万+

EMF学习笔记4——Query查询

<br />EMF查询框架主要由 org.eclipse.emf.query 这个plugin提供,创建并执行一个EMF查询,大概分为如下几步:<br />1,创建查询数据源;<br />2,构造EObjectCondition查询条件;<br />3,使用EMF查询框架提供的S

JavaMan_chen的专栏 2249

Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR

本篇文章我们将深入了解 Java 语言中的类与对象,探讨构造器、`static`、`final`、包和 JAR 文件。这些概念是面向对象编程的核心,对于理解和掌握 Java 至关重要。

栗筝i的博客 5035

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

emf java_使用EMF进行元建模:生成具体的可重用Java代码段

EMF是Eclipse平台的组成部分,也是相关技术和框架的基石,例如Eclipse Visual Editor,SDO,XSD和UML,其中许多已集成到IBM平台中,例如Rational®Application Developer和WebSphere。 ®业务建模器。 今天,EMF已经成长为包含Java技术功能,例如枚举类型,注释和泛型。 如果你是新的EMF,请参阅相关主题的文章,将帮助您开始...

cuxiong8996的博客 1506

【传感器模块项目实战】机器人/无人驾驶常用传感器模型、选型与安装

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!无人车&无人机导航合集本文先对机器人/无人驾驶常用传感器模型、选型与安装做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容分为位置式绝对型编码器增量式编码器打比赛的时候用过欧姆龙的增量式编码器,也用过待编码器的步进电机。【防盗标记–盒子君hzj】增量式编码器正交编码输出信号,用于识别正转和反转,通过微控制器(单片机)的片内外设硬件/软件解码(1)惯性器件-机械陀螺。

qq_35635374的博客 448

围绕EMF探索(2)之再探查询组件

索引:围绕EMF探索(1)之存储和查询   围绕EMF探索(2)之再探查询组件        本篇专门讲讲EMF Query这个组件的设计原理、结构和算法。       在上一篇中,已经简单介绍了EMF Query,其是为“内存中的eObjects”的检索提供一套“查询条件”,可以依据eObject的结构关系进行查询,也可以依据eObject的对象进行查询。       

游弋在移动互联网的银狐999 3613

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

围绕EMF探索(1)之存储和查询

围绕EMF探索(1)之存储       EMF(Eclipse Modeling Framework)的应用会越来越多,而围绕EMF的query, validate, transaction, persistency等等讲逐渐被大家使用,以及EMF eCore也有非常大的参考价值。今天先讲讲EMF的存储与查询方面的内容。首先讲讲EMF对象的存储       这两天抽空玩了玩EMF的对象存储

游弋在移动互联网的银狐999 5639

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

围绕EMF探索(3)之初探OCL

 前索引:围绕EMF探索(1)之存储和查询 前索引:围绕EMF探索(2)之再探查询组件围绕EMF探索(3)之初探OCL       围绕EMF模型,有个很重要的基础性组件叫EMF OCL,这是一个实现了OCL2.0标准的组件,提供了对OCL Expression的解析、校验。OCL全称是Object Constraint Language。        对OCL之前接触不是很多。两年

游弋在移动互联网的银狐999 4193

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

EMF基础知识培训及ppt下载

今天给Team的同仁简单培训了一些EMF的基本知识。主要内容包括 MDA Concept,EMF Concept,EMF Model Definition,EMF Components,EMF Ecore,EMF Generation,EMF Runtime Framework,EMF Tools:Persistence,Query,OCL,Validate,Transaction 。对于EM

.NET博文收藏 383

jpa原生query_JPA使用原生SQL查询

一、Spring3.1之前版本的方法import org.springframework.context.ApplicationContext;import org.springframework.orm.jpa.support.JpaDaoSupport;import java.util.*;import javax.persistence.*;public class CustomerCour...

weixin_39603823的博客 228

注意力机制的几何本质:从QKV到EMF的范式重构

注意力机制本质上是一种在高维嵌入空间中建模token间相关性与内容映射的数学结构。其核心原理并非固定于QKV三重投影,而是可抽象为一个判别算子(决定‘谁相关’)与一个编码算子(决定‘看到什么’)的协同作用。这种几何化视角显著提升模型可解释性与调试效率,支撑轻量化设计、长序列优化及跨任务迁移等关键技术价值。在NLP基础模型、大语言模型微调、医疗/金融等高可信度场景中,显式建模注意力的零空间、值域与奇异值谱,已成为突破性能瓶颈与增强事实一致性的新路径。本文深入解析EMF(One Space, Two Opera

leonard61306500的专栏 458
上一篇: 使用 Eclipse Modeling Framework 进行建模,第 3 部分
下一篇: 应用 RSA 实现 EMF 的开发
CS_Mercy
博客等级 码龄18年 12粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值