必知的技术知识:EMF学习,为了实现可扩展可自定义的模型验证

简介: 必知的技术知识:EMF学习,为了实现可扩展可自定义的模型验证

//这里的验证强调的是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


//代码效果参考:http://www.lyjsj.net.cn/wz/art_24173.html

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(


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 //代码效果参考:http://www.lyjsj.net.cn/wz/art_24171.html

framework能够给定一个root然后进行遍历, 但是在这里,需要自己去找所有的对象集合。

7.在执行约束是就需要能够识别对应的元模型类别,即在编译时已经有所有的元模型类通过编译,而元模型类的导入只能在运行时执行,所以这里需要反射机制?


遍历,构造集合,交给对应的条件的isSatisfied


进一步的OCL开发


下一步:OCL的实例开发

相关文章
|
Ubuntu
百度搜索:蓝易云【Ubuntu删除多余内核教程】
现在,你已经成功地删除了Ubuntu系统中多余的旧内核。请谨慎删除内核,确保保留当前正在使用的稳定内核以及至少一个备用内核,以防止出现意外问题。
464 2
|
存储 自然语言处理 数据可视化
【软考学习8】操作系统概述、进程状态转变原理、前趋图
【软考学习8】操作系统概述、进程状态转变原理、前趋图
583 0
【软考学习8】操作系统概述、进程状态转变原理、前趋图
|
关系型数据库 MySQL PostgreSQL
MySQL和PostgreSQL的常用语法差异
背景 在去年的DBMS评比中,PostgreSQL夺冠,PostgreSQL一直保持上升姿态,越来越多的客户选择使用PostgreSQL,还有一部分客户从MySQL迁往PostgreSQL,那PostgreSQL和MySQL对于开发者来说的差异在哪里呢?末学对比了下语法差异,不一样的地方用红色标记了出来,供大家参考。
14380 0
|
8月前
|
SQL 存储 缓存
顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
顺丰科技引入 Doris 替换 Presto,在内部可视化数据自助分析工具丰景台场景广泛应用。目前,顺丰临时查询业务、丰景台报表业务的 Presto 场景已经 100% 切换到 Doris 集群中,日均查询量 100W+。并实现 P95 性能提升近 3 倍,硬件资源节省达 48% 显著收益。
270 9
顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
|
9月前
|
存储 Linux API
Proxmox VE 8.4 发布 - 开源虚拟化管理平台
Proxmox VE 8.4 发布 - 开源虚拟化管理平台
837 5
Proxmox VE 8.4 发布 - 开源虚拟化管理平台
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
DAPO: 面向开源大语言模型的解耦裁剪与动态采样策略优化系统
DAPO(Decoupled Clip and Dynamic Sampling Policy Optimization)是由字节跳动提出的一种突破性的开源大语言模型强化学习系统。基于Qwen2.5-32B基础模型,DAPO在AIME 2024测试中以50分的优异成绩超越了现有最佳模型,
1046 6
DAPO: 面向开源大语言模型的解耦裁剪与动态采样策略优化系统
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
420 1
|
监控 NoSQL 中间件
中间件常见问题
【7月更文挑战第12天】
440 12
|
机器学习/深度学习 自然语言处理 语音技术
FunAudioLLM 技术测评报告
FunAudioLLM 技术测评报告
|
NoSQL 前端开发 Java
redis的发布/订阅(命令、普通工程、springboot实现)
小美老师给五年级三班上数学课的时候,实现给所在班级进行实时推送数学课程的活动(广播通信)