Eclipse OCL 开发

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JavaMan_chen/article/details/6017948

OCL解析器提供了两个类用于解析ocl表达式,分别是OCLHelper和OCL:
OCLHelper接口的设计直接用于解析表达式,而OCL则作为解析的切入点。

OCL的解析首先要为其创建一个环境,如:是基于UML模型的还是基于ECore模型的。
可通过在构造函数中指定相应的EnvironmentFactory来实现,如:
OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl;
ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE);//ECore环境

在OCL类中声明了两个方法getEnvironment()和getEvaluationEnvironment()分别用于获取模型的根环境和评估环境,这两个环境是由EnvironmentFactory接口创建的。
在根环境中可以嵌套一些子环境用于定义package的命名空间,以此获取package的上下文,先看一段简单的OCL描述:

在OCL描述中,是通过上下文(context)的组织来体现层级结构的,如:
由package可以遍历到classifer的上下文;
由classifer可以遍历到方法或属性的上下文;
通过这种层级结构,由package上下文可以遍历到任何模型元件。
因此,Environment接口中的各种lookup方法主要是通过package context来进行相关的查找操作。

实例化OCL对象以后,可以通过createOCLHelper()方法来获取OCLHelper对象。
OCLHelper对象声明了大量方法用于创建OCL查询、约束。
不同的约束条件需要不同的上下文环境,setContext(),setOperationContext()和setAttributeContext()分别表示了该约束是针对classifer,operation还是attribute的。

如上:createInvariant方法会解析约束表达式,createQuery方法会解析查询表达式,两个方法分别返回Constraint对象和OCLExpression对象。
有了查询和约束对象以后,可以使用Query对象对其评估。

Query API提供了实用的方法,可以简写for循环:
for (Library next : constraintEval.select(libraries)) {
    @SuppressWarnings("unchecked")
    Set<BookCategory> categories = (Set<BookCategory>) queryEval.evaluate(next);
    System.out.printf("%s: %s%n", next.getName(), categories);
}

现实应用中,经常将模型定义和模型约束写入不同的资源文件中以便于模型的管理。
OCL提供了相应的方法来解析约束文件,通过构造OCLInput对象。

constraints.ocl文档内容如下:

通过上面的解析,将约束条件以Map形式存储起来,可通过约束的名字得到约束对象,如:
ocl.check(book, constraintMap.get("unique_title"));//对book对象进行title唯一的约束校验。

展开阅读全文

没有更多推荐了,返回首页