EMF学习,为了实现可扩展可自定义的模型验证 - emf quary 与 OCL
http://blog.csdn.net/javaman_chen/article/details/6020050
//这里的验证强调的是condition的构造,基于查找来判断验证结果。支持OCL也支持java自己编写。
quary的基本逻辑是:编写约束条件,执行语句条件的查询,根据查询结果判断验证结果。
OCL的实现本身也依赖于Quary
Quary依赖于条件,条件集成自java的条件,基本的验证逻辑是:构造条件,根据isSatisfied(object)函数执行判断是否满足。
emf的验证可以采用上述的方式,可以采用较为复杂的形式,即通过select语句执行验证。
EMF查询框架主要由 org.eclipse.emf.query 这个plugin提供,创建并执行一个EMF查询,大概分为如下几步:
1. 创建查询数据源;
2. 构造EObjectCondition查询条件;
(1)用java构造
(a)继承EObjectCondition,实现isSatistied函数来编写自己的约束。
private static class ProductsLessThan3Condition extends EObjectCondition {
public ProductsLessThan3Condition() {
super(PruneHandler.NEVER);
}
@Override
public boolean isSatisfied(EObject eObject) {
if (eObject instanceof Category) {
Category category = (Category) eObject;
EList products = category.getProducts();
if (products.size() < 3)
return true;
}
return false;
}
}
(b)利用框架已提供的条件
EObjectCondition inShopCondition = new IN(categorySet);

(2)用OCL构造
- EObjectCondition tolerableRead = new BooleanOCLCondition<EClassifier, EClass, EObject>(
- ocl.getEnvironment(),//ocl根环境
- "self.category <> BookCategory::Mystery implies self.pages < 200",//ocl约束
- EXTLibraryPackage.Literals.BOOK);//约束上下文
构造参数中,还可以不指定约束的上下文(即第3个构造参数为null),这样任何EMF实体如果含有category属性都会在该实体类上执行
"self.category <> BookCategory::Mystery implies self.pages < 200"约束检测。
3. 使用EMF查询框架提供的SELECT对象和UPDATE对象编写查询和更新语句;
statement = new SELECT(new FROM(shop), new WHERE(new ProductsLessThan3Condition()));
4. 执行语句得到查询或更新结果;
results = statement.execute();
- IQueryResult result = new SELECT(//查询结果封装成IQueryResult对象
- new FROM(searchScope),
- new WHERE(conditions))
- .execute();
5. 对执行结果进行检测,确保执行过程中没有发生异常。
for(Object object : results)
{
System.out.println(object);
}
EMF提供了两套Query对象,SELECT和UPDATE,分别用于模型的查询操作和更新操作。
评估:
1.OCL语句可以灵活插入,主体语句放在第二个参数,约束上下文的定义放在第三个参数。因此比较符合可扩展验证的特性。
2.emf的验证如果采用OCL可以不采用select执行的方式,而是擦用condition自带的isSatisfied的方法。找一下OCL有没有?
3.OCL条件的开发需要再学习一下。
4.可以通过模型遍历,然后判断类型,之后分配给对应的satisfied,这个比较适合,需要查看一下输入的模型类型
5.看例子中需要自己构造集合,集合需要什么类型的,如何进行遍历。。。。
6.validation framework能够给定一个root然后进行遍历, 但是在这里,需要自己去找所有的对象集合。
7.在执行约束是就需要能够识别对应的元模型类别,即在编译时已经有所有的元模型类通过编译,而元模型类的导入只能在运行时执行,所以这里需要反射机制?
遍历,构造集合,交给对应的条件的isSatisfied
进一步的OCL开发
http://blog.csdn.net/javaman_chen/article/details/6017948
下一步:OCL的实例开发
EMF学习,为了实现可扩展可自定义的模型验证 - emf quary 与 OCL的更多相关文章
- EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习
自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
- 【转发】NPAPI学习(Firefox和Chrome扩展开发 )
NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...
- Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮
上次介绍了 Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示 现在开始介绍如何配置审批流,首先在form上添加三个按钮,Submit, Agree, Reject: 1. ...
- Dynamic CRM 2013学习笔记(三十七)自定义审批流7 - 初始化(整套审批流下载、安装)
前面介绍了自定义审批流的配置.使用,这篇介绍下如何进行初始化. 一. 下载 从下面的地址下载整个审批流: http://yunpan.cn/cZ5Rdx5HCt3VF 下载完后,一共有三块内容: 二. ...
- C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色
在利用C#开发Winform应用程序的时候,我们有可能使用RichTextBox来实现实时显示应用程序日志的功能,日志又分为:一般消息,警告提示 和错误等类别.为了更好地区分不同类型的日志,我们需要使 ...
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置
Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...
随机推荐
- 帝国CMS视频
http://list.youku.com/albumlist/show?id=17602333&ascending=1.html
- DB2表的重组
DB2在存储大数据的时候,遇到一个问题,将数据导入表中保存不了,最后是重组后才解决. 下面是从IBM官网上搜集的资料: 官网地址:http://publib.boulder.ibm.com/infoc ...
- 基于python的文件处理
二.文件操作方法大全 1.os.mknod("test.txt") 创建空文件2.fp = open("test.txt",w) 直接打开一个文件,如果文件不存 ...
- Python基础四
1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元组,比如身 ...
- ecshop常用二次开发修改
修改ecshop支付宝的支付按钮 http://www.68ecshop.com/article-1081.html 去掉ecshop收货人信息页面的电子邮件必填和电话.手机选填一个 http:/ ...
- Cannot find `aapt.exe`. Please install the Android SDK Build-tools package
Google has updated their SDK tools ("Android SDK Tools" Rev. 23) in a way that also requir ...
- web应用 http 响应 url uri
动态web 应用结构 WEB-INF --classes --lib web.xml 响应: url uri
- 各大安卓应用市场APP上传提交与收录
360 提交网址 应用宝 提交网址 百度 提交网址 91 提交网址 安卓 提交网址 PP助手 提交网址 小米 提交网址 华为 提交网址 OPPO 提交网址 魅族 提交网址 乐视 提交网址 豌豆荚 提交 ...
- 两个已排序数组进行合并后的第K大的值--进军硅谷
我看到此题时,首先想到一个一个比较遍历过去,这是最暴力的方法,后面我想到了已经排序,那么对每个数组进行二分,然后比较这两个值.此书第三种解法,挺不错,只对那个长度较小的数组进行二分查找,保证i+j-1 ...
- Java基础学习(一)
常见的dos命令 盘符: 进入指定的盘符下. dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录 注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd ...