当前位置: 首页 > news >正文

围绕EMF探索(5)之深入Validation框架

前索引: 围绕EMF探索(1)之存储和查询
前索引: 围绕EMF探索(2)之再探查询组件
前索引: 围绕EMF探索(3)之初探OCL
前索引: 围绕EMF探索(4)之Validation组件图

围绕EMF探索(5)之深入Validation框架

在EMF的eCore框架中,本身提供了对Validation Framework的支持,而EMFT的Validation组件则是在这个基础上又扩展的大量的功能。如果大家采用Validator Adaptor方式,可能会更加体会到对Evalidator的应用。
但是由于EValidator是在注册过程中,是依据EPackage来匹配的,针对一个ePackage一般只能注册一个Evalidator对象。这就限制的应用的扩展性。
EValidator.Registry.INSTANCE.put(
LibraryPackage.eINSTANCE, new LibraryValidator());
而EMFT的Validation Framework则在这个基础之上进行了扩展,但是Validation Framework没有在EObjectValidator的基础上进行扩展,而是另辟蹊径,构造了自己的一套实现构架,甚至完全抛弃了EMF eCore所提供的DiagnosticChain机制,而是采用eclipse runtime IStatus对象来记录校验的结果。
为了便于理解,绘制了一张EMFT Validation Framework的主要构思图:
整个EMFT Validation Framework的核心就是两个概念:IValidator和Constraint。其中IValidator是有别于EMF eCore的EValidator。IValidator是一个验证执行器,为了支持对Batch和Live两种模式的支持,所以有不同的接口和实现类。Batch模式就是可以对批量对象进行验证,而Live模式则可以在对象值变更的时候相应验证。
IValidator执行器会从Validation Service模块中获取所匹配的Constraint进行验证,当然,为了优化和便于管理,Validation Framework还提供了对Context、Binding、ProviderOperation等方面的支持。不论如何,最终的解决目的就是为了找出合适的Constraint进行验证。
有关Constraint的代码,几乎占据了Validation Framework代码量的大部分,其实解决的目的就是为了可以方面的支持多种Constraint Model,目前支持三种方式:Java Code,EMF Model,以及OCL。
在Validation Framework构架中,真正用于constraint validate是ImodelConstraint接口,不同的Constraint Model类型下会有不同的实现。
因为Validation Framework这套构架依赖于在plugin.xml中公国描述和申明来注册相应的constrain实现,所以需要不同的Parser负责解析和管理。看看下面的类图,应该就比较清晰了。
当然,在我们使用Validation Framework这套框架的过程中,是不会接触到 这些parser的,甚至根本不知道IModelConstraint的存在。
比如,针对java模式,一般我们会继承一个AbstractModelConstraint类来实现。如下图所示:
事实上,这是一个很简单的Adapter模式的应用,具体就没有必要细说了,类图已经很清晰的反映了一切。

相关文章:

  • 2018 年 5 月 1 日西安 1374 架无人机编队表演出现失误的原因是什么?
  • GNSS原理及技术(三)——差分定位技术
  • DBC文件
  • C语言切割多层字符串(strtok_r strtok使用方法)
  • 如何组织论文
  • QT使用MySQL报错:QSqlDatabase: QMYSQL driver not loaded
  • Qt 的Sqlite 在成功打开后报错
  • 项目开发中源代码树的组织
  • qt 在sqlite inster 数据时候报错
  • 制作一颗菜单树
  • 关于数据库主键和外键(终于弄懂啦)
  • Registered a new domain named ferrymanfractal.com
  • sqlite建表语句(特别是外键问题)
  • Script Panel
  • SQLITE数据表主键设置Id自增方法
  • 深入了解以太坊
  • ➹使用webpack配置多页面应用(MPA)
  • CSS 专业技巧
  • fetch 从初识到应用
  • JavaScript中的对象个人分享
  • Java-详解HashMap
  • LeetCode算法系列_0891_子序列宽度之和
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python打包系统简单入门
  • Spring Cloud中负载均衡器概览
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 对超线程几个不同角度的解释
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 构造函数(constructor)与原型链(prototype)关系
  • 解决iview多表头动态更改列元素发生的错误
  • 悄悄地说一个bug
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 入手阿里云新服务器的部署NODE
  • 实现菜单下拉伸展折叠效果demo
  • 用Python写一份独特的元宵节祝福
  • 鱼骨图 - 如何绘制?
  • 智能网联汽车信息安全
  • Java总结 - String - 这篇请使劲喷我
  • NLPIR智能语义技术让大数据挖掘更简单
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • !!Dom4j 学习笔记
  • # Java NIO(一)FileChannel
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (5)STL算法之复制
  • (poj1.3.2)1791(构造法模拟)
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (转)原始图像数据和PDF中的图像数据
  • *上位机的定义
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?