• EMF学习,为了实现可扩展可自定义的模型验证


    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构造

    1. EObjectCondition tolerableRead = new BooleanOCLCondition<EClassifier, EClass, EObject>(  
    2.     ocl.getEnvironment(),//ocl根环境  
    3.     "self.category <> BookCategory::Mystery implies self.pages < 200",//ocl约束  
    4.     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();

    1. IQueryResult result = new SELECT(//查询结果封装成IQueryResult对象  
    2.         new FROM(searchScope),  
    3.         new WHERE(conditions))  
    4.     .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的实例开发

  • 相关阅读:
    Pycharm在线/手动离线安装第三方库-以scapy为例(本地离线添加已经安装的第三方库通过添加Path实现)
    python+splinter实现12306网站刷票并自动购票流程
    利用RELK进行日志收集
    web安全之文件上传漏洞攻击与防范方法
    C# 使用 CancellationTokenSource 终止线程
    ASP.NET MVC 下拉框的传值的两种方式
    SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0
    C# .net中json字符串和对象之间的转化方法
    asp.net 未能加载文件或程序集“WebApi”或它的某一个依赖项。试图加载格式不正确的程序。
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/fireflyupup/p/4860507.html
Copyright © 2020-2023  润新知