使用 Ecore 分类器的 OCL 约束 - 未知类型异常



我正在使用OCLinEcore编辑器开发一个Ecore模型,其中包含OCL中定义的一些不变量。在我的模型中,一些元素引用了 EClassifier;在某些 OCL 约束中,我需要检查所引用的 EClassifier 是 EDataType 还是 EClass。在OCLinEcore中,这是一个类似于我拥有的模型:

import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';
package Foo : foo = 'some_namespace'
{
  class EndPoint
  {
    attribute name : String[1];
    property type : ecore::EClassifier[1];
  }
  class Coupling
  {
    invariant Compatibility:
      (destination.type.oclIsKindOf(ecore::EDataType) and source.type = destination.type) or
      let destinationClass : ecore::EClass = destination.type.oclAsType(ecore::EClass) in
      destinationClass.isSuperTypeOf(source.type.oclAsType(ecore::EClass));
    property source : EndPoint[1];
    property destination : EndPoint[1];
  }
}

但是,当我尝试验证模型的动态实例时,出现异常,并显示以下消息:

委派评估时发生异常 "耦合"的"兼容性"约束:未知类型([ecore, EDataType])

当我在 OCL 交互式控制台中尝试表达式时,我获得了正确的结果。我在定义不变量时做错了什么吗?如何编写使用 Ecore 类型的不变量?

Edward Willink 在 OCL 论坛上给了我一个解释和解决方法:

裸OCL不支持将ecore绑定到有用的东西, 所以 oclAsType(ecore::EClass) 有一个未解析的引用,因为每个 ecxpression 是 ECore 文件中的一个独立代码片段。

因此,Juno版本增加了一个扩展,通过该扩展包 限定符可能是一个 URI,这样如果你看到上面序列化了它 可能是 oclAsType(_'http://www.eclipse.org/emf/2002/Ecore'::ecore::EClass).

Juno版本还增加了是否使用新的灵活性。 使用此扩展功能进行透视绑定。在 窗口->首选项->OCL 页面确保为 默认委托为 http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot。

相关内容

  • 没有找到相关文章

最新更新